From 68f3c7c6e66477d1e199634640ecc0df8dbcfb2c Mon Sep 17 00:00:00 2001 From: raopg Date: Mon, 29 Apr 2019 18:16:07 -0700 Subject: [PATCH] Added macOS virtualenv --- mongo_mac/bin/activate | 78 + mongo_mac/bin/activate.csh | 36 + mongo_mac/bin/activate.fish | 76 + mongo_mac/bin/activate_this.py | 34 + mongo_mac/bin/easy_install | 11 + mongo_mac/bin/easy_install-3.6 | 11 + mongo_mac/bin/pip | 11 + mongo_mac/bin/pip3 | 11 + mongo_mac/bin/pip3.6 | 11 + mongo_mac/bin/python | Bin 0 -> 3500936 bytes mongo_mac/bin/python-config | 78 + mongo_mac/bin/python3 | 1 + mongo_mac/bin/python3.6 | 1 + mongo_mac/bin/wheel | 11 + mongo_mac/include/python3.6m | 1 + mongo_mac/lib/python3.6/__future__.py | 1 + .../__pycache__/__future__.cpython-36.pyc | Bin 0 -> 4213 bytes .../__pycache__/_bootlocale.cpython-36.pyc | Bin 0 -> 1026 bytes .../_collections_abc.cpython-36.pyc | Bin 0 -> 28889 bytes .../__pycache__/_weakrefset.cpython-36.pyc | Bin 0 -> 7874 bytes .../python3.6/__pycache__/abc.cpython-36.pyc | Bin 0 -> 7534 bytes .../__pycache__/base64.cpython-36.pyc | Bin 0 -> 17181 bytes .../__pycache__/bisect.cpython-36.pyc | Bin 0 -> 2722 bytes .../__pycache__/codecs.cpython-36.pyc | Bin 0 -> 33946 bytes .../python3.6/__pycache__/copy.cpython-36.pyc | Bin 0 -> 7125 bytes .../__pycache__/copyreg.cpython-36.pyc | Bin 0 -> 4290 bytes .../python3.6/__pycache__/enum.cpython-36.pyc | Bin 0 -> 23457 bytes .../__pycache__/fnmatch.cpython-36.pyc | Bin 0 -> 2920 bytes .../__pycache__/functools.cpython-36.pyc | Bin 0 -> 23973 bytes .../__pycache__/genericpath.cpython-36.pyc | Bin 0 -> 3772 bytes .../__pycache__/hashlib.cpython-36.pyc | Bin 0 -> 6682 bytes .../__pycache__/heapq.cpython-36.pyc | Bin 0 -> 14338 bytes .../python3.6/__pycache__/hmac.cpython-36.pyc | Bin 0 -> 4882 bytes .../python3.6/__pycache__/imp.cpython-36.pyc | Bin 0 -> 9742 bytes .../python3.6/__pycache__/io.cpython-36.pyc | Bin 0 -> 3433 bytes .../__pycache__/keyword.cpython-36.pyc | Bin 0 -> 1811 bytes .../__pycache__/linecache.cpython-36.pyc | Bin 0 -> 3824 bytes .../__pycache__/locale.cpython-36.pyc | Bin 0 -> 33061 bytes .../__pycache__/ntpath.cpython-36.pyc | Bin 0 -> 13711 bytes .../__pycache__/operator.cpython-36.pyc | Bin 0 -> 13959 bytes .../python3.6/__pycache__/os.cpython-36.pyc | Bin 0 -> 29674 bytes .../__pycache__/posixpath.cpython-36.pyc | Bin 0 -> 10435 bytes .../__pycache__/random.cpython-36.pyc | Bin 0 -> 19288 bytes .../python3.6/__pycache__/re.cpython-36.pyc | Bin 0 -> 14104 bytes .../__pycache__/reprlib.cpython-36.pyc | Bin 0 -> 5446 bytes .../__pycache__/shutil.cpython-36.pyc | Bin 0 -> 30431 bytes .../python3.6/__pycache__/site.cpython-36.pyc | Bin 0 -> 20716 bytes .../__pycache__/sre_compile.cpython-36.pyc | Bin 0 -> 10324 bytes .../__pycache__/sre_constants.cpython-36.pyc | Bin 0 -> 6018 bytes .../__pycache__/sre_parse.cpython-36.pyc | Bin 0 -> 20404 bytes .../python3.6/__pycache__/stat.cpython-36.pyc | Bin 0 -> 3897 bytes .../__pycache__/struct.cpython-36.pyc | Bin 0 -> 358 bytes .../__pycache__/tarfile.cpython-36.pyc | Bin 0 -> 62631 bytes .../__pycache__/tempfile.cpython-36.pyc | Bin 0 -> 22177 bytes .../__pycache__/token.cpython-36.pyc | Bin 0 -> 3366 bytes .../__pycache__/tokenize.cpython-36.pyc | Bin 0 -> 18589 bytes .../__pycache__/types.cpython-36.pyc | Bin 0 -> 8247 bytes .../__pycache__/warnings.cpython-36.pyc | Bin 0 -> 13304 bytes .../__pycache__/weakref.cpython-36.pyc | Bin 0 -> 19189 bytes mongo_mac/lib/python3.6/_bootlocale.py | 1 + mongo_mac/lib/python3.6/_collections_abc.py | 1 + mongo_mac/lib/python3.6/_dummy_thread.py | 1 + mongo_mac/lib/python3.6/_weakrefset.py | 1 + mongo_mac/lib/python3.6/abc.py | 1 + mongo_mac/lib/python3.6/base64.py | 1 + mongo_mac/lib/python3.6/bisect.py | 1 + mongo_mac/lib/python3.6/codecs.py | 1 + mongo_mac/lib/python3.6/collections | 1 + mongo_mac/lib/python3.6/config-3.6m-darwin | 1 + mongo_mac/lib/python3.6/copy.py | 1 + mongo_mac/lib/python3.6/copyreg.py | 1 + mongo_mac/lib/python3.6/distutils/__init__.py | 101 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2855 bytes .../lib/python3.6/distutils/distutils.cfg | 6 + mongo_mac/lib/python3.6/encodings | 1 + mongo_mac/lib/python3.6/enum.py | 1 + mongo_mac/lib/python3.6/fnmatch.py | 1 + mongo_mac/lib/python3.6/functools.py | 1 + mongo_mac/lib/python3.6/genericpath.py | 1 + mongo_mac/lib/python3.6/hashlib.py | 1 + mongo_mac/lib/python3.6/heapq.py | 1 + mongo_mac/lib/python3.6/hmac.py | 1 + mongo_mac/lib/python3.6/imp.py | 1 + mongo_mac/lib/python3.6/importlib | 1 + mongo_mac/lib/python3.6/io.py | 1 + mongo_mac/lib/python3.6/keyword.py | 1 + mongo_mac/lib/python3.6/lib-dynload | 1 + mongo_mac/lib/python3.6/linecache.py | 1 + mongo_mac/lib/python3.6/locale.py | 1 + .../lib/python3.6/no-global-site-packages.txt | 0 mongo_mac/lib/python3.6/ntpath.py | 1 + mongo_mac/lib/python3.6/operator.py | 1 + mongo_mac/lib/python3.6/orig-prefix.txt | 1 + mongo_mac/lib/python3.6/os.py | 1 + mongo_mac/lib/python3.6/posixpath.py | 1 + mongo_mac/lib/python3.6/random.py | 1 + mongo_mac/lib/python3.6/re.py | 1 + mongo_mac/lib/python3.6/readline.so | 1 + mongo_mac/lib/python3.6/reprlib.py | 1 + mongo_mac/lib/python3.6/rlcompleter.py | 1 + mongo_mac/lib/python3.6/shutil.py | 1 + .../__pycache__/easy_install.cpython-36.pyc | Bin 0 -> 329 bytes .../python3.6/site-packages/bson/__init__.py | 1170 +++ .../bson/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 32829 bytes .../bson/__pycache__/binary.cpython-36.pyc | Bin 0 -> 5270 bytes .../bson/__pycache__/code.cpython-36.pyc | Bin 0 -> 2916 bytes .../__pycache__/codec_options.cpython-36.pyc | Bin 0 -> 11963 bytes .../bson/__pycache__/dbref.cpython-36.pyc | Bin 0 -> 4366 bytes .../__pycache__/decimal128.cpython-36.pyc | Bin 0 -> 9705 bytes .../bson/__pycache__/errors.cpython-36.pyc | Bin 0 -> 1312 bytes .../bson/__pycache__/int64.cpython-36.pyc | Bin 0 -> 812 bytes .../bson/__pycache__/json_util.cpython-36.pyc | Bin 0 -> 22976 bytes .../bson/__pycache__/max_key.cpython-36.pyc | Bin 0 -> 1557 bytes .../bson/__pycache__/min_key.cpython-36.pyc | Bin 0 -> 1557 bytes .../bson/__pycache__/objectid.cpython-36.pyc | Bin 0 -> 9117 bytes .../bson/__pycache__/py3compat.cpython-36.pyc | Bin 0 -> 2615 bytes .../bson/__pycache__/raw_bson.cpython-36.pyc | Bin 0 -> 4222 bytes .../bson/__pycache__/regex.cpython-36.pyc | Bin 0 -> 4070 bytes .../bson/__pycache__/son.cpython-36.pyc | Bin 0 -> 6373 bytes .../bson/__pycache__/timestamp.cpython-36.pyc | Bin 0 -> 3959 bytes .../bson/__pycache__/tz_util.cpython-36.pyc | Bin 0 -> 1511 bytes .../bson/_cbson.cpython-36m-darwin.so | Bin 0 -> 55768 bytes .../python3.6/site-packages/bson/binary.py | 242 + .../lib/python3.6/site-packages/bson/code.py | 99 + .../site-packages/bson/codec_options.py | 334 + .../lib/python3.6/site-packages/bson/dbref.py | 135 + .../site-packages/bson/decimal128.py | 335 + .../python3.6/site-packages/bson/errors.py | 40 + .../lib/python3.6/site-packages/bson/int64.py | 34 + .../python3.6/site-packages/bson/json_util.py | 829 ++ .../python3.6/site-packages/bson/max_key.py | 50 + .../python3.6/site-packages/bson/min_key.py | 50 + .../python3.6/site-packages/bson/objectid.py | 299 + .../python3.6/site-packages/bson/py3compat.py | 107 + .../python3.6/site-packages/bson/raw_bson.py | 124 + .../lib/python3.6/site-packages/bson/regex.py | 128 + .../lib/python3.6/site-packages/bson/son.py | 200 + .../python3.6/site-packages/bson/timestamp.py | 120 + .../python3.6/site-packages/bson/tz_util.py | 52 + .../python3.6/site-packages/easy_install.py | 5 + .../site-packages/gridfs/__init__.py | 930 ++ .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 34125 bytes .../gridfs/__pycache__/errors.cpython-36.pyc | Bin 0 -> 1106 bytes .../__pycache__/grid_file.cpython-36.pyc | Bin 0 -> 26498 bytes .../python3.6/site-packages/gridfs/errors.py | 33 + .../site-packages/gridfs/grid_file.py | 840 ++ .../pip-19.1.dist-info/INSTALLER | 1 + .../pip-19.1.dist-info/LICENSE.txt | 20 + .../site-packages/pip-19.1.dist-info/METADATA | 75 + .../site-packages/pip-19.1.dist-info/RECORD | 618 ++ .../site-packages/pip-19.1.dist-info/WHEEL | 6 + .../pip-19.1.dist-info/entry_points.txt | 5 + .../pip-19.1.dist-info/top_level.txt | 1 + .../python3.6/site-packages/pip/__init__.py | 1 + .../python3.6/site-packages/pip/__main__.py | 19 + .../pip/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 200 bytes .../pip/__pycache__/__main__.cpython-36.pyc | Bin 0 -> 454 bytes .../site-packages/pip/_internal/__init__.py | 78 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1846 bytes .../__pycache__/build_env.cpython-36.pyc | Bin 0 -> 7492 bytes .../__pycache__/cache.cpython-36.pyc | Bin 0 -> 7054 bytes .../__pycache__/configuration.cpython-36.pyc | Bin 0 -> 9758 bytes .../__pycache__/download.cpython-36.pyc | Bin 0 -> 20972 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 11746 bytes .../__pycache__/index.cpython-36.pyc | Bin 0 -> 28807 bytes .../__pycache__/locations.cpython-36.pyc | Bin 0 -> 4439 bytes .../__pycache__/pep425tags.cpython-36.pyc | Bin 0 -> 8338 bytes .../__pycache__/pyproject.cpython-36.pyc | Bin 0 -> 6474 bytes .../__pycache__/resolve.cpython-36.pyc | Bin 0 -> 9108 bytes .../__pycache__/wheel.cpython-36.pyc | Bin 0 -> 26119 bytes .../site-packages/pip/_internal/build_env.py | 215 + .../site-packages/pip/_internal/cache.py | 224 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 277 bytes .../__pycache__/autocompletion.cpython-36.pyc | Bin 0 -> 5119 bytes .../__pycache__/base_command.cpython-36.pyc | Bin 0 -> 7806 bytes .../cli/__pycache__/cmdoptions.cpython-36.pyc | Bin 0 -> 16863 bytes .../__pycache__/main_parser.cpython-36.pyc | Bin 0 -> 2365 bytes .../cli/__pycache__/parser.cpython-36.pyc | Bin 0 -> 8961 bytes .../__pycache__/status_codes.cpython-36.pyc | Bin 0 -> 406 bytes .../pip/_internal/cli/autocompletion.py | 152 + .../pip/_internal/cli/base_command.py | 340 + .../pip/_internal/cli/cmdoptions.py | 809 ++ .../pip/_internal/cli/main_parser.py | 104 + .../site-packages/pip/_internal/cli/parser.py | 261 + .../pip/_internal/cli/status_codes.py | 8 + .../pip/_internal/commands/__init__.py | 79 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2505 bytes .../commands/__pycache__/check.cpython-36.pyc | Bin 0 -> 1330 bytes .../__pycache__/completion.cpython-36.pyc | Bin 0 -> 3079 bytes .../__pycache__/configuration.cpython-36.pyc | Bin 0 -> 6927 bytes .../__pycache__/download.cpython-36.pyc | Bin 0 -> 4720 bytes .../__pycache__/freeze.cpython-36.pyc | Bin 0 -> 2867 bytes .../commands/__pycache__/hash.cpython-36.pyc | Bin 0 -> 2069 bytes .../commands/__pycache__/help.cpython-36.pyc | Bin 0 -> 1245 bytes .../__pycache__/install.cpython-36.pyc | Bin 0 -> 12904 bytes .../commands/__pycache__/list.cpython-36.pyc | Bin 0 -> 8746 bytes .../__pycache__/search.cpython-36.pyc | Bin 0 -> 4315 bytes .../commands/__pycache__/show.cpython-36.pyc | Bin 0 -> 5924 bytes .../__pycache__/uninstall.cpython-36.pyc | Bin 0 -> 2701 bytes .../commands/__pycache__/wheel.cpython-36.pyc | Bin 0 -> 5004 bytes .../pip/_internal/commands/check.py | 41 + .../pip/_internal/commands/completion.py | 94 + .../pip/_internal/commands/configuration.py | 253 + .../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 | 587 ++ .../pip/_internal/commands/list.py | 302 + .../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 | 384 + .../site-packages/pip/_internal/download.py | 979 ++ .../site-packages/pip/_internal/exceptions.py | 274 + .../site-packages/pip/_internal/index.py | 1105 +++ .../site-packages/pip/_internal/locations.py | 211 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 265 bytes .../__pycache__/candidate.cpython-36.pyc | Bin 0 -> 1298 bytes .../__pycache__/format_control.cpython-36.pyc | Bin 0 -> 2268 bytes .../models/__pycache__/index.cpython-36.pyc | Bin 0 -> 1169 bytes .../models/__pycache__/link.cpython-36.pyc | Bin 0 -> 4988 bytes .../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 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 201 bytes .../__pycache__/check.cpython-36.pyc | Bin 0 -> 3626 bytes .../__pycache__/freeze.cpython-36.pyc | Bin 0 -> 5673 bytes .../__pycache__/prepare.cpython-36.pyc | Bin 0 -> 10571 bytes .../pip/_internal/operations/check.py | 155 + .../pip/_internal/operations/freeze.py | 247 + .../pip/_internal/operations/prepare.py | 432 + .../site-packages/pip/_internal/pep425tags.py | 381 + .../site-packages/pip/_internal/pyproject.py | 282 + .../pip/_internal/req/__init__.py | 78 + .../req/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1702 bytes .../__pycache__/constructors.cpython-36.pyc | Bin 0 -> 7607 bytes .../req/__pycache__/req_file.cpython-36.pyc | Bin 0 -> 9245 bytes .../__pycache__/req_install.cpython-36.pyc | Bin 0 -> 25037 bytes .../req/__pycache__/req_set.cpython-36.pyc | Bin 0 -> 5683 bytes .../__pycache__/req_tracker.cpython-36.pyc | Bin 0 -> 3224 bytes .../__pycache__/req_uninstall.cpython-36.pyc | Bin 0 -> 17314 bytes .../pip/_internal/req/constructors.py | 340 + .../pip/_internal/req/req_file.py | 383 + .../pip/_internal/req/req_install.py | 1030 +++ .../pip/_internal/req/req_set.py | 193 + .../pip/_internal/req/req_tracker.py | 96 + .../pip/_internal/req/req_uninstall.py | 633 ++ .../site-packages/pip/_internal/resolve.py | 393 + .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 196 bytes .../utils/__pycache__/appdirs.cpython-36.pyc | Bin 0 -> 8037 bytes .../utils/__pycache__/compat.cpython-36.pyc | Bin 0 -> 6173 bytes .../__pycache__/deprecation.cpython-36.pyc | Bin 0 -> 2605 bytes .../utils/__pycache__/encoding.cpython-36.pyc | Bin 0 -> 1280 bytes .../__pycache__/filesystem.cpython-36.pyc | Bin 0 -> 665 bytes .../utils/__pycache__/glibc.cpython-36.pyc | Bin 0 -> 1689 bytes .../utils/__pycache__/hashes.cpython-36.pyc | Bin 0 -> 3603 bytes .../utils/__pycache__/logging.cpython-36.pyc | Bin 0 -> 9039 bytes .../utils/__pycache__/misc.cpython-36.pyc | Bin 0 -> 25091 bytes .../utils/__pycache__/models.cpython-36.pyc | Bin 0 -> 1945 bytes .../utils/__pycache__/outdated.cpython-36.pyc | Bin 0 -> 3981 bytes .../__pycache__/packaging.cpython-36.pyc | Bin 0 -> 2615 bytes .../setuptools_build.cpython-36.pyc | Bin 0 -> 391 bytes .../utils/__pycache__/temp_dir.cpython-36.pyc | Bin 0 -> 4918 bytes .../utils/__pycache__/typing.cpython-36.pyc | Bin 0 -> 1326 bytes .../utils/__pycache__/ui.cpython-36.pyc | Bin 0 -> 11777 bytes .../pip/_internal/utils/appdirs.py | 268 + .../pip/_internal/utils/compat.py | 264 + .../pip/_internal/utils/deprecation.py | 93 + .../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 | 371 + .../site-packages/pip/_internal/utils/misc.py | 1011 ++ .../pip/_internal/utils/models.py | 40 + .../pip/_internal/utils/outdated.py | 162 + .../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 + .../site-packages/pip/_internal/utils/ui.py | 424 + .../pip/_internal/vcs/__init__.py | 604 ++ .../vcs/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 17061 bytes .../vcs/__pycache__/bazaar.cpython-36.pyc | Bin 0 -> 3486 bytes .../vcs/__pycache__/git.cpython-36.pyc | Bin 0 -> 9121 bytes .../vcs/__pycache__/mercurial.cpython-36.pyc | Bin 0 -> 3719 bytes .../vcs/__pycache__/subversion.cpython-36.pyc | Bin 0 -> 6752 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 103 + .../site-packages/pip/_internal/vcs/git.py | 362 + .../pip/_internal/vcs/mercurial.py | 105 + .../pip/_internal/vcs/subversion.py | 234 + .../site-packages/pip/_internal/wheel.py | 1098 +++ .../site-packages/pip/_vendor/__init__.py | 109 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2863 bytes .../__pycache__/appdirs.cpython-36.pyc | Bin 0 -> 20663 bytes .../_vendor/__pycache__/distro.cpython-36.pyc | Bin 0 -> 36361 bytes .../__pycache__/ipaddress.cpython-36.pyc | Bin 0 -> 66571 bytes .../__pycache__/pyparsing.cpython-36.pyc | Bin 0 -> 222413 bytes .../__pycache__/retrying.cpython-36.pyc | Bin 0 -> 8096 bytes .../_vendor/__pycache__/six.cpython-36.pyc | Bin 0 -> 26514 bytes .../site-packages/pip/_vendor/appdirs.py | 604 ++ .../pip/_vendor/cachecontrol/__init__.py | 11 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 554 bytes .../__pycache__/_cmd.cpython-36.pyc | Bin 0 -> 1557 bytes .../__pycache__/adapter.cpython-36.pyc | Bin 0 -> 3045 bytes .../__pycache__/cache.cpython-36.pyc | Bin 0 -> 1770 bytes .../__pycache__/compat.cpython-36.pyc | Bin 0 -> 761 bytes .../__pycache__/controller.cpython-36.pyc | Bin 0 -> 7702 bytes .../__pycache__/filewrapper.cpython-36.pyc | Bin 0 -> 2158 bytes .../__pycache__/heuristics.cpython-36.pyc | Bin 0 -> 4688 bytes .../__pycache__/serialize.cpython-36.pyc | Bin 0 -> 4242 bytes .../__pycache__/wrapper.cpython-36.pyc | Bin 0 -> 662 bytes .../pip/_vendor/cachecontrol/_cmd.py | 57 + .../pip/_vendor/cachecontrol/adapter.py | 133 + .../pip/_vendor/cachecontrol/cache.py | 39 + .../_vendor/cachecontrol/caches/__init__.py | 2 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 298 bytes .../__pycache__/file_cache.cpython-36.pyc | Bin 0 -> 3232 bytes .../__pycache__/redis_cache.cpython-36.pyc | Bin 0 -> 1554 bytes .../_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 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 261 bytes .../__pycache__/__main__.cpython-36.pyc | Bin 0 -> 264 bytes .../certifi/__pycache__/core.cpython-36.pyc | Bin 0 -> 473 bytes .../pip/_vendor/certifi/cacert.pem | 4658 ++++++++++ .../site-packages/pip/_vendor/certifi/core.py | 15 + .../pip/_vendor/chardet/__init__.py | 39 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 848 bytes .../__pycache__/big5freq.cpython-36.pyc | Bin 0 -> 54735 bytes .../__pycache__/big5prober.cpython-36.pyc | Bin 0 -> 1124 bytes .../chardistribution.cpython-36.pyc | Bin 0 -> 6320 bytes .../charsetgroupprober.cpython-36.pyc | Bin 0 -> 2231 bytes .../__pycache__/charsetprober.cpython-36.pyc | Bin 0 -> 3457 bytes .../codingstatemachine.cpython-36.pyc | Bin 0 -> 2888 bytes .../chardet/__pycache__/compat.cpython-36.pyc | Bin 0 -> 364 bytes .../__pycache__/cp949prober.cpython-36.pyc | Bin 0 -> 1131 bytes .../chardet/__pycache__/enums.cpython-36.pyc | Bin 0 -> 2622 bytes .../__pycache__/escprober.cpython-36.pyc | Bin 0 -> 2613 bytes .../chardet/__pycache__/escsm.cpython-36.pyc | Bin 0 -> 7370 bytes .../__pycache__/eucjpprober.cpython-36.pyc | Bin 0 -> 2417 bytes .../__pycache__/euckrfreq.cpython-36.pyc | Bin 0 -> 24121 bytes .../__pycache__/euckrprober.cpython-36.pyc | Bin 0 -> 1132 bytes .../__pycache__/euctwfreq.cpython-36.pyc | Bin 0 -> 54744 bytes .../__pycache__/euctwprober.cpython-36.pyc | Bin 0 -> 1132 bytes .../__pycache__/gb2312freq.cpython-36.pyc | Bin 0 -> 38386 bytes .../__pycache__/gb2312prober.cpython-36.pyc | Bin 0 -> 1140 bytes .../__pycache__/hebrewprober.cpython-36.pyc | Bin 0 -> 2974 bytes .../__pycache__/jisfreq.cpython-36.pyc | Bin 0 -> 44530 bytes .../chardet/__pycache__/jpcntx.cpython-36.pyc | Bin 0 -> 38669 bytes .../langbulgarianmodel.cpython-36.pyc | Bin 0 -> 24884 bytes .../langcyrillicmodel.cpython-36.pyc | Bin 0 -> 30435 bytes .../__pycache__/langgreekmodel.cpython-36.pyc | Bin 0 -> 24562 bytes .../langhebrewmodel.cpython-36.pyc | Bin 0 -> 23416 bytes .../langhungarianmodel.cpython-36.pyc | Bin 0 -> 24858 bytes .../__pycache__/langthaimodel.cpython-36.pyc | Bin 0 -> 23395 bytes .../langturkishmodel.cpython-36.pyc | Bin 0 -> 23413 bytes .../__pycache__/latin1prober.cpython-36.pyc | Bin 0 -> 2945 bytes .../mbcharsetprober.cpython-36.pyc | Bin 0 -> 2236 bytes .../mbcsgroupprober.cpython-36.pyc | Bin 0 -> 1127 bytes .../chardet/__pycache__/mbcssm.cpython-36.pyc | Bin 0 -> 17580 bytes .../sbcharsetprober.cpython-36.pyc | Bin 0 -> 2989 bytes .../sbcsgroupprober.cpython-36.pyc | Bin 0 -> 1617 bytes .../__pycache__/sjisprober.cpython-36.pyc | Bin 0 -> 2443 bytes .../universaldetector.cpython-36.pyc | Bin 0 -> 5838 bytes .../__pycache__/utf8prober.cpython-36.pyc | Bin 0 -> 1974 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 443 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/cli/__init__.py | 1 + .../cli/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 200 bytes .../cli/__pycache__/chardetect.cpython-36.pyc | Bin 0 -> 2707 bytes .../pip/_vendor/chardet/cli/chardetect.py | 85 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/compat.py | 34 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 76 + .../pip/_vendor/chardet/escprober.py | 101 + .../pip/_vendor/chardet/escsm.py | 246 + .../pip/_vendor/chardet/eucjpprober.py | 92 + .../pip/_vendor/chardet/euckrfreq.py | 195 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 387 + .../pip/_vendor/chardet/euctwprober.py | 46 + .../pip/_vendor/chardet/gb2312freq.py | 283 + .../pip/_vendor/chardet/gb2312prober.py | 46 + .../pip/_vendor/chardet/hebrewprober.py | 292 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/jpcntx.py | 233 + .../pip/_vendor/chardet/langbulgarianmodel.py | 228 + .../pip/_vendor/chardet/langcyrillicmodel.py | 333 + .../pip/_vendor/chardet/langgreekmodel.py | 225 + .../pip/_vendor/chardet/langhebrewmodel.py | 200 + .../pip/_vendor/chardet/langhungarianmodel.py | 225 + .../pip/_vendor/chardet/langthaimodel.py | 199 + .../pip/_vendor/chardet/langturkishmodel.py | 193 + .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/mbcharsetprober.py | 91 + .../pip/_vendor/chardet/mbcsgroupprober.py | 54 + .../pip/_vendor/chardet/mbcssm.py | 572 ++ .../pip/_vendor/chardet/sbcharsetprober.py | 132 + .../pip/_vendor/chardet/sbcsgroupprober.py | 73 + .../pip/_vendor/chardet/sjisprober.py | 92 + .../pip/_vendor/chardet/universaldetector.py | 286 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 6 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 448 bytes .../colorama/__pycache__/ansi.cpython-36.pyc | Bin 0 -> 3346 bytes .../__pycache__/ansitowin32.cpython-36.pyc | Bin 0 -> 7621 bytes .../__pycache__/initialise.cpython-36.pyc | Bin 0 -> 1669 bytes .../colorama/__pycache__/win32.cpython-36.pyc | Bin 0 -> 3871 bytes .../__pycache__/winterm.cpython-36.pyc | Bin 0 -> 4609 bytes .../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 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1046 bytes .../distlib/__pycache__/compat.cpython-36.pyc | Bin 0 -> 32082 bytes .../__pycache__/database.cpython-36.pyc | Bin 0 -> 42649 bytes .../distlib/__pycache__/index.cpython-36.pyc | Bin 0 -> 17377 bytes .../__pycache__/locators.cpython-36.pyc | Bin 0 -> 38857 bytes .../__pycache__/manifest.cpython-36.pyc | Bin 0 -> 10365 bytes .../__pycache__/markers.cpython-36.pyc | Bin 0 -> 4484 bytes .../__pycache__/metadata.cpython-36.pyc | Bin 0 -> 27724 bytes .../__pycache__/resources.cpython-36.pyc | Bin 0 -> 10913 bytes .../__pycache__/scripts.cpython-36.pyc | Bin 0 -> 11100 bytes .../distlib/__pycache__/util.cpython-36.pyc | Bin 0 -> 48083 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 20692 bytes .../distlib/__pycache__/wheel.cpython-36.pyc | Bin 0 -> 25456 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 488 bytes .../_backport/__pycache__/misc.cpython-36.pyc | Bin 0 -> 1094 bytes .../__pycache__/shutil.cpython-36.pyc | Bin 0 -> 21441 bytes .../__pycache__/sysconfig.cpython-36.pyc | Bin 0 -> 16042 bytes .../__pycache__/tarfile.cpython-36.pyc | Bin 0 -> 63052 bytes .../pip/_vendor/distlib/_backport/misc.py | 41 + .../pip/_vendor/distlib/_backport/shutil.py | 761 ++ .../_vendor/distlib/_backport/sysconfig.cfg | 84 + .../_vendor/distlib/_backport/sysconfig.py | 788 ++ .../pip/_vendor/distlib/_backport/tarfile.py | 2607 ++++++ .../pip/_vendor/distlib/compat.py | 1120 +++ .../pip/_vendor/distlib/database.py | 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 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 92672 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 102400 bytes .../site-packages/pip/_vendor/distlib/util.py | 1756 ++++ .../pip/_vendor/distlib/version.py | 736 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 89088 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 99328 bytes .../pip/_vendor/distlib/wheel.py | 988 ++ .../site-packages/pip/_vendor/distro.py | 1216 +++ .../pip/_vendor/html5lib/__init__.py | 35 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1317 bytes .../__pycache__/_ihatexml.cpython-36.pyc | Bin 0 -> 13861 bytes .../__pycache__/_inputstream.cpython-36.pyc | Bin 0 -> 22729 bytes .../__pycache__/_tokenizer.cpython-36.pyc | Bin 0 -> 42165 bytes .../__pycache__/_utils.cpython-36.pyc | Bin 0 -> 3287 bytes .../__pycache__/constants.cpython-36.pyc | Bin 0 -> 66433 bytes .../__pycache__/html5parser.cpython-36.pyc | Bin 0 -> 99766 bytes .../__pycache__/serializer.cpython-36.pyc | Bin 0 -> 10935 bytes .../pip/_vendor/html5lib/_ihatexml.py | 288 + .../pip/_vendor/html5lib/_inputstream.py | 923 ++ .../pip/_vendor/html5lib/_tokenizer.py | 1721 ++++ .../pip/_vendor/html5lib/_trie/__init__.py | 14 + .../_trie/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 430 bytes .../_trie/__pycache__/_base.cpython-36.pyc | Bin 0 -> 1513 bytes .../_trie/__pycache__/datrie.cpython-36.pyc | Bin 0 -> 2032 bytes .../_trie/__pycache__/py.cpython-36.pyc | Bin 0 -> 2237 bytes .../pip/_vendor/html5lib/_trie/_base.py | 37 + .../pip/_vendor/html5lib/_trie/datrie.py | 44 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 124 + .../pip/_vendor/html5lib/constants.py | 2947 ++++++ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 205 bytes .../alphabeticalattributes.cpython-36.pyc | Bin 0 -> 1331 bytes .../filters/__pycache__/base.cpython-36.pyc | Bin 0 -> 855 bytes .../inject_meta_charset.cpython-36.pyc | Bin 0 -> 1902 bytes .../filters/__pycache__/lint.cpython-36.pyc | Bin 0 -> 2648 bytes .../__pycache__/optionaltags.cpython-36.pyc | Bin 0 -> 3109 bytes .../__pycache__/sanitizer.cpython-36.pyc | Bin 0 -> 19167 bytes .../__pycache__/whitespace.cpython-36.pyc | Bin 0 -> 1363 bytes .../filters/alphabeticalattributes.py | 29 + .../pip/_vendor/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../pip/_vendor/html5lib/filters/lint.py | 93 + .../_vendor/html5lib/filters/optionaltags.py | 207 + .../pip/_vendor/html5lib/filters/sanitizer.py | 896 ++ .../_vendor/html5lib/filters/whitespace.py | 38 + .../pip/_vendor/html5lib/html5parser.py | 2791 ++++++ .../pip/_vendor/html5lib/serializer.py | 409 + .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 944 bytes .../__pycache__/genshi.cpython-36.pyc | Bin 0 -> 1688 bytes .../__pycache__/sax.cpython-36.pyc | Bin 0 -> 1506 bytes .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 3325 bytes .../__pycache__/base.cpython-36.pyc | Bin 0 -> 11332 bytes .../__pycache__/dom.cpython-36.pyc | Bin 0 -> 9278 bytes .../__pycache__/etree.cpython-36.pyc | Bin 0 -> 11872 bytes .../__pycache__/etree_lxml.cpython-36.pyc | Bin 0 -> 11798 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../pip/_vendor/html5lib/treebuilders/dom.py | 236 + .../_vendor/html5lib/treebuilders/etree.py | 340 + .../html5lib/treebuilders/etree_lxml.py | 366 + .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 4012 bytes .../__pycache__/base.cpython-36.pyc | Bin 0 -> 7000 bytes .../__pycache__/dom.cpython-36.pyc | Bin 0 -> 1727 bytes .../__pycache__/etree.cpython-36.pyc | Bin 0 -> 3569 bytes .../__pycache__/etree_lxml.cpython-36.pyc | Bin 0 -> 6662 bytes .../__pycache__/genshi.cpython-36.pyc | Bin 0 -> 1901 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/etree.py | 130 + .../html5lib/treewalkers/etree_lxml.py | 213 + .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../pip/_vendor/idna/__init__.py | 2 + .../idna/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 262 bytes .../idna/__pycache__/codec.cpython-36.pyc | Bin 0 -> 3109 bytes .../idna/__pycache__/compat.cpython-36.pyc | Bin 0 -> 622 bytes .../idna/__pycache__/core.cpython-36.pyc | Bin 0 -> 9162 bytes .../idna/__pycache__/idnadata.cpython-36.pyc | Bin 0 -> 29801 bytes .../idna/__pycache__/intranges.cpython-36.pyc | Bin 0 -> 1823 bytes .../__pycache__/package_data.cpython-36.pyc | Bin 0 -> 216 bytes .../idna/__pycache__/uts46data.cpython-36.pyc | Bin 0 -> 241811 bytes .../site-packages/pip/_vendor/idna/codec.py | 118 + .../site-packages/pip/_vendor/idna/compat.py | 12 + .../site-packages/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 +++++++++++++++++ .../site-packages/pip/_vendor/ipaddress.py | 2419 +++++ .../pip/_vendor/lockfile/__init__.py | 347 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 9914 bytes .../__pycache__/linklockfile.cpython-36.pyc | Bin 0 -> 2293 bytes .../__pycache__/mkdirlockfile.cpython-36.pyc | Bin 0 -> 2655 bytes .../__pycache__/pidlockfile.cpython-36.pyc | Bin 0 -> 4855 bytes .../__pycache__/sqlitelockfile.cpython-36.pyc | Bin 0 -> 3754 bytes .../symlinklockfile.cpython-36.pyc | Bin 0 -> 2178 bytes .../pip/_vendor/lockfile/linklockfile.py | 73 + .../pip/_vendor/lockfile/mkdirlockfile.py | 84 + .../pip/_vendor/lockfile/pidlockfile.py | 190 + .../pip/_vendor/lockfile/sqlitelockfile.py | 156 + .../pip/_vendor/lockfile/symlinklockfile.py | 70 + .../pip/_vendor/msgpack/__init__.py | 66 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2076 bytes .../__pycache__/_version.cpython-36.pyc | Bin 0 -> 238 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 2179 bytes .../__pycache__/fallback.cpython-36.pyc | Bin 0 -> 24702 bytes .../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 + .../__pycache__/__about__.cpython-36.pyc | Bin 0 -> 736 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 574 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 0 -> 1009 bytes .../__pycache__/_structures.cpython-36.pyc | Bin 0 -> 2866 bytes .../__pycache__/markers.cpython-36.pyc | Bin 0 -> 8884 bytes .../__pycache__/requirements.cpython-36.pyc | Bin 0 -> 3995 bytes .../__pycache__/specifiers.cpython-36.pyc | Bin 0 -> 19800 bytes .../__pycache__/utils.cpython-36.pyc | Bin 0 -> 1452 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 12005 bytes .../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 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 287 bytes .../__pycache__/_in_process.cpython-36.pyc | Bin 0 -> 5630 bytes .../pep517/__pycache__/build.cpython-36.pyc | Bin 0 -> 2769 bytes .../pep517/__pycache__/check.cpython-36.pyc | Bin 0 -> 4813 bytes .../__pycache__/colorlog.cpython-36.pyc | Bin 0 -> 2934 bytes .../pep517/__pycache__/compat.cpython-36.pyc | Bin 0 -> 1023 bytes .../__pycache__/envbuild.cpython-36.pyc | Bin 0 -> 4207 bytes .../__pycache__/wrappers.cpython-36.pyc | Bin 0 -> 5488 bytes .../pip/_vendor/pep517/_in_process.py | 207 + .../site-packages/pip/_vendor/pep517/build.py | 108 + .../site-packages/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 | 3286 +++++++ .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 99617 bytes .../__pycache__/py31compat.cpython-36.pyc | Bin 0 -> 664 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/progress/__init__.py | 177 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 5563 bytes .../progress/__pycache__/bar.cpython-36.pyc | Bin 0 -> 2764 bytes .../__pycache__/counter.cpython-36.pyc | Bin 0 -> 1537 bytes .../__pycache__/spinner.cpython-36.pyc | Bin 0 -> 1452 bytes .../site-packages/pip/_vendor/progress/bar.py | 91 + .../pip/_vendor/progress/counter.py | 41 + .../pip/_vendor/progress/spinner.py | 43 + .../site-packages/pip/_vendor/pyparsing.py | 6493 +++++++++++++ .../pip/_vendor/pytoml/__init__.py | 4 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 381 bytes .../pytoml/__pycache__/core.cpython-36.pyc | Bin 0 -> 944 bytes .../pytoml/__pycache__/parser.cpython-36.pyc | Bin 0 -> 10086 bytes .../pytoml/__pycache__/test.cpython-36.pyc | Bin 0 -> 1244 bytes .../pytoml/__pycache__/utils.cpython-36.pyc | Bin 0 -> 2145 bytes .../pytoml/__pycache__/writer.cpython-36.pyc | Bin 0 -> 3573 bytes .../site-packages/pip/_vendor/pytoml/core.py | 13 + .../pip/_vendor/pytoml/parser.py | 341 + .../site-packages/pip/_vendor/pytoml/test.py | 30 + .../site-packages/pip/_vendor/pytoml/utils.py | 67 + .../pip/_vendor/pytoml/writer.py | 106 + .../pip/_vendor/requests/__init__.py | 133 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 3492 bytes .../__pycache__/__version__.cpython-36.pyc | Bin 0 -> 555 bytes .../_internal_utils.cpython-36.pyc | Bin 0 -> 1313 bytes .../__pycache__/adapters.cpython-36.pyc | Bin 0 -> 16904 bytes .../requests/__pycache__/api.cpython-36.pyc | Bin 0 -> 6496 bytes .../requests/__pycache__/auth.cpython-36.pyc | Bin 0 -> 8347 bytes .../requests/__pycache__/certs.cpython-36.pyc | Bin 0 -> 638 bytes .../__pycache__/compat.cpython-36.pyc | Bin 0 -> 1617 bytes .../__pycache__/cookies.cpython-36.pyc | Bin 0 -> 18792 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 5512 bytes .../requests/__pycache__/help.cpython-36.pyc | Bin 0 -> 2691 bytes .../requests/__pycache__/hooks.cpython-36.pyc | Bin 0 -> 985 bytes .../__pycache__/models.cpython-36.pyc | Bin 0 -> 24167 bytes .../__pycache__/packages.cpython-36.pyc | Bin 0 -> 530 bytes .../__pycache__/sessions.cpython-36.pyc | Bin 0 -> 19431 bytes .../__pycache__/status_codes.cpython-36.pyc | Bin 0 -> 4783 bytes .../__pycache__/structures.cpython-36.pyc | Bin 0 -> 4384 bytes .../requests/__pycache__/utils.cpython-36.pyc | Bin 0 -> 22101 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/adapters.py | 533 ++ .../site-packages/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 ++ .../site-packages/pip/_vendor/retrying.py | 267 + .../site-packages/pip/_vendor/six.py | 952 ++ .../pip/_vendor/urllib3/__init__.py | 92 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2206 bytes .../__pycache__/_collections.cpython-36.pyc | Bin 0 -> 10693 bytes .../__pycache__/connection.cpython-36.pyc | Bin 0 -> 10146 bytes .../__pycache__/connectionpool.cpython-36.pyc | Bin 0 -> 23668 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 10405 bytes .../urllib3/__pycache__/fields.cpython-36.pyc | Bin 0 -> 5875 bytes .../__pycache__/filepost.cpython-36.pyc | Bin 0 -> 2765 bytes .../__pycache__/poolmanager.cpython-36.pyc | Bin 0 -> 12972 bytes .../__pycache__/request.cpython-36.pyc | Bin 0 -> 5587 bytes .../__pycache__/response.cpython-36.pyc | Bin 0 -> 18787 bytes .../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 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 204 bytes .../_appengine_environ.cpython-36.pyc | Bin 0 -> 1100 bytes .../__pycache__/appengine.cpython-36.pyc | Bin 0 -> 8319 bytes .../__pycache__/ntlmpool.cpython-36.pyc | Bin 0 -> 3246 bytes .../__pycache__/pyopenssl.cpython-36.pyc | Bin 0 -> 14535 bytes .../securetransport.cpython-36.pyc | Bin 0 -> 17899 bytes .../contrib/__pycache__/socks.cpython-36.pyc | Bin 0 -> 4910 bytes .../urllib3/contrib/_appengine_environ.py | 30 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 221 bytes .../__pycache__/bindings.cpython-36.pyc | Bin 0 -> 10436 bytes .../__pycache__/low_level.cpython-36.pyc | Bin 0 -> 7497 bytes .../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 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 330 bytes .../packages/__pycache__/six.cpython-36.pyc | Bin 0 -> 24502 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 215 bytes .../__pycache__/makefile.cpython-36.pyc | Bin 0 -> 1309 bytes .../urllib3/packages/backports/makefile.py | 53 + .../pip/_vendor/urllib3/packages/six.py | 868 ++ .../packages/ssl_match_hostname/__init__.py | 19 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 591 bytes .../_implementation.cpython-36.pyc | Bin 0 -> 3318 bytes .../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 + .../util/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1134 bytes .../__pycache__/connection.cpython-36.pyc | Bin 0 -> 3171 bytes .../util/__pycache__/queue.cpython-36.pyc | Bin 0 -> 1045 bytes .../util/__pycache__/request.cpython-36.pyc | Bin 0 -> 3226 bytes .../util/__pycache__/response.cpython-36.pyc | Bin 0 -> 1974 bytes .../util/__pycache__/retry.cpython-36.pyc | Bin 0 -> 12660 bytes .../util/__pycache__/ssl_.cpython-36.pyc | Bin 0 -> 9564 bytes .../util/__pycache__/timeout.cpython-36.pyc | Bin 0 -> 8775 bytes .../util/__pycache__/url.cpython-36.pyc | Bin 0 -> 5194 bytes .../util/__pycache__/wait.cpython-36.pyc | Bin 0 -> 3155 bytes .../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 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 9682 bytes .../__pycache__/labels.cpython-36.pyc | Bin 0 -> 4094 bytes .../__pycache__/mklabels.cpython-36.pyc | Bin 0 -> 1916 bytes .../__pycache__/tests.cpython-36.pyc | Bin 0 -> 5072 bytes .../__pycache__/x_user_defined.cpython-36.pyc | Bin 0 -> 2669 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../site-packages/pkg_resources/__init__.py | 3286 +++++++ .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 99666 bytes .../__pycache__/py31compat.cpython-36.pyc | Bin 0 -> 654 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 205 bytes .../__pycache__/appdirs.cpython-36.pyc | Bin 0 -> 20743 bytes .../__pycache__/pyparsing.cpython-36.pyc | Bin 0 -> 203214 bytes .../_vendor/__pycache__/six.cpython-36.pyc | Bin 0 -> 24502 bytes .../pkg_resources/_vendor/appdirs.py | 608 ++ .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-36.pyc | Bin 0 -> 741 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 579 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 0 -> 1026 bytes .../__pycache__/_structures.cpython-36.pyc | Bin 0 -> 2883 bytes .../__pycache__/markers.cpython-36.pyc | Bin 0 -> 8906 bytes .../__pycache__/requirements.cpython-36.pyc | Bin 0 -> 3902 bytes .../__pycache__/specifiers.cpython-36.pyc | Bin 0 -> 19845 bytes .../__pycache__/utils.cpython-36.pyc | Bin 0 -> 510 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 10620 bytes .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../pkg_resources/_vendor/packaging/utils.py | 14 + .../_vendor/packaging/version.py | 393 + .../pkg_resources/_vendor/pyparsing.py | 5742 ++++++++++++ .../pkg_resources/_vendor/six.py | 868 ++ .../pkg_resources/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2440 bytes .../site-packages/pkg_resources/py31compat.py | 23 + .../pymongo-3.8.0.dist-info/INSTALLER | 1 + .../pymongo-3.8.0.dist-info/METADATA | 243 + .../pymongo-3.8.0.dist-info/RECORD | 145 + .../pymongo-3.8.0.dist-info/WHEEL | 5 + .../pymongo-3.8.0.dist-info/top_level.txt | 3 + .../site-packages/pymongo/__init__.py | 99 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1600 bytes .../pymongo/__pycache__/auth.cpython-36.pyc | Bin 0 -> 13333 bytes .../pymongo/__pycache__/bulk.cpython-36.pyc | Bin 0 -> 19249 bytes .../__pycache__/change_stream.cpython-36.pyc | Bin 0 -> 10516 bytes .../__pycache__/client_options.cpython-36.pyc | Bin 0 -> 7957 bytes .../__pycache__/client_session.cpython-36.pyc | Bin 0 -> 20008 bytes .../__pycache__/collation.cpython-36.pyc | Bin 0 -> 6502 bytes .../__pycache__/collection.cpython-36.pyc | Bin 0 -> 117994 bytes .../__pycache__/command_cursor.cpython-36.pyc | Bin 0 -> 9937 bytes .../pymongo/__pycache__/common.cpython-36.pyc | Bin 0 -> 19211 bytes .../compression_support.cpython-36.pyc | Bin 0 -> 3359 bytes .../pymongo/__pycache__/cursor.cpython-36.pyc | Bin 0 -> 37160 bytes .../__pycache__/cursor_manager.cpython-36.pyc | Bin 0 -> 1950 bytes .../__pycache__/database.cpython-36.pyc | Bin 0 -> 54180 bytes .../__pycache__/driver_info.cpython-36.pyc | Bin 0 -> 1378 bytes .../pymongo/__pycache__/errors.cpython-36.pyc | Bin 0 -> 10106 bytes .../__pycache__/helpers.cpython-36.pyc | Bin 0 -> 6176 bytes .../__pycache__/ismaster.cpython-36.pyc | Bin 0 -> 5118 bytes .../max_staleness_selectors.cpython-36.pyc | Bin 0 -> 2467 bytes .../__pycache__/message.cpython-36.pyc | Bin 0 -> 37251 bytes .../__pycache__/mongo_client.cpython-36.pyc | Bin 0 -> 72827 bytes .../mongo_replica_set_client.cpython-36.pyc | Bin 0 -> 1872 bytes .../__pycache__/monitor.cpython-36.pyc | Bin 0 -> 4758 bytes .../__pycache__/monitoring.cpython-36.pyc | Bin 0 -> 34371 bytes .../__pycache__/monotonic.cpython-36.pyc | Bin 0 -> 505 bytes .../__pycache__/network.cpython-36.pyc | Bin 0 -> 7361 bytes .../__pycache__/operations.cpython-36.pyc | Bin 0 -> 13954 bytes .../periodic_executor.cpython-36.pyc | Bin 0 -> 3717 bytes .../pymongo/__pycache__/pool.cpython-36.pyc | Bin 0 -> 29316 bytes .../__pycache__/read_concern.cpython-36.pyc | Bin 0 -> 2299 bytes .../read_preferences.cpython-36.pyc | Bin 0 -> 16468 bytes .../__pycache__/response.cpython-36.pyc | Bin 0 -> 3363 bytes .../__pycache__/results.cpython-36.pyc | Bin 0 -> 8805 bytes .../__pycache__/saslprep.cpython-36.pyc | Bin 0 -> 2445 bytes .../pymongo/__pycache__/server.cpython-36.pyc | Bin 0 -> 4639 bytes .../server_description.cpython-36.pyc | Bin 0 -> 6377 bytes .../server_selectors.cpython-36.pyc | Bin 0 -> 5710 bytes .../__pycache__/server_type.cpython-36.pyc | Bin 0 -> 446 bytes .../__pycache__/settings.cpython-36.pyc | Bin 0 -> 4193 bytes .../son_manipulator.cpython-36.pyc | Bin 0 -> 7506 bytes .../__pycache__/ssl_context.cpython-36.pyc | Bin 0 -> 3404 bytes .../ssl_match_hostname.cpython-36.pyc | Bin 0 -> 3010 bytes .../__pycache__/ssl_support.cpython-36.pyc | Bin 0 -> 3834 bytes .../__pycache__/thread_util.cpython-36.pyc | Bin 0 -> 4190 bytes .../__pycache__/topology.cpython-36.pyc | Bin 0 -> 17463 bytes .../topology_description.cpython-36.pyc | Bin 0 -> 13509 bytes .../__pycache__/uri_parser.cpython-36.pyc | Bin 0 -> 11222 bytes .../__pycache__/write_concern.cpython-36.pyc | Bin 0 -> 4597 bytes .../pymongo/_cmessage.cpython-36m-darwin.so | Bin 0 -> 31272 bytes .../python3.6/site-packages/pymongo/auth.py | 570 ++ .../python3.6/site-packages/pymongo/bulk.py | 702 ++ .../site-packages/pymongo/change_stream.py | 334 + .../site-packages/pymongo/client_options.py | 237 + .../site-packages/pymongo/client_session.py | 655 ++ .../site-packages/pymongo/collation.py | 225 + .../site-packages/pymongo/collection.py | 3356 +++++++ .../site-packages/pymongo/command_cursor.py | 345 + .../python3.6/site-packages/pymongo/common.py | 733 ++ .../pymongo/compression_support.py | 124 + .../python3.6/site-packages/pymongo/cursor.py | 1327 +++ .../site-packages/pymongo/cursor_manager.py | 65 + .../site-packages/pymongo/database.py | 1465 +++ .../site-packages/pymongo/driver_info.py | 39 + .../python3.6/site-packages/pymongo/errors.py | 249 + .../site-packages/pymongo/helpers.py | 272 + .../site-packages/pymongo/ismaster.py | 158 + .../pymongo/max_staleness_selectors.py | 116 + .../site-packages/pymongo/message.py | 1555 ++++ .../site-packages/pymongo/mongo_client.py | 1950 ++++ .../pymongo/mongo_replica_set_client.py | 48 + .../site-packages/pymongo/monitor.py | 184 + .../site-packages/pymongo/monitoring.py | 931 ++ .../site-packages/pymongo/monotonic.py | 38 + .../site-packages/pymongo/network.py | 305 + .../site-packages/pymongo/operations.py | 370 + .../pymongo/periodic_executor.py | 174 + .../python3.6/site-packages/pymongo/pool.py | 1113 +++ .../site-packages/pymongo/read_concern.py | 76 + .../site-packages/pymongo/read_preferences.py | 471 + .../site-packages/pymongo/response.py | 101 + .../site-packages/pymongo/results.py | 226 + .../site-packages/pymongo/saslprep.py | 108 + .../python3.6/site-packages/pymongo/server.py | 169 + .../pymongo/server_description.py | 202 + .../site-packages/pymongo/server_selectors.py | 156 + .../site-packages/pymongo/server_type.py | 23 + .../site-packages/pymongo/settings.py | 123 + .../site-packages/pymongo/son_manipulator.py | 191 + .../site-packages/pymongo/ssl_context.py | 96 + .../pymongo/ssl_match_hostname.py | 135 + .../site-packages/pymongo/ssl_support.py | 191 + .../site-packages/pymongo/thread_util.py | 131 + .../site-packages/pymongo/topology.py | 633 ++ .../pymongo/topology_description.py | 545 ++ .../site-packages/pymongo/uri_parser.py | 429 + .../site-packages/pymongo/write_concern.py | 126 + .../setuptools-41.0.1.dist-info/INSTALLER | 1 + .../setuptools-41.0.1.dist-info/LICENSE | 19 + .../setuptools-41.0.1.dist-info/METADATA | 77 + .../setuptools-41.0.1.dist-info/RECORD | 186 + .../setuptools-41.0.1.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 65 + .../setuptools-41.0.1.dist-info/top_level.txt | 3 + .../setuptools-41.0.1.dist-info/zip-safe | 1 + .../site-packages/setuptools/__init__.py | 228 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 7709 bytes .../_deprecation_warning.cpython-36.pyc | Bin 0 -> 560 bytes .../__pycache__/archive_util.cpython-36.pyc | Bin 0 -> 5148 bytes .../__pycache__/build_meta.cpython-36.pyc | Bin 0 -> 8301 bytes .../__pycache__/config.cpython-36.pyc | Bin 0 -> 17724 bytes .../__pycache__/dep_util.cpython-36.pyc | Bin 0 -> 867 bytes .../__pycache__/depends.cpython-36.pyc | Bin 0 -> 5293 bytes .../__pycache__/dist.cpython-36.pyc | Bin 0 -> 42193 bytes .../__pycache__/extension.cpython-36.pyc | Bin 0 -> 1987 bytes .../__pycache__/glibc.cpython-36.pyc | Bin 0 -> 1557 bytes .../__pycache__/glob.cpython-36.pyc | Bin 0 -> 3764 bytes .../__pycache__/launch.cpython-36.pyc | Bin 0 -> 866 bytes .../__pycache__/lib2to3_ex.cpython-36.pyc | Bin 0 -> 2445 bytes .../__pycache__/monkey.cpython-36.pyc | Bin 0 -> 4713 bytes .../__pycache__/msvc.cpython-36.pyc | Bin 0 -> 34540 bytes .../__pycache__/namespaces.cpython-36.pyc | Bin 0 -> 3690 bytes .../__pycache__/package_index.cpython-36.pyc | Bin 0 -> 32843 bytes .../__pycache__/pep425tags.cpython-36.pyc | Bin 0 -> 7355 bytes .../__pycache__/py27compat.cpython-36.pyc | Bin 0 -> 823 bytes .../__pycache__/py31compat.cpython-36.pyc | Bin 0 -> 1221 bytes .../__pycache__/py33compat.cpython-36.pyc | Bin 0 -> 1432 bytes .../__pycache__/sandbox.cpython-36.pyc | Bin 0 -> 15735 bytes .../__pycache__/site-patch.cpython-36.pyc | Bin 0 -> 1518 bytes .../__pycache__/ssl_support.cpython-36.pyc | Bin 0 -> 6799 bytes .../__pycache__/unicode_utils.cpython-36.pyc | Bin 0 -> 1181 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 340 bytes .../__pycache__/wheel.cpython-36.pyc | Bin 0 -> 7017 bytes .../windows_support.cpython-36.pyc | Bin 0 -> 1023 bytes .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 202 bytes .../__pycache__/pyparsing.cpython-36.pyc | Bin 0 -> 203211 bytes .../_vendor/__pycache__/six.cpython-36.pyc | Bin 0 -> 24499 bytes .../setuptools/_vendor/packaging/__about__.py | 21 + .../setuptools/_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-36.pyc | Bin 0 -> 738 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 576 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 0 -> 1023 bytes .../__pycache__/_structures.cpython-36.pyc | Bin 0 -> 2880 bytes .../__pycache__/markers.cpython-36.pyc | Bin 0 -> 8900 bytes .../__pycache__/requirements.cpython-36.pyc | Bin 0 -> 3893 bytes .../__pycache__/specifiers.cpython-36.pyc | Bin 0 -> 19842 bytes .../__pycache__/utils.cpython-36.pyc | Bin 0 -> 507 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 10617 bytes .../setuptools/_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../setuptools/_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../setuptools/_vendor/packaging/utils.py | 14 + .../setuptools/_vendor/packaging/version.py | 393 + .../setuptools/_vendor/pyparsing.py | 5742 ++++++++++++ .../site-packages/setuptools/_vendor/six.py | 868 ++ .../site-packages/setuptools/archive_util.py | 173 + .../site-packages/setuptools/build_meta.py | 254 + .../site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 18 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 753 bytes .../command/__pycache__/alias.cpython-36.pyc | Bin 0 -> 2446 bytes .../__pycache__/bdist_egg.cpython-36.pyc | Bin 0 -> 14332 bytes .../__pycache__/bdist_rpm.cpython-36.pyc | Bin 0 -> 1789 bytes .../__pycache__/bdist_wininst.cpython-36.pyc | Bin 0 -> 990 bytes .../__pycache__/build_clib.cpython-36.pyc | Bin 0 -> 2461 bytes .../__pycache__/build_ext.cpython-36.pyc | Bin 0 -> 9734 bytes .../__pycache__/build_py.cpython-36.pyc | Bin 0 -> 8585 bytes .../__pycache__/develop.cpython-36.pyc | Bin 0 -> 6496 bytes .../__pycache__/dist_info.cpython-36.pyc | Bin 0 -> 1406 bytes .../__pycache__/easy_install.cpython-36.pyc | Bin 0 -> 65235 bytes .../__pycache__/egg_info.cpython-36.pyc | Bin 0 -> 21606 bytes .../__pycache__/install.cpython-36.pyc | Bin 0 -> 3986 bytes .../install_egg_info.cpython-36.pyc | Bin 0 -> 2451 bytes .../__pycache__/install_lib.cpython-36.pyc | Bin 0 -> 4096 bytes .../install_scripts.cpython-36.pyc | Bin 0 -> 2291 bytes .../__pycache__/py36compat.cpython-36.pyc | Bin 0 -> 4636 bytes .../__pycache__/register.cpython-36.pyc | Bin 0 -> 787 bytes .../command/__pycache__/rotate.cpython-36.pyc | Bin 0 -> 2592 bytes .../__pycache__/saveopts.cpython-36.pyc | Bin 0 -> 937 bytes .../command/__pycache__/sdist.cpython-36.pyc | Bin 0 -> 6890 bytes .../command/__pycache__/setopt.cpython-36.pyc | Bin 0 -> 4615 bytes .../command/__pycache__/test.cpython-36.pyc | Bin 0 -> 8252 bytes .../command/__pycache__/upload.cpython-36.pyc | Bin 0 -> 5150 bytes .../__pycache__/upload_docs.cpython-36.pyc | Bin 0 -> 6113 bytes .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 502 + .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 21 + .../setuptools/command/build_clib.py | 98 + .../setuptools/command/build_ext.py | 321 + .../setuptools/command/build_py.py | 270 + .../setuptools/command/develop.py | 221 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2342 +++++ .../setuptools/command/egg_info.py | 717 ++ .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 62 + .../setuptools/command/install_lib.py | 121 + .../setuptools/command/install_scripts.py | 65 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 66 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 221 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 271 + .../setuptools/command/upload.py | 196 + .../setuptools/command/upload_docs.py | 206 + .../site-packages/setuptools/config.py | 656 ++ .../site-packages/setuptools/dep_util.py | 23 + .../site-packages/setuptools/depends.py | 186 + .../site-packages/setuptools/dist.py | 1278 +++ .../site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2436 bytes .../site-packages/setuptools/glibc.py | 86 + .../site-packages/setuptools/glob.py | 174 + .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/lib2to3_ex.py | 62 + .../site-packages/setuptools/monkey.py | 179 + .../site-packages/setuptools/msvc.py | 1301 +++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1136 +++ .../site-packages/setuptools/pep425tags.py | 319 + .../site-packages/setuptools/py27compat.py | 28 + .../site-packages/setuptools/py31compat.py | 32 + .../site-packages/setuptools/py33compat.py | 55 + .../site-packages/setuptools/sandbox.py | 491 + .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 74 + .../site-packages/setuptools/ssl_support.py | 260 + .../site-packages/setuptools/unicode_utils.py | 44 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/wheel.py | 211 + .../setuptools/windows_support.py | 29 + .../wheel-0.33.1.dist-info/INSTALLER | 1 + .../wheel-0.33.1.dist-info/LICENSE.txt | 22 + .../wheel-0.33.1.dist-info/METADATA | 60 + .../wheel-0.33.1.dist-info/RECORD | 32 + .../wheel-0.33.1.dist-info/WHEEL | 6 + .../wheel-0.33.1.dist-info/entry_points.txt | 6 + .../wheel-0.33.1.dist-info/top_level.txt | 1 + .../python3.6/site-packages/wheel/__init__.py | 2 + .../python3.6/site-packages/wheel/__main__.py | 19 + .../wheel/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 206 bytes .../wheel/__pycache__/__main__.cpython-36.pyc | Bin 0 -> 599 bytes .../__pycache__/bdist_wheel.cpython-36.pyc | Bin 0 -> 10311 bytes .../wheel/__pycache__/metadata.cpython-36.pyc | Bin 0 -> 3782 bytes .../__pycache__/pep425tags.cpython-36.pyc | Bin 0 -> 4768 bytes .../wheel/__pycache__/pkginfo.cpython-36.pyc | Bin 0 -> 1577 bytes .../wheel/__pycache__/util.cpython-36.pyc | Bin 0 -> 1322 bytes .../__pycache__/wheelfile.cpython-36.pyc | Bin 0 -> 5457 bytes .../site-packages/wheel/bdist_wheel.py | 372 + .../site-packages/wheel/cli/__init__.py | 88 + .../cli/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 3048 bytes .../cli/__pycache__/convert.cpython-36.pyc | Bin 0 -> 6222 bytes .../wheel/cli/__pycache__/pack.cpython-36.pyc | Bin 0 -> 2506 bytes .../cli/__pycache__/unpack.cpython-36.pyc | Bin 0 -> 951 bytes .../site-packages/wheel/cli/convert.py | 269 + .../python3.6/site-packages/wheel/cli/pack.py | 58 + .../site-packages/wheel/cli/unpack.py | 25 + .../python3.6/site-packages/wheel/metadata.py | 141 + .../site-packages/wheel/pep425tags.py | 185 + .../python3.6/site-packages/wheel/pkginfo.py | 43 + .../lib/python3.6/site-packages/wheel/util.py | 46 + .../site-packages/wheel/wheelfile.py | 168 + mongo_mac/lib/python3.6/site.py | 758 ++ mongo_mac/lib/python3.6/sre_compile.py | 1 + mongo_mac/lib/python3.6/sre_constants.py | 1 + mongo_mac/lib/python3.6/sre_parse.py | 1 + mongo_mac/lib/python3.6/stat.py | 1 + mongo_mac/lib/python3.6/struct.py | 1 + mongo_mac/lib/python3.6/tarfile.py | 1 + mongo_mac/lib/python3.6/tempfile.py | 1 + mongo_mac/lib/python3.6/token.py | 1 + mongo_mac/lib/python3.6/tokenize.py | 1 + mongo_mac/lib/python3.6/types.py | 1 + mongo_mac/lib/python3.6/warnings.py | 1 + mongo_mac/lib/python3.6/weakref.py | 1 + mongo_mac/pip-selfcheck.json | 1 + 1090 files changed, 173391 insertions(+) create mode 100644 mongo_mac/bin/activate create mode 100644 mongo_mac/bin/activate.csh create mode 100644 mongo_mac/bin/activate.fish create mode 100644 mongo_mac/bin/activate_this.py create mode 100755 mongo_mac/bin/easy_install create mode 100755 mongo_mac/bin/easy_install-3.6 create mode 100755 mongo_mac/bin/pip create mode 100755 mongo_mac/bin/pip3 create mode 100755 mongo_mac/bin/pip3.6 create mode 100755 mongo_mac/bin/python create mode 100755 mongo_mac/bin/python-config create mode 120000 mongo_mac/bin/python3 create mode 120000 mongo_mac/bin/python3.6 create mode 100755 mongo_mac/bin/wheel create mode 120000 mongo_mac/include/python3.6m create mode 120000 mongo_mac/lib/python3.6/__future__.py create mode 100644 mongo_mac/lib/python3.6/__pycache__/__future__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/_bootlocale.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/_collections_abc.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/_weakrefset.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/abc.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/base64.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/bisect.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/codecs.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/copy.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/copyreg.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/enum.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/fnmatch.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/functools.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/genericpath.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/hashlib.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/heapq.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/hmac.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/imp.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/io.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/keyword.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/linecache.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/locale.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/ntpath.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/operator.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/os.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/posixpath.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/random.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/re.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/reprlib.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/shutil.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/site.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/sre_compile.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/sre_constants.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/sre_parse.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/stat.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/struct.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/tarfile.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/tempfile.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/token.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/tokenize.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/types.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/warnings.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/__pycache__/weakref.cpython-36.pyc create mode 120000 mongo_mac/lib/python3.6/_bootlocale.py create mode 120000 mongo_mac/lib/python3.6/_collections_abc.py create mode 120000 mongo_mac/lib/python3.6/_dummy_thread.py create mode 120000 mongo_mac/lib/python3.6/_weakrefset.py create mode 120000 mongo_mac/lib/python3.6/abc.py create mode 120000 mongo_mac/lib/python3.6/base64.py create mode 120000 mongo_mac/lib/python3.6/bisect.py create mode 120000 mongo_mac/lib/python3.6/codecs.py create mode 120000 mongo_mac/lib/python3.6/collections create mode 120000 mongo_mac/lib/python3.6/config-3.6m-darwin create mode 120000 mongo_mac/lib/python3.6/copy.py create mode 120000 mongo_mac/lib/python3.6/copyreg.py create mode 100644 mongo_mac/lib/python3.6/distutils/__init__.py create mode 100644 mongo_mac/lib/python3.6/distutils/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/distutils/distutils.cfg create mode 120000 mongo_mac/lib/python3.6/encodings create mode 120000 mongo_mac/lib/python3.6/enum.py create mode 120000 mongo_mac/lib/python3.6/fnmatch.py create mode 120000 mongo_mac/lib/python3.6/functools.py create mode 120000 mongo_mac/lib/python3.6/genericpath.py create mode 120000 mongo_mac/lib/python3.6/hashlib.py create mode 120000 mongo_mac/lib/python3.6/heapq.py create mode 120000 mongo_mac/lib/python3.6/hmac.py create mode 120000 mongo_mac/lib/python3.6/imp.py create mode 120000 mongo_mac/lib/python3.6/importlib create mode 120000 mongo_mac/lib/python3.6/io.py create mode 120000 mongo_mac/lib/python3.6/keyword.py create mode 120000 mongo_mac/lib/python3.6/lib-dynload create mode 120000 mongo_mac/lib/python3.6/linecache.py create mode 120000 mongo_mac/lib/python3.6/locale.py create mode 100644 mongo_mac/lib/python3.6/no-global-site-packages.txt create mode 120000 mongo_mac/lib/python3.6/ntpath.py create mode 120000 mongo_mac/lib/python3.6/operator.py create mode 100644 mongo_mac/lib/python3.6/orig-prefix.txt create mode 120000 mongo_mac/lib/python3.6/os.py create mode 120000 mongo_mac/lib/python3.6/posixpath.py create mode 120000 mongo_mac/lib/python3.6/random.py create mode 120000 mongo_mac/lib/python3.6/re.py create mode 120000 mongo_mac/lib/python3.6/readline.so create mode 120000 mongo_mac/lib/python3.6/reprlib.py create mode 120000 mongo_mac/lib/python3.6/rlcompleter.py create mode 120000 mongo_mac/lib/python3.6/shutil.py create mode 100644 mongo_mac/lib/python3.6/site-packages/__pycache__/easy_install.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/__pycache__/binary.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/__pycache__/code.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/__pycache__/codec_options.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/__pycache__/dbref.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/__pycache__/decimal128.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/__pycache__/errors.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/__pycache__/int64.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/__pycache__/json_util.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/__pycache__/max_key.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/__pycache__/min_key.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/__pycache__/objectid.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/__pycache__/py3compat.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/__pycache__/raw_bson.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/__pycache__/regex.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/__pycache__/son.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/__pycache__/timestamp.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/__pycache__/tz_util.cpython-36.pyc create mode 100755 mongo_mac/lib/python3.6/site-packages/bson/_cbson.cpython-36m-darwin.so create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/binary.py create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/code.py create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/codec_options.py create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/dbref.py create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/decimal128.py create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/errors.py create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/int64.py create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/json_util.py create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/max_key.py create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/min_key.py create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/objectid.py create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/py3compat.py create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/raw_bson.py create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/regex.py create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/son.py create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/timestamp.py create mode 100644 mongo_mac/lib/python3.6/site-packages/bson/tz_util.py create mode 100644 mongo_mac/lib/python3.6/site-packages/easy_install.py create mode 100644 mongo_mac/lib/python3.6/site-packages/gridfs/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/gridfs/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/gridfs/__pycache__/errors.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/gridfs/__pycache__/grid_file.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/gridfs/errors.py create mode 100644 mongo_mac/lib/python3.6/site-packages/gridfs/grid_file.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/INSTALLER create mode 100644 mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/LICENSE.txt create mode 100644 mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/METADATA create mode 100644 mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/RECORD create mode 100644 mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/WHEEL create mode 100644 mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/entry_points.txt create mode 100644 mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/top_level.txt create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/__main__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/__pycache__/__main__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/build_env.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/cache.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/configuration.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/download.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/exceptions.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/index.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/locations.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/pep425tags.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/pyproject.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/resolve.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/wheel.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/build_env.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/cache.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/parser.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/base_command.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/main_parser.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/parser.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/status_codes.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/check.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/completion.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/download.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/hash.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/help.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/install.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/list.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/search.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/show.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/check.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/completion.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/configuration.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/download.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/freeze.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/hash.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/help.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/install.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/list.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/search.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/show.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/uninstall.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/wheel.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/configuration.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/download.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/exceptions.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/index.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/locations.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/models/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/models/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/models/__pycache__/candidate.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/models/__pycache__/format_control.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/models/__pycache__/index.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/models/__pycache__/link.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/models/candidate.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/models/format_control.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/models/index.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/models/link.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/check.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/check.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/freeze.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/prepare.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/pep425tags.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/pyproject.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__pycache__/constructors.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_file.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_install.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_set.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/req/constructors.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_file.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_install.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_set.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_tracker.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/resolve.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/compat.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/logging.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/misc.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/models.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/typing.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/ui.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/appdirs.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/compat.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/deprecation.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/encoding.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/filesystem.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/glibc.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/hashes.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/logging.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/misc.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/models.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/outdated.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/packaging.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/typing.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/ui.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/git.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/git.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/subversion.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_internal/wheel.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/appdirs.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/distro.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/retrying.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/six.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/appdirs.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/core.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/compat.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/enums.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langcyrillicmodel.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/version.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/win32.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/compat.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/database.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/index.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/locators.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/markers.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/resources.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/util.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/version.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/distro.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/datrie.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/constants.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/core.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/codec.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/compat.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/core.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/intranges.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/package_data.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/ipaddress.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/linklockfile.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/mkdirlockfile.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/pidlockfile.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/sqlitelockfile.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/symlinklockfile.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/_version.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/_compat.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/markers.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/utils.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/version.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/_in_process.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/build.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/check.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/compat.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/bar.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/counter.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/spinner.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pyparsing.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/test.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/utils.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/core.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/parser.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/test.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/utils.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/writer.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/api.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/help.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/models.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__version__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/adapters.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/api.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/auth.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/certs.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/compat.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/cookies.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/help.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/hooks.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/models.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/packages.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/sessions.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/structures.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/utils.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/retrying.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/six.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/request.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/response.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/__pycache__/py31compat.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/six.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/extern/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pkg_resources/py31compat.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/INSTALLER create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/METADATA create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/RECORD create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/WHEEL create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/top_level.txt create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/auth.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/bulk.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/change_stream.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/client_options.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/client_session.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/collation.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/collection.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/command_cursor.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/common.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/compression_support.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/cursor.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/cursor_manager.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/database.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/driver_info.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/errors.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/helpers.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/ismaster.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/max_staleness_selectors.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/message.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/mongo_client.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/mongo_replica_set_client.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/monitor.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/monitoring.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/monotonic.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/network.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/operations.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/periodic_executor.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/pool.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/read_concern.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/read_preferences.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/response.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/results.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/saslprep.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/server.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/server_description.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/server_selectors.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/server_type.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/settings.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/son_manipulator.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/ssl_context.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/ssl_match_hostname.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/ssl_support.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/thread_util.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/topology.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/topology_description.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/uri_parser.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/write_concern.cpython-36.pyc create mode 100755 mongo_mac/lib/python3.6/site-packages/pymongo/_cmessage.cpython-36m-darwin.so create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/auth.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/bulk.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/change_stream.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/client_options.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/client_session.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/collation.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/collection.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/command_cursor.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/common.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/compression_support.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/cursor.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/cursor_manager.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/database.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/driver_info.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/errors.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/helpers.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/ismaster.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/max_staleness_selectors.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/message.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/mongo_client.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/mongo_replica_set_client.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/monitor.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/monitoring.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/monotonic.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/network.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/operations.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/periodic_executor.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/pool.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/read_concern.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/read_preferences.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/response.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/results.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/saslprep.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/server.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/server_description.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/server_selectors.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/server_type.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/settings.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/son_manipulator.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/ssl_context.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/ssl_match_hostname.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/ssl_support.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/thread_util.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/topology.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/topology_description.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/uri_parser.py create mode 100644 mongo_mac/lib/python3.6/site-packages/pymongo/write_concern.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/INSTALLER create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/LICENSE create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/METADATA create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/RECORD create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/WHEEL create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/dependency_links.txt create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/entry_points.txt create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/top_level.txt create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/zip-safe create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/archive_util.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/build_meta.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/config.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/dep_util.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/depends.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/dist.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/extension.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/glibc.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/glob.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/launch.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/monkey.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/msvc.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/namespaces.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/package_index.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/pep425tags.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/py27compat.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/py31compat.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/py33compat.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/sandbox.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/site-patch.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/ssl_support.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/unicode_utils.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/version.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/wheel.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/windows_support.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_deprecation_warning.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/six.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/six.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/archive_util.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/build_meta.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/cli-32.exe create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/cli-64.exe create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/cli.exe create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/alias.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/build_clib.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/build_ext.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/build_py.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/develop.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/dist_info.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/easy_install.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/egg_info.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/install.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/install_lib.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/install_scripts.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/py36compat.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/register.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/rotate.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/saveopts.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/sdist.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/setopt.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/test.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/upload.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/upload_docs.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/alias.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/bdist_egg.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/bdist_rpm.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/bdist_wininst.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/build_clib.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/build_ext.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/build_py.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/develop.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/dist_info.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/easy_install.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/egg_info.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/install.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/install_egg_info.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/install_lib.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/install_scripts.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/launcher manifest.xml create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/py36compat.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/register.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/rotate.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/saveopts.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/sdist.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/setopt.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/test.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/upload.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/command/upload_docs.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/config.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/dep_util.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/depends.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/dist.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/extension.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/extern/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/extern/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/glibc.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/glob.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/gui-32.exe create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/gui-64.exe create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/gui.exe create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/launch.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/lib2to3_ex.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/monkey.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/msvc.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/namespaces.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/package_index.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/pep425tags.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/py27compat.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/py31compat.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/py33compat.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/sandbox.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/script (dev).tmpl create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/script.tmpl create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/site-patch.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/ssl_support.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/unicode_utils.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/version.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/wheel.py create mode 100644 mongo_mac/lib/python3.6/site-packages/setuptools/windows_support.py create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/INSTALLER create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/LICENSE.txt create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/METADATA create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/RECORD create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/WHEEL create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/entry_points.txt create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/top_level.txt create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/__main__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/__pycache__/__main__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/__pycache__/bdist_wheel.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/__pycache__/metadata.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/__pycache__/pep425tags.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/__pycache__/pkginfo.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/__pycache__/util.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/__pycache__/wheelfile.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/bdist_wheel.py create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/cli/__init__.py create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/cli/__pycache__/__init__.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/cli/__pycache__/convert.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/cli/__pycache__/pack.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/cli/__pycache__/unpack.cpython-36.pyc create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/cli/convert.py create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/cli/pack.py create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/cli/unpack.py create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/metadata.py create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/pep425tags.py create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/pkginfo.py create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/util.py create mode 100644 mongo_mac/lib/python3.6/site-packages/wheel/wheelfile.py create mode 100644 mongo_mac/lib/python3.6/site.py create mode 120000 mongo_mac/lib/python3.6/sre_compile.py create mode 120000 mongo_mac/lib/python3.6/sre_constants.py create mode 120000 mongo_mac/lib/python3.6/sre_parse.py create mode 120000 mongo_mac/lib/python3.6/stat.py create mode 120000 mongo_mac/lib/python3.6/struct.py create mode 120000 mongo_mac/lib/python3.6/tarfile.py create mode 120000 mongo_mac/lib/python3.6/tempfile.py create mode 120000 mongo_mac/lib/python3.6/token.py create mode 120000 mongo_mac/lib/python3.6/tokenize.py create mode 120000 mongo_mac/lib/python3.6/types.py create mode 120000 mongo_mac/lib/python3.6/warnings.py create mode 120000 mongo_mac/lib/python3.6/weakref.py create mode 100644 mongo_mac/pip-selfcheck.json diff --git a/mongo_mac/bin/activate b/mongo_mac/bin/activate new file mode 100644 index 0000000..99dd2c0 --- /dev/null +++ b/mongo_mac/bin/activate @@ -0,0 +1,78 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + unset -f pydoc >/dev/null 2>&1 + + # reset old environment variables + # ! [ -z ${VAR+_} ] returns true if VAR is declared at all + if ! [ -z "${_OLD_VIRTUAL_PATH+_}" ] ; then + PATH="$_OLD_VIRTUAL_PATH" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if ! [ -z "${_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-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null + fi + + if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then + PS1="$_OLD_VIRTUAL_PS1" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "${1-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="/Users/raopg/Documents/Dev/learn-mongoDB/mongo_mac" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +if ! [ -z "${PYTHONHOME+_}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then + _OLD_VIRTUAL_PS1="$PS1" + if [ "x" != x ] ; then + PS1="$PS1" + else + PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1" + fi + export PS1 +fi + +# Make sure to unalias pydoc if it's already there +alias pydoc 2>/dev/null >/dev/null && unalias pydoc + +pydoc () { + python -m pydoc "$@" +} + +# 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-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null +fi diff --git a/mongo_mac/bin/activate.csh b/mongo_mac/bin/activate.csh new file mode 100644 index 0000000..b4d836e --- /dev/null +++ b/mongo_mac/bin/activate.csh @@ -0,0 +1,36 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/Users/raopg/Documents/Dev/learn-mongoDB/mongo_mac" + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/bin:$PATH" + + + +if ("" != "") then + set env_name = "" +else + set env_name = `basename "$VIRTUAL_ENV"` +endif + +# Could be in a non-interactive environment, +# in which case, $prompt is undefined and we wouldn't +# care about the prompt anyway. +if ( $?prompt ) then + set _OLD_VIRTUAL_PROMPT="$prompt" + set prompt = "[$env_name] $prompt" +endif + +unset env_name + +alias pydoc python -m pydoc + +rehash + diff --git a/mongo_mac/bin/activate.fish b/mongo_mac/bin/activate.fish new file mode 100644 index 0000000..ca4958c --- /dev/null +++ b/mongo_mac/bin/activate.fish @@ -0,0 +1,76 @@ +# This file must be used using `. bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. +# Do not run it directly. + +function deactivate -d 'Exit virtualenv mode and return to the normal environment.' + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + # Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`. + set -l fish_function_path + + # Erase virtualenv's `fish_prompt` and restore the original. + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + set -e _OLD_FISH_PROMPT_OVERRIDE + end + + set -e VIRTUAL_ENV + + if test "$argv[1]" != 'nondestructive' + # Self-destruct! + functions -e pydoc + functions -e deactivate + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV "/Users/raopg/Documents/Dev/learn-mongoDB/mongo_mac" + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# Unset `$PYTHONHOME` if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +function pydoc + python -m pydoc $argv +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # Copy the current `fish_prompt` function as `_old_fish_prompt`. + functions -c fish_prompt _old_fish_prompt + + function fish_prompt + # Save the current $status, for fish_prompts that display it. + set -l old_status $status + + # Prompt override provided? + # If not, just prepend the environment name. + if test -n "" + printf '%s%s' "" (set_color normal) + else + printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV") + end + + # Restore the original $status + echo "exit $old_status" | source + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" +end diff --git a/mongo_mac/bin/activate_this.py b/mongo_mac/bin/activate_this.py new file mode 100644 index 0000000..f18193b --- /dev/null +++ b/mongo_mac/bin/activate_this.py @@ -0,0 +1,34 @@ +"""By using execfile(this_file, dict(__file__=this_file)) you will +activate this virtualenv environment. + +This can be used when you must use an existing Python interpreter, not +the virtualenv bin/python +""" + +try: + __file__ +except NameError: + raise AssertionError( + "You must run this like execfile('path/to/activate_this.py', dict(__file__='path/to/activate_this.py'))") +import sys +import os + +old_os_path = os.environ.get('PATH', '') +os.environ['PATH'] = os.path.dirname(os.path.abspath(__file__)) + os.pathsep + old_os_path +base = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +if sys.platform == 'win32': + site_packages = os.path.join(base, 'Lib', 'site-packages') +else: + site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages') +prev_sys_path = list(sys.path) +import site +site.addsitedir(site_packages) +sys.real_prefix = sys.prefix +sys.prefix = base +# Move the added items to the front of the path: +new_sys_path = [] +for item in list(sys.path): + if item not in prev_sys_path: + new_sys_path.append(item) + sys.path.remove(item) +sys.path[:0] = new_sys_path diff --git a/mongo_mac/bin/easy_install b/mongo_mac/bin/easy_install new file mode 100755 index 0000000..152fd4b --- /dev/null +++ b/mongo_mac/bin/easy_install @@ -0,0 +1,11 @@ +#!/Users/raopg/Documents/Dev/learn-mongoDB/mongo_mac/bin/python + +# -*- coding: utf-8 -*- +import re +import sys + +from setuptools.command.easy_install import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/mongo_mac/bin/easy_install-3.6 b/mongo_mac/bin/easy_install-3.6 new file mode 100755 index 0000000..152fd4b --- /dev/null +++ b/mongo_mac/bin/easy_install-3.6 @@ -0,0 +1,11 @@ +#!/Users/raopg/Documents/Dev/learn-mongoDB/mongo_mac/bin/python + +# -*- coding: utf-8 -*- +import re +import sys + +from setuptools.command.easy_install import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/mongo_mac/bin/pip b/mongo_mac/bin/pip new file mode 100755 index 0000000..f7b2cb2 --- /dev/null +++ b/mongo_mac/bin/pip @@ -0,0 +1,11 @@ +#!/Users/raopg/Documents/Dev/learn-mongoDB/mongo_mac/bin/python + +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/mongo_mac/bin/pip3 b/mongo_mac/bin/pip3 new file mode 100755 index 0000000..f7b2cb2 --- /dev/null +++ b/mongo_mac/bin/pip3 @@ -0,0 +1,11 @@ +#!/Users/raopg/Documents/Dev/learn-mongoDB/mongo_mac/bin/python + +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/mongo_mac/bin/pip3.6 b/mongo_mac/bin/pip3.6 new file mode 100755 index 0000000..f7b2cb2 --- /dev/null +++ b/mongo_mac/bin/pip3.6 @@ -0,0 +1,11 @@ +#!/Users/raopg/Documents/Dev/learn-mongoDB/mongo_mac/bin/python + +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/mongo_mac/bin/python b/mongo_mac/bin/python new file mode 100755 index 0000000000000000000000000000000000000000..c32a5aeef3d082fa937cd7d09e4d71a39196b845 GIT binary patch literal 3500936 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%0Ai*lw^=JA8Zup_r0ws25Pw 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

#k!6^zq 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

  • xw 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

    XZ;1~T7wqL~0 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 may be passed as + keyword arguments. Any additional keyword arguments will be + set as additional fields on the file document. Valid keyword + arguments include: + + - ``"_id"``: unique ID for this file (default: + :class:`~bson.objectid.ObjectId`) - this ``"_id"`` must + not have already been used for another file + + - ``"filename"``: human name for the file + + - ``"contentType"`` or ``"content_type"``: valid mime-type + for the file + + - ``"chunkSize"`` or ``"chunk_size"``: size of each of the + chunks, in bytes (default: 255 kb) + + - ``"encoding"``: encoding used for this file. In Python 2, + any :class:`unicode` that is written to the file will be + converted to a :class:`str`. In Python 3, any :class:`str` + that is written to the file will be converted to + :class:`bytes`. + + :Parameters: + - `root_collection`: root collection to write to + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` to use for all + commands + - `disable_md5` (optional): When True, an MD5 checksum will not be + computed for the uploaded file. Useful in environments where + MD5 cannot be used for regulatory or other reasons. Defaults to + False. + - `**kwargs` (optional): file level options (see above) + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.0 + `root_collection` must use an acknowledged + :attr:`~pymongo.collection.Collection.write_concern` + """ + if not isinstance(root_collection, Collection): + raise TypeError("root_collection must be an " + "instance of Collection") + + if not root_collection.write_concern.acknowledged: + raise ConfigurationError('root_collection must use ' + 'acknowledged write_concern') + + # Handle alternative naming + if "content_type" in kwargs: + kwargs["contentType"] = kwargs.pop("content_type") + if "chunk_size" in kwargs: + kwargs["chunkSize"] = kwargs.pop("chunk_size") + + coll = _clear_entity_type_registry( + root_collection, read_preference=ReadPreference.PRIMARY) + + if not disable_md5: + kwargs["md5"] = hashlib.md5() + # Defaults + kwargs["_id"] = kwargs.get("_id", ObjectId()) + kwargs["chunkSize"] = kwargs.get("chunkSize", DEFAULT_CHUNK_SIZE) + object.__setattr__(self, "_session", session) + object.__setattr__(self, "_coll", coll) + object.__setattr__(self, "_chunks", coll.chunks) + object.__setattr__(self, "_file", kwargs) + object.__setattr__(self, "_buffer", StringIO()) + object.__setattr__(self, "_position", 0) + object.__setattr__(self, "_chunk_number", 0) + object.__setattr__(self, "_closed", False) + object.__setattr__(self, "_ensured_index", False) + + def __create_index(self, collection, index_key, unique): + doc = collection.find_one(projection={"_id": 1}, session=self._session) + if doc is None: + try: + index_keys = [index_spec['key'] for index_spec in + collection.list_indexes(session=self._session)] + except OperationFailure: + index_keys = [] + if index_key not in index_keys: + collection.create_index( + index_key.items(), unique=unique, session=self._session) + + def __ensure_indexes(self): + if not object.__getattribute__(self, "_ensured_index"): + self.__create_index(self._coll.files, _F_INDEX, False) + self.__create_index(self._coll.chunks, _C_INDEX, True) + object.__setattr__(self, "_ensured_index", True) + + def abort(self): + """Remove all chunks/files that may have been uploaded and close. + """ + self._coll.chunks.delete_many( + {"files_id": self._file['_id']}, session=self._session) + self._coll.files.delete_one( + {"_id": self._file['_id']}, session=self._session) + object.__setattr__(self, "_closed", True) + + @property + def closed(self): + """Is this file closed? + """ + return self._closed + + _id = _grid_in_property("_id", "The ``'_id'`` value for this file.", + read_only=True) + filename = _grid_in_property("filename", "Name of this file.") + name = _grid_in_property("filename", "Alias for `filename`.") + content_type = _grid_in_property("contentType", "Mime-type for this file.") + length = _grid_in_property("length", "Length (in bytes) of this file.", + closed_only=True) + chunk_size = _grid_in_property("chunkSize", "Chunk size for this file.", + read_only=True) + upload_date = _grid_in_property("uploadDate", + "Date that this file was uploaded.", + closed_only=True) + md5 = _grid_in_property("md5", "MD5 of the contents of this file " + "if an md5 sum was created.", + closed_only=True) + + def __getattr__(self, name): + if name in self._file: + return self._file[name] + raise AttributeError("GridIn object has no attribute '%s'" % name) + + def __setattr__(self, name, value): + # For properties of this instance like _buffer, or descriptors set on + # the class like filename, use regular __setattr__ + if name in self.__dict__ or name in self.__class__.__dict__: + object.__setattr__(self, name, value) + else: + # All other attributes are part of the document in db.fs.files. + # Store them to be sent to server on close() or if closed, send + # them now. + self._file[name] = value + if self._closed: + self._coll.files.update_one({"_id": self._file["_id"]}, + {"$set": {name: value}}) + + def __flush_data(self, data): + """Flush `data` to a chunk. + """ + self.__ensure_indexes() + if 'md5' in self._file: + self._file['md5'].update(data) + + if not data: + return + assert(len(data) <= self.chunk_size) + + chunk = {"files_id": self._file["_id"], + "n": self._chunk_number, + "data": Binary(data)} + + try: + self._chunks.insert_one(chunk, session=self._session) + except DuplicateKeyError: + self._raise_file_exists(self._file['_id']) + self._chunk_number += 1 + self._position += len(data) + + def __flush_buffer(self): + """Flush the buffer contents out to a chunk. + """ + self.__flush_data(self._buffer.getvalue()) + self._buffer.close() + self._buffer = StringIO() + + def __flush(self): + """Flush the file to the database. + """ + try: + self.__flush_buffer() + + if "md5" in self._file: + self._file["md5"] = self._file["md5"].hexdigest() + self._file["length"] = self._position + self._file["uploadDate"] = datetime.datetime.utcnow() + + return self._coll.files.insert_one( + self._file, session=self._session) + except DuplicateKeyError: + self._raise_file_exists(self._id) + + def _raise_file_exists(self, file_id): + """Raise a FileExists exception for the given file_id.""" + raise FileExists("file with _id %r already exists" % file_id) + + def close(self): + """Flush the file and close it. + + A closed file cannot be written any more. Calling + :meth:`close` more than once is allowed. + """ + if not self._closed: + self.__flush() + object.__setattr__(self, "_closed", True) + + def read(self, size=-1): + raise io.UnsupportedOperation('read') + + def readable(self): + return False + + def seekable(self): + return False + + def write(self, data): + """Write data to the file. There is no return value. + + `data` can be either a string of bytes or a file-like object + (implementing :meth:`read`). If the file has an + :attr:`encoding` attribute, `data` can also be a + :class:`unicode` (:class:`str` in python 3) instance, which + will be encoded as :attr:`encoding` before being written. + + Due to buffering, the data may not actually be written to the + database until the :meth:`close` method is called. Raises + :class:`ValueError` if this file is already closed. Raises + :class:`TypeError` if `data` is not an instance of + :class:`str` (:class:`bytes` in python 3), a file-like object, + or an instance of :class:`unicode` (:class:`str` in python 3). + Unicode data is only allowed if the file has an :attr:`encoding` + attribute. + + :Parameters: + - `data`: string of bytes or file-like object to be written + to the file + """ + if self._closed: + raise ValueError("cannot write to a closed file") + + try: + # file-like + read = data.read + except AttributeError: + # string + if not isinstance(data, (text_type, bytes)): + raise TypeError("can only write strings or file-like objects") + if isinstance(data, text_type): + try: + data = data.encode(self.encoding) + except AttributeError: + raise TypeError("must specify an encoding for file in " + "order to write %s" % (text_type.__name__,)) + read = StringIO(data).read + + if self._buffer.tell() > 0: + # Make sure to flush only when _buffer is complete + space = self.chunk_size - self._buffer.tell() + if space: + try: + to_write = read(space) + except: + self.abort() + raise + self._buffer.write(to_write) + if len(to_write) < space: + return # EOF or incomplete + self.__flush_buffer() + to_write = read(self.chunk_size) + while to_write and len(to_write) == self.chunk_size: + self.__flush_data(to_write) + to_write = read(self.chunk_size) + self._buffer.write(to_write) + + def writelines(self, sequence): + """Write a sequence of strings to the file. + + Does not add seperators. + """ + for line in sequence: + self.write(line) + + def writeable(self): + return True + + def __enter__(self): + """Support for the context manager protocol. + """ + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + """Support for the context manager protocol. + + Close the file and allow exceptions to propagate. + """ + self.close() + + # propagate exceptions + return False + + +class GridOut(object): + """Class to read data out of GridFS. + """ + def __init__(self, root_collection, file_id=None, file_document=None, + session=None): + """Read a file from GridFS + + Application developers should generally not need to + instantiate this class directly - instead see the methods + provided by :class:`~gridfs.GridFS`. + + Either `file_id` or `file_document` must be specified, + `file_document` will be given priority if present. Raises + :class:`TypeError` if `root_collection` is not an instance of + :class:`~pymongo.collection.Collection`. + + :Parameters: + - `root_collection`: root collection to read from + - `file_id` (optional): value of ``"_id"`` for the file to read + - `file_document` (optional): file document from + `root_collection.files` + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` to use for all + commands + + .. versionchanged:: 3.8 + For better performance and to better follow the GridFS spec, + :class:`GridOut` now uses a single cursor to read all the chunks in + the file. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.0 + Creating a GridOut does not immediately retrieve the file metadata + from the server. Metadata is fetched when first needed. + """ + if not isinstance(root_collection, Collection): + raise TypeError("root_collection must be an " + "instance of Collection") + + root_collection = _clear_entity_type_registry(root_collection) + + self.__chunks = root_collection.chunks + self.__files = root_collection.files + self.__file_id = file_id + self.__buffer = EMPTY + self.__chunk_iter = None + self.__position = 0 + self._file = file_document + self._session = session + + _id = _grid_out_property("_id", "The ``'_id'`` value for this file.") + filename = _grid_out_property("filename", "Name of this file.") + name = _grid_out_property("filename", "Alias for `filename`.") + content_type = _grid_out_property("contentType", "Mime-type for this file.") + length = _grid_out_property("length", "Length (in bytes) of this file.") + chunk_size = _grid_out_property("chunkSize", "Chunk size for this file.") + upload_date = _grid_out_property("uploadDate", + "Date that this file was first uploaded.") + aliases = _grid_out_property("aliases", "List of aliases for this file.") + metadata = _grid_out_property("metadata", "Metadata attached to this file.") + md5 = _grid_out_property("md5", "MD5 of the contents of this file " + "if an md5 sum was created.") + + def _ensure_file(self): + if not self._file: + self._file = self.__files.find_one({"_id": self.__file_id}, + session=self._session) + if not self._file: + raise NoFile("no file in gridfs collection %r with _id %r" % + (self.__files, self.__file_id)) + + def __getattr__(self, name): + self._ensure_file() + if name in self._file: + return self._file[name] + raise AttributeError("GridOut object has no attribute '%s'" % name) + + def readable(self): + return True + + def readchunk(self): + """Reads a chunk at a time. If the current position is within a + chunk the remainder of the chunk is returned. + """ + received = len(self.__buffer) + chunk_data = EMPTY + chunk_size = int(self.chunk_size) + + if received > 0: + chunk_data = self.__buffer + elif self.__position < int(self.length): + chunk_number = int((received + self.__position) / chunk_size) + if self.__chunk_iter is None: + self.__chunk_iter = _GridOutChunkIterator( + self, self.__chunks, self._session, chunk_number) + + chunk = self.__chunk_iter.next() + chunk_data = chunk["data"][self.__position % chunk_size:] + + if not chunk_data: + raise CorruptGridFile("truncated chunk") + + self.__position += len(chunk_data) + self.__buffer = EMPTY + return chunk_data + + def read(self, size=-1): + """Read at most `size` bytes from the file (less if there + isn't enough data). + + The bytes are returned as an instance of :class:`str` (:class:`bytes` + in python 3). If `size` is negative or omitted all data is read. + + :Parameters: + - `size` (optional): the number of bytes to read + + .. versionchanged:: 3.8 + This method now only checks for extra chunks after reading the + entire file. Previously, this method would check for extra chunks + on every call. + """ + self._ensure_file() + + remainder = int(self.length) - self.__position + if size < 0 or size > remainder: + size = remainder + + if size == 0: + return EMPTY + + received = 0 + data = StringIO() + while received < size: + chunk_data = self.readchunk() + received += len(chunk_data) + data.write(chunk_data) + + # Detect extra chunks after reading the entire file. + if size == remainder and self.__chunk_iter: + try: + self.__chunk_iter.next() + except StopIteration: + pass + + self.__position -= received - size + + # Return 'size' bytes and store the rest. + data.seek(size) + self.__buffer = data.read() + data.seek(0) + return data.read(size) + + def readline(self, size=-1): + """Read one line or up to `size` bytes from the file. + + :Parameters: + - `size` (optional): the maximum number of bytes to read + """ + remainder = int(self.length) - self.__position + if size < 0 or size > remainder: + size = remainder + + if size == 0: + return EMPTY + + received = 0 + data = StringIO() + while received < size: + chunk_data = self.readchunk() + pos = chunk_data.find(NEWLN, 0, size) + if pos != -1: + size = received + pos + 1 + + received += len(chunk_data) + data.write(chunk_data) + if pos != -1: + break + + self.__position -= received - size + + # Return 'size' bytes and store the rest. + data.seek(size) + self.__buffer = data.read() + data.seek(0) + return data.read(size) + + def tell(self): + """Return the current position of this file. + """ + return self.__position + + def seek(self, pos, whence=_SEEK_SET): + """Set the current position of this file. + + :Parameters: + - `pos`: the position (or offset if using relative + positioning) to seek to + - `whence` (optional): where to seek + from. :attr:`os.SEEK_SET` (``0``) for absolute file + positioning, :attr:`os.SEEK_CUR` (``1``) to seek relative + to the current position, :attr:`os.SEEK_END` (``2``) to + seek relative to the file's end. + """ + if whence == _SEEK_SET: + new_pos = pos + elif whence == _SEEK_CUR: + new_pos = self.__position + pos + elif whence == _SEEK_END: + new_pos = int(self.length) + pos + else: + raise IOError(22, "Invalid value for `whence`") + + if new_pos < 0: + raise IOError(22, "Invalid value for `pos` - must be positive") + + # Optimization, continue using the same buffer and chunk iterator. + if new_pos == self.__position: + return + + self.__position = new_pos + self.__buffer = EMPTY + if self.__chunk_iter: + self.__chunk_iter.close() + self.__chunk_iter = None + + def seekable(self): + return True + + def __iter__(self): + """Return an iterator over all of this file's data. + + The iterator will return chunk-sized instances of + :class:`str` (:class:`bytes` in python 3). This can be + useful when serving files using a webserver that handles + such an iterator efficiently. + + .. note:: + This is different from :py:class:`io.IOBase` which iterates over + *lines* in the file. Use :meth:`GridOut.readline` to read line by + line instead of chunk by chunk. + + .. versionchanged:: 3.8 + The iterator now raises :class:`CorruptGridFile` when encountering + any truncated, missing, or extra chunk in a file. The previous + behavior was to only raise :class:`CorruptGridFile` on a missing + chunk. + """ + return GridOutIterator(self, self.__chunks, self._session) + + def close(self): + """Make GridOut more generically file-like.""" + if self.__chunk_iter: + self.__chunk_iter.close() + self.__chunk_iter = None + + def write(self, value): + raise io.UnsupportedOperation('write') + + def __enter__(self): + """Makes it possible to use :class:`GridOut` files + with the context manager protocol. + """ + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + """Makes it possible to use :class:`GridOut` files + with the context manager protocol. + """ + self.close() + return False + + +class _GridOutChunkIterator(object): + """Iterates over a file's chunks using a single cursor. + + Raises CorruptGridFile when encountering any truncated, missing, or extra + chunk in a file. + """ + def __init__(self, grid_out, chunks, session, next_chunk): + self._id = grid_out._id + self._chunk_size = int(grid_out.chunk_size) + self._length = int(grid_out.length) + self._chunks = chunks + self._session = session + self._next_chunk = next_chunk + self._num_chunks = math.ceil(float(self._length) / self._chunk_size) + self._cursor = None + + def expected_chunk_length(self, chunk_n): + if chunk_n < self._num_chunks - 1: + return self._chunk_size + return self._length - (self._chunk_size * (self._num_chunks - 1)) + + def __iter__(self): + return self + + def _create_cursor(self): + filter = {"files_id": self._id} + if self._next_chunk > 0: + filter["n"] = {"$gte": self._next_chunk} + self._cursor = self._chunks.find(filter, sort=[("n", 1)], + session=self._session) + + def _next_with_retry(self): + """Return the next chunk and retry once on CursorNotFound. + + We retry on CursorNotFound to maintain backwards compatibility in + cases where two calls to read occur more than 10 minutes apart (the + server's default cursor timeout). + """ + if self._cursor is None: + self._create_cursor() + + try: + return self._cursor.next() + except CursorNotFound: + self._cursor.close() + self._create_cursor() + return self._cursor.next() + + def next(self): + try: + chunk = self._next_with_retry() + except StopIteration: + if self._next_chunk >= self._num_chunks: + raise + raise CorruptGridFile("no chunk #%d" % self._next_chunk) + + if chunk["n"] != self._next_chunk: + self.close() + raise CorruptGridFile( + "Missing chunk: expected chunk #%d but found " + "chunk with n=%d" % (self._next_chunk, chunk["n"])) + + if chunk["n"] >= self._num_chunks: + # According to spec, ignore extra chunks if they are empty. + if len(chunk["data"]): + self.close() + raise CorruptGridFile( + "Extra chunk found: expected %d chunks but found " + "chunk with n=%d" % (self._num_chunks, chunk["n"])) + + expected_length = self.expected_chunk_length(chunk["n"]) + if len(chunk["data"]) != expected_length: + self.close() + raise CorruptGridFile( + "truncated chunk #%d: expected chunk length to be %d but " + "found chunk with length %d" % ( + chunk["n"], expected_length, len(chunk["data"]))) + + self._next_chunk += 1 + return chunk + + __next__ = next + + def close(self): + if self._cursor: + self._cursor.close() + self._cursor = None + + +class GridOutIterator(object): + def __init__(self, grid_out, chunks, session): + self.__chunk_iter = _GridOutChunkIterator(grid_out, chunks, session, 0) + + def __iter__(self): + return self + + def next(self): + chunk = self.__chunk_iter.next() + return bytes(chunk["data"]) + + __next__ = next + + +class GridOutCursor(Cursor): + """A cursor / iterator for returning GridOut objects as the result + of an arbitrary query against the GridFS files collection. + """ + def __init__(self, collection, filter=None, skip=0, limit=0, + no_cursor_timeout=False, sort=None, batch_size=0, + session=None): + """Create a new cursor, similar to the normal + :class:`~pymongo.cursor.Cursor`. + + Should not be called directly by application developers - see + the :class:`~gridfs.GridFS` method :meth:`~gridfs.GridFS.find` instead. + + .. versionadded 2.7 + + .. mongodoc:: cursors + """ + collection = _clear_entity_type_registry(collection) + + # Hold on to the base "fs" collection to create GridOut objects later. + self.__root_collection = collection + + super(GridOutCursor, self).__init__( + collection.files, filter, skip=skip, limit=limit, + no_cursor_timeout=no_cursor_timeout, sort=sort, + batch_size=batch_size, session=session) + + def next(self): + """Get next GridOut object from cursor. + """ + # Work around "super is not iterable" issue in Python 3.x + next_file = super(GridOutCursor, self).next() + return GridOut(self.__root_collection, file_document=next_file, + session=self.session) + + __next__ = next + + def add_option(self, *args, **kwargs): + raise NotImplementedError("Method does not exist for GridOutCursor") + + def remove_option(self, *args, **kwargs): + raise NotImplementedError("Method does not exist for GridOutCursor") + + def _clone_base(self, session): + """Creates an empty GridOutCursor for information to be copied into. + """ + return GridOutCursor(self.__root_collection, session=session) diff --git a/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/INSTALLER b/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/LICENSE.txt b/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/METADATA b/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/METADATA new file mode 100644 index 0000000..5f48a62 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/METADATA @@ -0,0 +1,75 @@ +Metadata-Version: 2.1 +Name: pip +Version: 19.1 +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 +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.* + +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/ + + diff --git a/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/RECORD b/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/RECORD new file mode 100644 index 0000000..b748a3c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/RECORD @@ -0,0 +1,618 @@ +pip/__init__.py,sha256=FmpL3q9nmKqFLOCMcYN8LoGCA7mrESG-HiX5Ksm8Kls,21 +pip/__main__.py,sha256=L3IHqBeasELUHvwy5CT_izVEMhM12tve289qut49DvU,623 +pip/_internal/__init__.py,sha256=Di4rpoQhA2Kx0Dm0THczf61CDOXcPokR2FIpyKkRm1Y,2870 +pip/_internal/build_env.py,sha256=ZUpR-00pxQc-Mw750jyBVA-oWb4WHtpK63pfiTHd8qU,7392 +pip/_internal/cache.py,sha256=PQesJm1JrjgAya3VyV6qkbnfACG23c1wQ7PaSw_0F-Y,7656 +pip/_internal/configuration.py,sha256=xit1f8ZdnHz-AHzWAKTUa_gZzlIIM-5AgK30glB71ik,13115 +pip/_internal/download.py,sha256=0_8jUtL4SLZe4qo8Fe66qkbO69gUG-IPbp932WOHyFs,35147 +pip/_internal/exceptions.py,sha256=ryXWmEJpSHr3yXXk1efWHSzQwAjBdBJiKR5kCQvjgPA,9117 +pip/_internal/index.py,sha256=jVzHqVuP2CJh9YCyp2Zbx1NSmE_VBxhc26fYKF8aer8,42130 +pip/_internal/locations.py,sha256=-N3f1I24gcPTdW52onPnySDoQUIn_TtPYV99WwsjxRE,6932 +pip/_internal/pep425tags.py,sha256=jyBorYxepVJeHNo69TE-3UxJXsGO2XvGxveSWQDi_Wo,13128 +pip/_internal/pyproject.py,sha256=I1S69bAIy0kwKZSkP3Mz5cdbXXlBSfuQHmdCCm9bwJ4,10788 +pip/_internal/resolve.py,sha256=rZDMkyhUIbaytY9KsYQVez8nl21xLXgaDt8xuHvyGMI,15128 +pip/_internal/wheel.py,sha256=-MijhN1BIuaQkb3909smA63wkbvdRrdtr1CUDxnQTqA,41189 +pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 +pip/_internal/cli/autocompletion.py,sha256=ptvsMdGjq42pzoY4skABVF43u2xAtLJlXAulPi-A10Y,6083 +pip/_internal/cli/base_command.py,sha256=2SbVZ2o3KmVdeJlK4l1lP6y_ZMFZ8VkDp9ns1ByZ-xM,12629 +pip/_internal/cli/cmdoptions.py,sha256=IA1XAgTJ1oWXp1oF3CkE8mpUx8vqIysyd7hlEZk7wWE,23813 +pip/_internal/cli/main_parser.py,sha256=YH_w_hApq2pyS_G5tZlbIe7g_HUIcKE820jhnv0piVA,3002 +pip/_internal/cli/parser.py,sha256=VZKUKJPbU6I2cHPLDOikin-aCx7OvLcZ3fzYp3xytd8,9378 +pip/_internal/cli/status_codes.py,sha256=F6uDG6Gj7RNKQJUDnd87QKqI16Us-t-B0wPF_4QMpWc,156 +pip/_internal/commands/__init__.py,sha256=7fscm9bUGJInZwWY7VjH2pPC7HUWQWyjYMEIB33L9CY,2223 +pip/_internal/commands/check.py,sha256=liigNVif0iz2mBfhvsajrLZT5zM5KIvgmKvhAW91EzA,1430 +pip/_internal/commands/completion.py,sha256=hqvCvoxsIHjysiD7olHKTqK2lzE1_lS6LWn69kN5qyI,2929 +pip/_internal/commands/configuration.py,sha256=Il76e-ERfEHtW2GbV1aTR6o-xurh-LVv2NCea7erP4s,8020 +pip/_internal/commands/download.py,sha256=XPe3Kuj9iZfXwOiJq70mYVYNZD5lJCLnGT_C61cOsKw,6623 +pip/_internal/commands/freeze.py,sha256=VvS3G0wrm_9BH3B7Ex5msLL_1UQTtCq5G8dDI63Iemo,3259 +pip/_internal/commands/hash.py,sha256=K1JycsD-rpjqrRcL_ijacY9UKmI82pQcLYq4kCM4Pv0,1681 +pip/_internal/commands/help.py,sha256=MwBhPJpW1Dt3GfJV3V8V6kgAy_pXT0jGrZJB1wCTW-E,1090 +pip/_internal/commands/install.py,sha256=vSb8TfUHwz3HJ5cA-JnPP3X84ONQ0wkCztw0pHFbmsc,22841 +pip/_internal/commands/list.py,sha256=EtKEUotPbLCzzcWrZqEiEXi4ic00dgUOKUeNU0y7Pfg,10166 +pip/_internal/commands/search.py,sha256=sLZ9icKMEEGekHvzRRZMiTd1zCFIZeDptyyU1mQCYzk,4728 +pip/_internal/commands/show.py,sha256=bE-ucu8fAjTTENpRRKhwD3QSWR8Rss7YgKAbMJoxock,6273 +pip/_internal/commands/uninstall.py,sha256=h0gfPF5jylDESx_IHgF6bZME7QAEOHzQHdn65GP-jrE,2963 +pip/_internal/commands/wheel.py,sha256=7MNPZqK9WWxZC3TgzvMBH-RPRlOFLpwq927lkzUiUjI,7167 +pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 +pip/_internal/models/candidate.py,sha256=_IzS-yw0h2UHfZALsZ2mxkeGNSNuNGspjSn2JfZ-ZHM,1045 +pip/_internal/models/format_control.py,sha256=ap8Swa26ocSXBxIuCvaDBRZjxdKUFuwC-bfqXQHWtKw,2250 +pip/_internal/models/index.py,sha256=K59A8-hVhBM20Xkahr4dTwP7OjkJyEqXH11UwHFVgqM,1060 +pip/_internal/models/link.py,sha256=Hqu72UgH266njr2z2kTnIG-sQiPtjENDbPqXFzT-84s,4783 +pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/check.py,sha256=CZHaksHKUMo58wGHGhhKlPrpcRMHObouzzyd9pMRFt8,5109 +pip/_internal/operations/freeze.py,sha256=_Ffl2HpoWLLHaiB1XyTjKIA3QWC8H-E1ib6xJgX_mRE,9279 +pip/_internal/operations/prepare.py,sha256=hqzdPNAJLZVEpJQATn_0aSMJqy8xPvW36j9mjFKw54s,17102 +pip/_internal/req/__init__.py,sha256=Y2SjAuMFsSt3dkiK8kkiQAfv8sHrjl0PAT63FKFT0tM,2364 +pip/_internal/req/constructors.py,sha256=4KlO_-G89XYZW1VnzHwV34oCvR6ilmxFqSSGLgv4PEw,11399 +pip/_internal/req/req_file.py,sha256=mZoQvhHZJwgljrXDH8CLXaNoUK4sM8_bRfK9Po2fM80,13714 +pip/_internal/req/req_install.py,sha256=sLu2Z3CKEtnKUI0j0QsDuPidlU2PJihxm7K_O-5Jm3A,40068 +pip/_internal/req/req_set.py,sha256=PaDc5EswLQhxBMFbuKbJ0frZbMNKocmA8OGqIWT-9EY,7860 +pip/_internal/req/req_tracker.py,sha256=wBpDzSDSYwpUfW4K43NrEOCCp1r6stuubfLc65Y95EM,3129 +pip/_internal/req/req_uninstall.py,sha256=rVOk8BRM_L9rsUUr9lmkV6Lm9N1Os7TEIDir6tT1Q7U,23105 +pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/utils/appdirs.py,sha256=r9i0BZLK9KcvrzI5tqlw8ehRTtSehWGERFLy7YppG3g,9398 +pip/_internal/utils/compat.py,sha256=Q0cmYGBaKB4tV5E0CG11339YLxuCaqdUCSJd9vinMc8,8551 +pip/_internal/utils/deprecation.py,sha256=HYUvfCZUxwLIFlYHeZM3VmuFhXTdlw0rk4-cC14bKw4,3080 +pip/_internal/utils/encoding.py,sha256=tudXCoAPe9fZvNK4cmWQs2frREZ-QuGCwF_SlTyz6cI,1218 +pip/_internal/utils/filesystem.py,sha256=ojaIDvOFOtkpKme5se6X2N8ARmQxu8cxvaaI-NFqVtk,990 +pip/_internal/utils/glibc.py,sha256=9_1wY9Lmca4xzOQDF1A6ITW_N80j_BXwN7Sx7vBqP4k,3282 +pip/_internal/utils/hashes.py,sha256=_6l8M_nqmLZjs-o2lP2rB7ZleAT05WOuqgwBa8uFYR8,3527 +pip/_internal/utils/logging.py,sha256=qSYK7Wf_oiCr1VR4qvAq_TtpY3SIKSlVDgnAeQqSjHc,11671 +pip/_internal/utils/misc.py,sha256=QsYl2j5rU5Mh_CEsSf1W8GB6HvPOfioj30Emqz7mg7s,32434 +pip/_internal/utils/models.py,sha256=DQYZSRhjvSdDTAaJLLCpDtxAn1S_-v_8nlNjv4T2jwY,1042 +pip/_internal/utils/outdated.py,sha256=sEe1l902jiOl3tArf6omqVd44s4BT9DOk3a3CXtJNNI,5868 +pip/_internal/utils/packaging.py,sha256=frr5M-ORe30rRKbH6pwqp_jkX1T8rx-UGDlj8vG5HII,2743 +pip/_internal/utils/setuptools_build.py,sha256=0blfscmNJW_iZ5DcswJeDB_PbtTEjfK9RL1R1WEDW2E,278 +pip/_internal/utils/temp_dir.py,sha256=0Xq5ZlOd2OOeHwKM6hGy66gnMGAbyhio7DtjLHd7DFg,5339 +pip/_internal/utils/typing.py,sha256=bF73ImJzIaxLLEVwfEaSJzFGqV9LaxkQBvDULIyr1jI,1125 +pip/_internal/utils/ui.py,sha256=yRqmi2V4OeTYP9SnXhuXKlyRx8xJ79AjLRgvLCZ4E1E,13812 +pip/_internal/vcs/__init__.py,sha256=kgwOhkt6ddbKosZytktLydMUb_e-JpXMstJF9YpSOwM,19205 +pip/_internal/vcs/bazaar.py,sha256=3lA6CKyrYpoJuxjTa8oTozszNcqdYILqEhKLJ41RMug,3231 +pip/_internal/vcs/git.py,sha256=x0PQDgzWho544gfqtE9CXoUkN34zE4YkpgrbTcWEte4,12960 +pip/_internal/vcs/mercurial.py,sha256=AbH4IWdLCsjUxFnIHRvijV-7SNhfjDZJJFzQ1e_b48Q,3355 +pip/_internal/vcs/subversion.py,sha256=cMH4MEobSj68gaSiBD53KXVJnEbhtuUJjL8U1Kk_v70,8167 +pip/_vendor/__init__.py,sha256=iip2nWwH_riYqnDnM0q4BJFrWE-XWjYfxCejJKct0WM,4654 +pip/_vendor/appdirs.py,sha256=BENKsvcA08IpccD9345-rMrg3aXWFA1q6BFEglnHg6I,24547 +pip/_vendor/distro.py,sha256=X2So5kjrRKyMbQJ90Xgy93HU5eFtujCzKaYNeoy1k1c,43251 +pip/_vendor/ipaddress.py,sha256=2OgbkeAD2rLkcXqbcvof3J5R7lRwjNLoBySyTkBtKnc,79852 +pip/_vendor/pyparsing.py,sha256=sxGUe_YcWBB5ZoHec0m1iJtgcj4iKv_SGfdA_zVCYII,245385 +pip/_vendor/retrying.py,sha256=k3fflf5_Mm0XcIJYhB7Tj34bqCCPhUDkYbx1NvW2FPE,9972 +pip/_vendor/six.py,sha256=h9jch2pS86y4R36pKRS3LOYUCVFNIJMRwjZ4fJDtJ44,32452 +pip/_vendor/cachecontrol/__init__.py,sha256=6cRPchVqkAkeUtYTSW8qCetjSqJo-GxP-n4VMVDbvmc,302 +pip/_vendor/cachecontrol/_cmd.py,sha256=URGE0KrA87QekCG3SGPatlSPT571dZTDjNa-ZXX3pDc,1295 +pip/_vendor/cachecontrol/adapter.py,sha256=eBGAtVNRZgtl_Kj5JV54miqL9YND-D0JZPahwY8kFtY,4863 +pip/_vendor/cachecontrol/cache.py,sha256=1fc4wJP8HYt1ycnJXeEw5pCpeBL2Cqxx6g9Fb0AYDWQ,805 +pip/_vendor/cachecontrol/compat.py,sha256=kHNvMRdt6s_Xwqq_9qJmr9ou3wYMOMUMxPPcwNxT8Mc,695 +pip/_vendor/cachecontrol/controller.py,sha256=U7g-YwizQ2O5NRgK_MZreF1ntM4E49C3PuF3od-Vwz4,13698 +pip/_vendor/cachecontrol/filewrapper.py,sha256=vACKO8Llzu_ZWyjV1Fxn1MA4TGU60N5N3GSrAFdAY2Q,2533 +pip/_vendor/cachecontrol/heuristics.py,sha256=BFGHJ3yQcxvZizfo90LLZ04T_Z5XSCXvFotrp7Us0sc,4070 +pip/_vendor/cachecontrol/serialize.py,sha256=GebE34fgToyWwAsRPguh8hEPN6CqoG-5hRMXRsjVABQ,6954 +pip/_vendor/cachecontrol/wrapper.py,sha256=sfr9YHWx-5TwNz1H5rT6QOo8ggII6v3vbEDjQFwR6wc,671 +pip/_vendor/cachecontrol/caches/__init__.py,sha256=-gHNKYvaeD0kOk5M74eOrsSgIKUtC6i6GfbmugGweEo,86 +pip/_vendor/cachecontrol/caches/file_cache.py,sha256=8vrSzzGcdfEfICago1uSFbkumNJMGLbCdEkXsmUIExw,4177 +pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=HxelMpNCo-dYr2fiJDwM3hhhRmxUYtB5tXm1GpAAT4Y,856 +pip/_vendor/certifi/__init__.py,sha256=-M1moep9D6jZnOAT0qnM1dpoEHMPage7Osv5xLRLyFg,52 +pip/_vendor/certifi/__main__.py,sha256=NaCn6WtWME-zzVWQ2j4zFyl8cY4knDa9CwtHNIeFPhM,53 +pip/_vendor/certifi/cacert.pem,sha256=OXuDPlrPiaJwm5ZEAamspo0ktiNJtyu-OGhOWGqgeic,284518 +pip/_vendor/certifi/core.py,sha256=EuFc2BsToG5O1-qsx4BSjQ1r1-7WRtH87b1WflZOWhI,218 +pip/_vendor/chardet/__init__.py,sha256=YsP5wQlsHJ2auF1RZJfypiSrCA7_bQiRm3ES_NI76-Y,1559 +pip/_vendor/chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254 +pip/_vendor/chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757 +pip/_vendor/chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411 +pip/_vendor/chardet/charsetgroupprober.py,sha256=6bDu8YIiRuScX4ca9Igb0U69TA2PGXXDej6Cc4_9kO4,3787 +pip/_vendor/chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110 +pip/_vendor/chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590 +pip/_vendor/chardet/compat.py,sha256=PKTzHkSbtbHDqS9PyujMbX74q1a8mMpeQTDVsQhZMRw,1134 +pip/_vendor/chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855 +pip/_vendor/chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661 +pip/_vendor/chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950 +pip/_vendor/chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510 +pip/_vendor/chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749 +pip/_vendor/chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546 +pip/_vendor/chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748 +pip/_vendor/chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621 +pip/_vendor/chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747 +pip/_vendor/chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715 +pip/_vendor/chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754 +pip/_vendor/chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838 +pip/_vendor/chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777 +pip/_vendor/chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643 +pip/_vendor/chardet/langbulgarianmodel.py,sha256=1HqQS9Pbtnj1xQgxitJMvw8X6kKr5OockNCZWfEQrPE,12839 +pip/_vendor/chardet/langcyrillicmodel.py,sha256=LODajvsetH87yYDDQKA2CULXUH87tI223dhfjh9Zx9c,17948 +pip/_vendor/chardet/langgreekmodel.py,sha256=8YAW7bU8YwSJap0kIJSbPMw1BEqzGjWzqcqf0WgUKAA,12688 +pip/_vendor/chardet/langhebrewmodel.py,sha256=JSnqmE5E62tDLTPTvLpQsg5gOMO4PbdWRvV7Avkc0HA,11345 +pip/_vendor/chardet/langhungarianmodel.py,sha256=RhapYSG5l0ZaO-VV4Fan5sW0WRGQqhwBM61yx3yxyOA,12592 +pip/_vendor/chardet/langthaimodel.py,sha256=8l0173Gu_W6G8mxmQOTEF4ls2YdE7FxWf3QkSxEGXJQ,11290 +pip/_vendor/chardet/langturkishmodel.py,sha256=W22eRNJsqI6uWAfwXSKVWWnCerYqrI8dZQTm_M0lRFk,11102 +pip/_vendor/chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370 +pip/_vendor/chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413 +pip/_vendor/chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012 +pip/_vendor/chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481 +pip/_vendor/chardet/sbcharsetprober.py,sha256=LDSpCldDCFlYwUkGkwD2oFxLlPWIWXT09akH_2PiY74,5657 +pip/_vendor/chardet/sbcsgroupprober.py,sha256=1IprcCB_k1qfmnxGC6MBbxELlKqD3scW6S8YIwdeyXA,3546 +pip/_vendor/chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774 +pip/_vendor/chardet/universaldetector.py,sha256=qL0174lSZE442eB21nnktT9_VcAye07laFWUeUrjttY,12485 +pip/_vendor/chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766 +pip/_vendor/chardet/version.py,sha256=sp3B08mrDXB-pf3K9fqJ_zeDHOCLC8RrngQyDFap_7g,242 +pip/_vendor/chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +pip/_vendor/chardet/cli/chardetect.py,sha256=DI8dlV3FBD0c0XA_y3sQ78z754DUv1J8n34RtDjOXNw,2774 +pip/_vendor/colorama/__init__.py,sha256=lJdY6COz9uM_pXwuk9oLr0fp8H8q2RrUqN16GKabvq4,239 +pip/_vendor/colorama/ansi.py,sha256=Fi0un-QLqRm-v7o_nKiOqyC8PapBJK7DLV_q9LKtTO0,2524 +pip/_vendor/colorama/ansitowin32.py,sha256=u8QaqdqS_xYSfNkPM1eRJLHz6JMWPodaJaP0mxgHCDc,10462 +pip/_vendor/colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915 +pip/_vendor/colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404 +pip/_vendor/colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438 +pip/_vendor/distlib/__init__.py,sha256=7uthK6m96pTekk8hjlT-MybcwYmmxwP8gEOxXVg1f2s,581 +pip/_vendor/distlib/compat.py,sha256=xdNZmqFN5HwF30HjRn5M415pcC2kgXRBXn767xS8v-M,41404 +pip/_vendor/distlib/database.py,sha256=-KJH63AJ7hqjLtGCwOTrionhKr2Vsytdwkjyo8UdEco,51029 +pip/_vendor/distlib/index.py,sha256=Dd1kIV06XIdynNpKxHMMRRIKsXuoUsG7QIzntfVtZCI,21073 +pip/_vendor/distlib/locators.py,sha256=S9G2IsZp0RnMMbXGrT-gu7892pNpy1XMlUEuUHX3OI8,51828 +pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811 +pip/_vendor/distlib/markers.py,sha256=6Ac3cCfFBERexiESWIOXmg-apIP8l2esafNSX3KMy-8,4387 +pip/_vendor/distlib/metadata.py,sha256=BNCnpRfFVslyZcosr4vnE_YbkRb3TNxXtk7TrDszJdc,40172 +pip/_vendor/distlib/resources.py,sha256=2FGv0ZHF14KXjLIlL0R991lyQQGcewOS4mJ-5n-JVnc,10766 +pip/_vendor/distlib/scripts.py,sha256=NYqRJ2uuEuJwr_NNLzWH0m_s_YsobDFQb6HqxuQ2Sew,16638 +pip/_vendor/distlib/t32.exe,sha256=ftub1bsSPUCOnBn-eCtcarKTk0N0CBEP53BumkIxWJE,92672 +pip/_vendor/distlib/t64.exe,sha256=iChOG627LWTHY8-jzSwlo9SYU5a-0JHwQu4AqDz8I68,102400 +pip/_vendor/distlib/util.py,sha256=gwKL5geJKmtR4GeIUnoMAWjsPPG3tVP_mFxw_Sx-isc,59681 +pip/_vendor/distlib/version.py,sha256=_n7F6juvQGAcn769E_SHa7fOcf5ERlEVymJ_EjPRwGw,23391 +pip/_vendor/distlib/w32.exe,sha256=NPYPpt7PIjVqABEu1CzabbDyHHkJpuw-_qZq_48H0j0,89088 +pip/_vendor/distlib/w64.exe,sha256=Yb-qr1OQEzL8KRGTk-XHUZDwMSljfQeZnVoTk-K4e7E,99328 +pip/_vendor/distlib/wheel.py,sha256=gV53KDG7BgbxsdeKjnATbP47gTEJRNylcIeE1TFin1o,39880 +pip/_vendor/distlib/_backport/__init__.py,sha256=bqS_dTOH6uW9iGgd0uzfpPjo6vZ4xpPZ7kyfZJ2vNaw,274 +pip/_vendor/distlib/_backport/misc.py,sha256=KWecINdbFNOxSOP1fGF680CJnaC6S4fBRgEtaYTw0ig,971 +pip/_vendor/distlib/_backport/shutil.py,sha256=VW1t3uYqUjWZH7jV-6QiimLhnldoV5uIpH4EuiT1jfw,25647 +pip/_vendor/distlib/_backport/sysconfig.cfg,sha256=swZKxq9RY5e9r3PXCrlvQPMsvOdiWZBTHLEbqS8LJLU,2617 +pip/_vendor/distlib/_backport/sysconfig.py,sha256=JdJ9ztRy4Hc-b5-VS74x3nUtdEIVr_OBvMsIb8O2sjc,26964 +pip/_vendor/distlib/_backport/tarfile.py,sha256=Ihp7rXRcjbIKw8COm9wSePV9ARGXbSF9gGXAMn2Q-KU,92628 +pip/_vendor/html5lib/__init__.py,sha256=Ztrn7UvF-wIFAgRBBa0ML-Gu5AffH3BPX_INJx4SaBI,1162 +pip/_vendor/html5lib/_ihatexml.py,sha256=3LBtJMlzgwM8vpQiU1TvGmEEmNH72sV0yD8yS53y07A,16705 +pip/_vendor/html5lib/_inputstream.py,sha256=bPUWcAfJScK4xkjQQaG_HsI2BvEVbFvI0AsodDYPQj0,32552 +pip/_vendor/html5lib/_tokenizer.py,sha256=YAaOEBD6qc5ISq9Xt9Nif1OFgcybTTfMdwqBkZhpAq4,76580 +pip/_vendor/html5lib/_utils.py,sha256=ismpASeqa2jqEPQjHUj8vReAf7yIoKnvLN5fuOw6nv0,4015 +pip/_vendor/html5lib/constants.py,sha256=4lmZWLtEPRLnl8NzftOoYTJdo6jpeMtP6dqQC0g_bWQ,83518 +pip/_vendor/html5lib/html5parser.py,sha256=g5g2ezkusHxhi7b23vK_-d6K6BfIJRbqIQmvQ9z4EgI,118963 +pip/_vendor/html5lib/serializer.py,sha256=yfcfBHse2wDs6ojxn-kieJjLT5s1ipilQJ0gL3-rJis,15758 +pip/_vendor/html5lib/_trie/__init__.py,sha256=8VR1bcgD2OpeS2XExpu5yBhP_Q1K-lwKbBKICBPf1kU,289 +pip/_vendor/html5lib/_trie/_base.py,sha256=uJHVhzif9S0MJXgy9F98iEev5evi_rgUk5BmEbUSp8c,930 +pip/_vendor/html5lib/_trie/datrie.py,sha256=EQpqSfkZRuTbE-DuhW7xMdVDxdZNZ0CfmnYfHA_3zxM,1178 +pip/_vendor/html5lib/_trie/py.py,sha256=wXmQLrZRf4MyWNyg0m3h81m9InhLR7GJ002mIIZh-8o,1775 +pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/html5lib/filters/alphabeticalattributes.py,sha256=lViZc2JMCclXi_5gduvmdzrRxtO5Xo9ONnbHBVCsykU,919 +pip/_vendor/html5lib/filters/base.py,sha256=z-IU9ZAYjpsVsqmVt7kuWC63jR11hDMr6CVrvuao8W0,286 +pip/_vendor/html5lib/filters/inject_meta_charset.py,sha256=egDXUEHXmAG9504xz0K6ALDgYkvUrC2q15YUVeNlVQg,2945 +pip/_vendor/html5lib/filters/lint.py,sha256=jk6q56xY0ojiYfvpdP-OZSm9eTqcAdRqhCoPItemPYA,3643 +pip/_vendor/html5lib/filters/optionaltags.py,sha256=8lWT75J0aBOHmPgfmqTHSfPpPMp01T84NKu0CRedxcE,10588 +pip/_vendor/html5lib/filters/sanitizer.py,sha256=4ON02KNjuqda1lCw5_JCUZxb0BzWR5M7ON84dtJ7dm0,26248 +pip/_vendor/html5lib/filters/whitespace.py,sha256=8eWqZxd4UC4zlFGW6iyY6f-2uuT8pOCSALc3IZt7_t4,1214 +pip/_vendor/html5lib/treeadapters/__init__.py,sha256=A0rY5gXIe4bJOiSGRO_j_tFhngRBO8QZPzPtPw5dFzo,679 +pip/_vendor/html5lib/treeadapters/genshi.py,sha256=CH27pAsDKmu4ZGkAUrwty7u0KauGLCZRLPMzaO3M5vo,1715 +pip/_vendor/html5lib/treeadapters/sax.py,sha256=BKS8woQTnKiqeffHsxChUqL4q2ZR_wb5fc9MJ3zQC8s,1776 +pip/_vendor/html5lib/treebuilders/__init__.py,sha256=AysSJyvPfikCMMsTVvaxwkgDieELD5dfR8FJIAuq7hY,3592 +pip/_vendor/html5lib/treebuilders/base.py,sha256=wQGp5yy22TNG8tJ6aREe4UUeTR7A99dEz0BXVaedWb4,14579 +pip/_vendor/html5lib/treebuilders/dom.py,sha256=SY3MsijXyzdNPc8aK5IQsupBoM8J67y56DgNtGvsb9g,8835 +pip/_vendor/html5lib/treebuilders/etree.py,sha256=aqIBOGj_dFYqBURIcTegGNBhAIJOw5iFDHb4jrkYH-8,12764 +pip/_vendor/html5lib/treebuilders/etree_lxml.py,sha256=9V0dXxbJYYq-Skgb5-_OL2NkVYpjioEb4CHajo0e9yI,14122 +pip/_vendor/html5lib/treewalkers/__init__.py,sha256=yhXxHpjlSqfQyUag3v8-vWjMPriFBU8YRAPNpDgBTn8,5714 +pip/_vendor/html5lib/treewalkers/base.py,sha256=ouiOsuSzvI0KgzdWP8PlxIaSNs9falhbiinAEc_UIJY,7476 +pip/_vendor/html5lib/treewalkers/dom.py,sha256=EHyFR8D8lYNnyDU9lx_IKigVJRyecUGua0mOi7HBukc,1413 +pip/_vendor/html5lib/treewalkers/etree.py,sha256=sz1o6mmE93NQ53qJFDO7HKyDtuwgK-Ay3qSFZPC6u00,4550 +pip/_vendor/html5lib/treewalkers/etree_lxml.py,sha256=sY6wfRshWTllu6n48TPWpKsQRPp-0CQrT0hj_AdzHSU,6309 +pip/_vendor/html5lib/treewalkers/genshi.py,sha256=4D2PECZ5n3ZN3qu3jMl9yY7B81jnQApBQSVlfaIuYbA,2309 +pip/_vendor/idna/__init__.py,sha256=9Nt7xpyet3DmOrPUGooDdAwmHZZu1qUAy2EaJ93kGiQ,58 +pip/_vendor/idna/codec.py,sha256=lvYb7yu7PhAqFaAIAdWcwgaWI2UmgseUua-1c0AsG0A,3299 +pip/_vendor/idna/compat.py,sha256=R-h29D-6mrnJzbXxymrWUW7iZUvy-26TQwZ0ij57i4U,232 +pip/_vendor/idna/core.py,sha256=JDCZZ_PLESqIgEbU8mPyoEufWwoOiIqygA17-QZIe3s,11733 +pip/_vendor/idna/idnadata.py,sha256=HXaPFw6_YAJ0qppACPu0YLAULtRs3QovRM_CCZHGdY0,40899 +pip/_vendor/idna/intranges.py,sha256=TY1lpxZIQWEP6tNqjZkFA5hgoMWOj1OBmnUG8ihT87E,1749 +pip/_vendor/idna/package_data.py,sha256=kIzeKKXEouXLR4srqwf9Q3zv-NffKSOz5aSDOJARPB0,21 +pip/_vendor/idna/uts46data.py,sha256=oLyNZ1pBaiBlj9zFzLFRd_P7J8MkRcgDisjExZR_4MY,198292 +pip/_vendor/lockfile/__init__.py,sha256=Tqpz90DwKYfhPsfzVOJl84TL87pdFE5ePNHdXAxs4Tk,9371 +pip/_vendor/lockfile/linklockfile.py,sha256=C7OH3H4GdK68u4FQgp8fkP2kO4fyUTSyj3X6blgfobc,2652 +pip/_vendor/lockfile/mkdirlockfile.py,sha256=e3qgIL-etZMLsS-3ft19iW_8IQ360HNkGOqE3yBKsUw,3096 +pip/_vendor/lockfile/pidlockfile.py,sha256=ukH9uk6NFuxyVmG5QiWw4iKq3fT7MjqUguX95avYPIY,6090 +pip/_vendor/lockfile/sqlitelockfile.py,sha256=o2TMkMRY0iwn-iL1XMRRIFStMUkS4i3ajceeYNntKFg,5506 +pip/_vendor/lockfile/symlinklockfile.py,sha256=ABwXXmvTHvCl5viPblShL3PG-gGsLiT1roAMfDRwhi8,2616 +pip/_vendor/msgpack/__init__.py,sha256=y0bk2YbzK6J2e0J_dyreN6nD7yM2IezT6m_tU2h-Mdg,1677 +pip/_vendor/msgpack/_version.py,sha256=dN7wVIjbyuQIJ35B2o6gymQNDLPlj_7-uTfgCv7KErM,20 +pip/_vendor/msgpack/exceptions.py,sha256=lPkAi_u12NlFajDz4FELSHEdfU8hrR3zeTvKX8aQuz4,1056 +pip/_vendor/msgpack/fallback.py,sha256=h0ll8xnq12mI9PuQ9Qd_Ihtt08Sp8L0JqhG9KY8Vyjk,36411 +pip/_vendor/packaging/__about__.py,sha256=Wg0-hNgTU2_lBZcGBh5pm1R9yroQ3rv-X0rig8KjA6o,744 +pip/_vendor/packaging/__init__.py,sha256=6enbp5XgRfjBjsI9-bn00HjHf5TH21PDMOKkJW8xw-w,562 +pip/_vendor/packaging/_compat.py,sha256=Ugdm-qcneSchW25JrtMIKgUxfEEBcCAz6WrEeXeqz9o,865 +pip/_vendor/packaging/_structures.py,sha256=pVd90XcXRGwpZRB_qdFuVEibhCHpX_bL5zYr9-N0mc8,1416 +pip/_vendor/packaging/markers.py,sha256=-QjvJkhSJBxBogO9J_EpPQudHaaLV3rgVYsBDqn-ZLc,8234 +pip/_vendor/packaging/requirements.py,sha256=grcnFU8x7KD230JaFLXtWl3VClLuOmsOy4c-m55tOWs,4700 +pip/_vendor/packaging/specifiers.py,sha256=0ZzQpcUnvrQ6LjR-mQRLzMr8G6hdRv-mY0VSf_amFtI,27778 +pip/_vendor/packaging/utils.py,sha256=VaTC0Ei7zO2xl9ARiWmz2YFLFt89PuuhLbAlXMyAGms,1520 +pip/_vendor/packaging/version.py,sha256=Npdwnb8OHedj_2L86yiUqscujb7w_i5gmSK1PhOAFzg,11978 +pip/_vendor/pep517/__init__.py,sha256=nOY747zTld3oTdEetBG6DWxEcZXTeOQk0aHvbR-sa5w,84 +pip/_vendor/pep517/_in_process.py,sha256=xMY2kLutkjCti5WqTmKOLRRL3o8Ds_k-fObFyuMv1tk,6061 +pip/_vendor/pep517/build.py,sha256=-n8PT-ugS1TdqoTUY1vatDQjrLtx48K_-Quu2MuQBiA,2699 +pip/_vendor/pep517/check.py,sha256=Lu7nMdYu1JVV58fE3hv-d_avTy5h0yO9LsIzAt82Clk,5885 +pip/_vendor/pep517/colorlog.py,sha256=Tk9AuYm_cLF3BKTBoSTJt9bRryn0aFojIQOwbfVUTxQ,4098 +pip/_vendor/pep517/compat.py,sha256=4SFG4QN-cNj8ebSa0wV0HUtEEQWwmbok2a0uk1gYEOM,631 +pip/_vendor/pep517/envbuild.py,sha256=9-u4KffexPMEm52rTaIjEOxsCAd2DMByxzv5H566QLw,5763 +pip/_vendor/pep517/wrappers.py,sha256=9dZn-q7F5KyQKUJMie2uKwur2FG0CLXz_kLZzkJOhZc,5912 +pip/_vendor/pkg_resources/__init__.py,sha256=ZVHzk7ZiFIIgE2RTJj8F7wwjdMGrAngMWtQo-rGNsm4,107910 +pip/_vendor/pkg_resources/py31compat.py,sha256=CRk8fkiPRDLsbi5pZcKsHI__Pbmh_94L8mr9Qy9Ab2U,562 +pip/_vendor/progress/__init__.py,sha256=fcbQQXo5np2CoQyhSH5XprkicwLZNLePR3uIahznSO0,4857 +pip/_vendor/progress/bar.py,sha256=QuDuVNcmXgpxtNtxO0Fq72xKigxABaVmxYGBw4J3Z_E,2854 +pip/_vendor/progress/counter.py,sha256=MznyBrvPWrOlGe4MZAlGUb9q3aODe6_aNYeAE_VNoYA,1372 +pip/_vendor/progress/spinner.py,sha256=k8JbDW94T0-WXuXfxZIFhdoNPYp3jfnpXqBnfRv5fGs,1380 +pip/_vendor/pytoml/__init__.py,sha256=W_SKx36Hsew-Fty36BOpreLm4uF4V_Tgkm_z9rIoOE8,127 +pip/_vendor/pytoml/core.py,sha256=9CrLLTs1PdWjEwRnYzt_i4dhHcZvGxs_GsMlYAX3iY4,509 +pip/_vendor/pytoml/parser.py,sha256=2tDXkldqPQJhyadXzL2rGhVbjUyBNeXXhaEfncHl2iQ,10326 +pip/_vendor/pytoml/test.py,sha256=2nQs4aX3XQEaaQCx6x_OJTS2Hb0_IiTZRqNOeDmLCzo,1021 +pip/_vendor/pytoml/utils.py,sha256=JCLHx77Hu1R3F-bRgiROIiKyCzLwyebnp5P35cRJxWs,1665 +pip/_vendor/pytoml/writer.py,sha256=WbNNQg3sh_V-s3kt88LkNNbxEq6pPDdhRE-daJzArcI,3198 +pip/_vendor/requests/__init__.py,sha256=ZI8kbaEzLAxsqex3MmMPr-v24d1RfZbNAOY8fUxg2Xw,4074 +pip/_vendor/requests/__version__.py,sha256=8KG3anaNCi-PEclPPOHJ_cv1udY_L1_njVr84gRZ9HM,436 +pip/_vendor/requests/_internal_utils.py,sha256=Zx3PnEUccyfsB-ie11nZVAW8qClJy0gx1qNME7rgT18,1096 +pip/_vendor/requests/adapters.py,sha256=e-bmKEApNVqFdylxuMJJfiaHdlmS_zhWhIMEzlHvGuc,21548 +pip/_vendor/requests/api.py,sha256=hWZgfD7OriCZFOnpeq0bv2pbXDl8YXfxDwAcU036qDs,6253 +pip/_vendor/requests/auth.py,sha256=QB2-cSUj1jrvWZfPXttsZpyAacQgtKLVk14vQW9TpSE,10206 +pip/_vendor/requests/certs.py,sha256=nXRVq9DtGmv_1AYbwjTu9UrgAcdJv05ZvkNeaoLOZxY,465 +pip/_vendor/requests/compat.py,sha256=FZX4Q_EMKiMnhZpZ3g_gOsT-j2ca9ij2gehDx1cwYeo,1941 +pip/_vendor/requests/cookies.py,sha256=Y-bKX6TvW3FnYlE6Au0SXtVVWcaNdFvuAwQxw-G0iTI,18430 +pip/_vendor/requests/exceptions.py,sha256=-mLam3TAx80V09EaH3H-ZxR61eAVuLRZ8zgBBSLjK44,3197 +pip/_vendor/requests/help.py,sha256=SJPVcoXeo7KfK4AxJN5eFVQCjr0im87tU2n7ubLsksU,3578 +pip/_vendor/requests/hooks.py,sha256=QReGyy0bRcr5rkwCuObNakbYsc7EkiKeBwG4qHekr2Q,757 +pip/_vendor/requests/models.py,sha256=6s-37iAqXVptq8z7U_LoH_pbIPrCQUm_Z8QuIGE29Q0,34275 +pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 +pip/_vendor/requests/sessions.py,sha256=DjbCotDW6xSAaBsjbW-L8l4N0UcwmrxVNgSrZgIjGWM,29332 +pip/_vendor/requests/status_codes.py,sha256=XWlcpBjbCtq9sSqpH9_KKxgnLTf9Z__wCWolq21ySlg,4129 +pip/_vendor/requests/structures.py,sha256=zoP8qly2Jak5e89HwpqjN1z2diztI-_gaqts1raJJBc,2981 +pip/_vendor/requests/utils.py,sha256=LtPJ1db6mJff2TJSJWKi7rBpzjPS3mSOrjC9zRhoD3A,30049 +pip/_vendor/urllib3/__init__.py,sha256=EZviRQA_iuL_94EeJHY4JAArRXbRCkAzA0HH9iXZ15s,2722 +pip/_vendor/urllib3/_collections.py,sha256=-CAKsDE-WdubAjlBSZLx7b0e7WKenaNGwWvGLDEF1TM,10746 +pip/_vendor/urllib3/connection.py,sha256=KLFvknLgllcMkgJ-zUsFjCzOt9P03fDoIpTPz_vqXCw,13839 +pip/_vendor/urllib3/connectionpool.py,sha256=rgc_3D0VsD5VDxr4KzzA8Plee0Rmerm5WKb71FcxWu8,35097 +pip/_vendor/urllib3/exceptions.py,sha256=rFeIfBNKC8KJ61ux-MtJyJlEC9G9ggkmCeF751JwVR4,6604 +pip/_vendor/urllib3/fields.py,sha256=D_TE_SK15YatdbhWDMN0OE3X6UCJn1RTkANINCYOobE,5943 +pip/_vendor/urllib3/filepost.py,sha256=40CROlpRKVBpFUkD0R6wJf_PpvbcRQRFUu0OOQlFkKM,2436 +pip/_vendor/urllib3/poolmanager.py,sha256=csE6Bh6L0FJ3iNOHk2z8KhMT8Eiq976b6pk8I6vrOC8,16853 +pip/_vendor/urllib3/request.py,sha256=OfelFYzPnxGlU3amEz9uBLjCBOriwgJh4QC_aW9SF3U,5991 +pip/_vendor/urllib3/response.py,sha256=ta1jp4B5PGBWzoAV1s48WLuHCRICQnK7F9m_kyK4Z8g,25609 +pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=lhYXvB5_oGKSeurX7za3XhcGyERvNjXRQ3eJp2GmQ3M,717 +pip/_vendor/urllib3/contrib/appengine.py,sha256=VvDpkc5gf9dTXNxXmyG1mPdON_3DrYG_eW4uOqN98oQ,10938 +pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=5ZpMF7N9B6NEjVU-r-xjDOV_-hkNvsDoNc84J2yqauI,4459 +pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=-kI_9y99Iwybv6Wy8IF8PugVl61BeMBEEqGwrDYNCuc,15823 +pip/_vendor/urllib3/contrib/securetransport.py,sha256=BqXSlChN9_hjCWgyN6JdcgvBUdc37QCCX4u3_8zE_9o,30309 +pip/_vendor/urllib3/contrib/socks.py,sha256=Iom0snbHkCuZbZ7Sle2Kueha1W0jYAJ0SyCOtePLaio,6391 +pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=x2kLSh-ASZKsun0FxtraBuLVe3oHuth4YW6yZ5Vof-w,17560 +pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=Umy5u-3Z957GirdapnicXVOpHaM4xdOZABJuJxfaeJA,12162 +pip/_vendor/urllib3/packages/__init__.py,sha256=nlChrGzkjCkmhCX9HrF_qHPUgosfsPQkVIJxiiLhk9g,109 +pip/_vendor/urllib3/packages/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/packages/backports/makefile.py,sha256=so2z9BiNM8kh38Ve5tomQP_mp2_ubEqzdlCpLZKzzCI,1456 +pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py,sha256=WBVbxQBojNAxfZwNavkox3BgJiMA9BJmm-_fwd0jD_o,688 +pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py,sha256=E-9J-kAaUn76WMZ4PpzKUxM4C3yjY7mopOpbPIy3Dso,5700 +pip/_vendor/urllib3/util/__init__.py,sha256=6Ran4oAVIy40Cu_oEPWnNV9bwF5rXx6G1DUZ7oehjPY,1044 +pip/_vendor/urllib3/util/connection.py,sha256=-AyqcRTuNUHuo5ndtsU0Og_nMyCGATC-kYqOUdBHwIQ,4639 +pip/_vendor/urllib3/util/queue.py,sha256=myTX3JDHntglKQNBf3b6dasHH-uF-W59vzGSQiFdAfI,497 +pip/_vendor/urllib3/util/request.py,sha256=H5_lrHvtwl2U2BbT1UYN9HpruNc1gsNFlz2njQmhPrQ,3705 +pip/_vendor/urllib3/util/response.py,sha256=028PNXDZhwBtnm2uXvnAHi_l9_AAGrAMH2Igh2AbgWg,2586 +pip/_vendor/urllib3/util/retry.py,sha256=kFQTesNiwPp6ZeQo9VHeUO7b8qA-_l3BnErCAOEPo4Q,15105 +pip/_vendor/urllib3/util/ssl_.py,sha256=4qqBDM82bufhqqEd0b-99sObz95XmEVEXDVi5iAyCeE,13172 +pip/_vendor/urllib3/util/timeout.py,sha256=7lHNrgL5YH2cI1j-yZnzV_J8jBlRVdmFhQaNyM1_2b8,9757 +pip/_vendor/urllib3/util/url.py,sha256=qCY_HHUXvo05wAsEERALgExtlgxLnAHSQ7ce1b-g3SM,6487 +pip/_vendor/urllib3/util/wait.py,sha256=p4BZo_Ukp5JF0Dn6jro7cUfqIjnU6WFtuoA6poaV5Jk,5403 +pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 +pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979 +pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305 +pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563 +pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307 +pip-19.1.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +pip-19.1.dist-info/METADATA,sha256=beBgNX95MIue6GG4pjR72SBngkDbdZydSE1mLZJQngw,2890 +pip-19.1.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 +pip-19.1.dist-info/entry_points.txt,sha256=S_zfxY25QtQDVY1BiLAmOKSkkI5llzCKPLiYOSEupsY,98 +pip-19.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip-19.1.dist-info/RECORD,, +../../../bin/pip,sha256=PeGr5niiRkRZ60hnwOACwqa5AQnlkWQ7O_g--sv-dh8,261 +../../../bin/pip3,sha256=PeGr5niiRkRZ60hnwOACwqa5AQnlkWQ7O_g--sv-dh8,261 +../../../bin/pip3.6,sha256=PeGr5niiRkRZ60hnwOACwqa5AQnlkWQ7O_g--sv-dh8,261 +pip-19.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip/_internal/utils/__pycache__/logging.cpython-36.pyc,, +pip/_internal/utils/__pycache__/appdirs.cpython-36.pyc,, +pip/_internal/utils/__pycache__/deprecation.cpython-36.pyc,, +pip/_internal/utils/__pycache__/filesystem.cpython-36.pyc,, +pip/_internal/utils/__pycache__/glibc.cpython-36.pyc,, +pip/_internal/utils/__pycache__/models.cpython-36.pyc,, +pip/_internal/utils/__pycache__/outdated.cpython-36.pyc,, +pip/_internal/utils/__pycache__/encoding.cpython-36.pyc,, +pip/_internal/utils/__pycache__/hashes.cpython-36.pyc,, +pip/_internal/utils/__pycache__/compat.cpython-36.pyc,, +pip/_internal/utils/__pycache__/typing.cpython-36.pyc,, +pip/_internal/utils/__pycache__/packaging.cpython-36.pyc,, +pip/_internal/utils/__pycache__/temp_dir.cpython-36.pyc,, +pip/_internal/utils/__pycache__/ui.cpython-36.pyc,, +pip/_internal/utils/__pycache__/setuptools_build.cpython-36.pyc,, +pip/_internal/utils/__pycache__/__init__.cpython-36.pyc,, +pip/_internal/utils/__pycache__/misc.cpython-36.pyc,, +pip/_internal/models/__pycache__/index.cpython-36.pyc,, +pip/_internal/models/__pycache__/candidate.cpython-36.pyc,, +pip/_internal/models/__pycache__/format_control.cpython-36.pyc,, +pip/_internal/models/__pycache__/__init__.cpython-36.pyc,, +pip/_internal/models/__pycache__/link.cpython-36.pyc,, +pip/_internal/__pycache__/build_env.cpython-36.pyc,, +pip/_internal/__pycache__/exceptions.cpython-36.pyc,, +pip/_internal/__pycache__/wheel.cpython-36.pyc,, +pip/_internal/__pycache__/index.cpython-36.pyc,, +pip/_internal/__pycache__/download.cpython-36.pyc,, +pip/_internal/__pycache__/resolve.cpython-36.pyc,, +pip/_internal/__pycache__/locations.cpython-36.pyc,, +pip/_internal/__pycache__/pep425tags.cpython-36.pyc,, +pip/_internal/__pycache__/configuration.cpython-36.pyc,, +pip/_internal/__pycache__/cache.cpython-36.pyc,, +pip/_internal/__pycache__/__init__.cpython-36.pyc,, +pip/_internal/__pycache__/pyproject.cpython-36.pyc,, +pip/_internal/cli/__pycache__/parser.cpython-36.pyc,, +pip/_internal/cli/__pycache__/status_codes.cpython-36.pyc,, +pip/_internal/cli/__pycache__/autocompletion.cpython-36.pyc,, +pip/_internal/cli/__pycache__/base_command.cpython-36.pyc,, +pip/_internal/cli/__pycache__/main_parser.cpython-36.pyc,, +pip/_internal/cli/__pycache__/__init__.cpython-36.pyc,, +pip/_internal/cli/__pycache__/cmdoptions.cpython-36.pyc,, +pip/_internal/operations/__pycache__/prepare.cpython-36.pyc,, +pip/_internal/operations/__pycache__/check.cpython-36.pyc,, +pip/_internal/operations/__pycache__/freeze.cpython-36.pyc,, +pip/_internal/operations/__pycache__/__init__.cpython-36.pyc,, +pip/_internal/req/__pycache__/req_tracker.cpython-36.pyc,, +pip/_internal/req/__pycache__/req_set.cpython-36.pyc,, +pip/_internal/req/__pycache__/req_uninstall.cpython-36.pyc,, +pip/_internal/req/__pycache__/req_install.cpython-36.pyc,, +pip/_internal/req/__pycache__/req_file.cpython-36.pyc,, +pip/_internal/req/__pycache__/__init__.cpython-36.pyc,, +pip/_internal/req/__pycache__/constructors.cpython-36.pyc,, +pip/_internal/vcs/__pycache__/subversion.cpython-36.pyc,, +pip/_internal/vcs/__pycache__/git.cpython-36.pyc,, +pip/_internal/vcs/__pycache__/__init__.cpython-36.pyc,, +pip/_internal/vcs/__pycache__/mercurial.cpython-36.pyc,, +pip/_internal/vcs/__pycache__/bazaar.cpython-36.pyc,, +pip/_internal/commands/__pycache__/show.cpython-36.pyc,, +pip/_internal/commands/__pycache__/help.cpython-36.pyc,, +pip/_internal/commands/__pycache__/wheel.cpython-36.pyc,, +pip/_internal/commands/__pycache__/completion.cpython-36.pyc,, +pip/_internal/commands/__pycache__/check.cpython-36.pyc,, +pip/_internal/commands/__pycache__/download.cpython-36.pyc,, +pip/_internal/commands/__pycache__/hash.cpython-36.pyc,, +pip/_internal/commands/__pycache__/list.cpython-36.pyc,, +pip/_internal/commands/__pycache__/configuration.cpython-36.pyc,, +pip/_internal/commands/__pycache__/install.cpython-36.pyc,, +pip/_internal/commands/__pycache__/search.cpython-36.pyc,, +pip/_internal/commands/__pycache__/freeze.cpython-36.pyc,, +pip/_internal/commands/__pycache__/uninstall.cpython-36.pyc,, +pip/_internal/commands/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/_structures.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/version.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/requirements.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/markers.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/_compat.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/__about__.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/utils.cpython-36.pyc,, +pip/_vendor/packaging/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/pytoml/__pycache__/parser.cpython-36.pyc,, +pip/_vendor/pytoml/__pycache__/writer.cpython-36.pyc,, +pip/_vendor/pytoml/__pycache__/utils.cpython-36.pyc,, +pip/_vendor/pytoml/__pycache__/core.cpython-36.pyc,, +pip/_vendor/pytoml/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/pytoml/__pycache__/test.cpython-36.pyc,, +pip/_vendor/msgpack/__pycache__/exceptions.cpython-36.pyc,, +pip/_vendor/msgpack/__pycache__/_version.cpython-36.pyc,, +pip/_vendor/msgpack/__pycache__/fallback.cpython-36.pyc,, +pip/_vendor/msgpack/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/sjisprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/eucjpprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/cp949prober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/euctwfreq.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/gb2312prober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/version.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/euckrprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/euckrfreq.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/chardistribution.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/escsm.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/euctwprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/big5freq.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/hebrewprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/latin1prober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/universaldetector.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/escprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/utf8prober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/gb2312freq.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/enums.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/langthaimodel.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/jpcntx.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/mbcssm.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/big5prober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/jisfreq.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-36.pyc,, +pip/_vendor/chardet/__pycache__/charsetprober.cpython-36.pyc,, +pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-36.pyc,, +pip/_vendor/chardet/cli/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/webencodings/__pycache__/labels.cpython-36.pyc,, +pip/_vendor/webencodings/__pycache__/tests.cpython-36.pyc,, +pip/_vendor/webencodings/__pycache__/mklabels.cpython-36.pyc,, +pip/_vendor/webencodings/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-36.pyc,, +pip/_vendor/progress/__pycache__/bar.cpython-36.pyc,, +pip/_vendor/progress/__pycache__/counter.cpython-36.pyc,, +pip/_vendor/progress/__pycache__/spinner.cpython-36.pyc,, +pip/_vendor/progress/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/pep517/__pycache__/_in_process.cpython-36.pyc,, +pip/_vendor/pep517/__pycache__/build.cpython-36.pyc,, +pip/_vendor/pep517/__pycache__/check.cpython-36.pyc,, +pip/_vendor/pep517/__pycache__/envbuild.cpython-36.pyc,, +pip/_vendor/pep517/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/pep517/__pycache__/wrappers.cpython-36.pyc,, +pip/_vendor/pep517/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/pep517/__pycache__/colorlog.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__pycache__/misc.cpython-36.pyc,, +pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/manifest.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/util.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/database.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/scripts.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/wheel.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/locators.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/version.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/index.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/markers.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/resources.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/metadata.cpython-36.pyc,, +pip/_vendor/distlib/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/win32.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/initialise.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/ansi.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/winterm.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/ansitowin32.cpython-36.pyc,, +pip/_vendor/colorama/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/linklockfile.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/controller.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/serialize.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/cache.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/adapter.cpython-36.pyc,, +pip/_vendor/cachecontrol/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-36.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-36.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/idna/__pycache__/codec.cpython-36.pyc,, +pip/_vendor/idna/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/idna/__pycache__/idnadata.cpython-36.pyc,, +pip/_vendor/idna/__pycache__/package_data.cpython-36.pyc,, +pip/_vendor/idna/__pycache__/intranges.cpython-36.pyc,, +pip/_vendor/idna/__pycache__/core.cpython-36.pyc,, +pip/_vendor/idna/__pycache__/uts46data.cpython-36.pyc,, +pip/_vendor/idna/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/__pycache__/appdirs.cpython-36.pyc,, +pip/_vendor/__pycache__/ipaddress.cpython-36.pyc,, +pip/_vendor/__pycache__/six.cpython-36.pyc,, +pip/_vendor/__pycache__/retrying.cpython-36.pyc,, +pip/_vendor/__pycache__/distro.cpython-36.pyc,, +pip/_vendor/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/__pycache__/pyparsing.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/help.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/_internal_utils.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/__version__.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/exceptions.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/certs.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/structures.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/sessions.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/status_codes.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/models.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/compat.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/adapters.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/packages.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/hooks.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/auth.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/utils.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/cookies.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/requests/__pycache__/api.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/lint.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/base.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-36.pyc,, +pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-36.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/constants.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/serializer.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/html5parser.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/_utils.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/_inputstream.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-36.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-36.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-36.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/py.cpython-36.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-36.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-36.pyc,, +pip/_vendor/certifi/__pycache__/__main__.cpython-36.pyc,, +pip/_vendor/certifi/__pycache__/core.cpython-36.pyc,, +pip/_vendor/certifi/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/urllib3/util/__pycache__/timeout.cpython-36.pyc,, +pip/_vendor/urllib3/util/__pycache__/response.cpython-36.pyc,, +pip/_vendor/urllib3/util/__pycache__/url.cpython-36.pyc,, +pip/_vendor/urllib3/util/__pycache__/request.cpython-36.pyc,, +pip/_vendor/urllib3/util/__pycache__/connection.cpython-36.pyc,, +pip/_vendor/urllib3/util/__pycache__/wait.cpython-36.pyc,, +pip/_vendor/urllib3/util/__pycache__/retry.cpython-36.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-36.pyc,, +pip/_vendor/urllib3/util/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/urllib3/util/__pycache__/queue.cpython-36.pyc,, +pip/_vendor/urllib3/__pycache__/poolmanager.cpython-36.pyc,, +pip/_vendor/urllib3/__pycache__/response.cpython-36.pyc,, +pip/_vendor/urllib3/__pycache__/exceptions.cpython-36.pyc,, +pip/_vendor/urllib3/__pycache__/request.cpython-36.pyc,, +pip/_vendor/urllib3/__pycache__/filepost.cpython-36.pyc,, +pip/_vendor/urllib3/__pycache__/connectionpool.cpython-36.pyc,, +pip/_vendor/urllib3/__pycache__/connection.cpython-36.pyc,, +pip/_vendor/urllib3/__pycache__/_collections.cpython-36.pyc,, +pip/_vendor/urllib3/__pycache__/fields.cpython-36.pyc,, +pip/_vendor/urllib3/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-36.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-36.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-36.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-36.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-36.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-36.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-36.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-36.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/urllib3/packages/__pycache__/six.cpython-36.pyc,, +pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-36.pyc,, +pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-36.pyc,, +pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-36.pyc,, +pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-36.pyc,, +pip/_vendor/pkg_resources/__pycache__/__init__.cpython-36.pyc,, +pip/__pycache__/__main__.cpython-36.pyc,, +pip/__pycache__/__init__.cpython-36.pyc,, diff --git a/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/WHEEL b/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/WHEEL new file mode 100644 index 0000000..c8240f0 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/entry_points.txt b/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/entry_points.txt new file mode 100644 index 0000000..f5809cb --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/entry_points.txt @@ -0,0 +1,5 @@ +[console_scripts] +pip = pip._internal:main +pip3 = pip._internal:main +pip3.7 = pip._internal:main + diff --git a/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/top_level.txt b/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/top_level.txt new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip-19.1.dist-info/top_level.txt @@ -0,0 +1 @@ +pip diff --git a/mongo_mac/lib/python3.6/site-packages/pip/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/__init__.py new file mode 100644 index 0000000..75cd896 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/__init__.py @@ -0,0 +1 @@ +__version__ = "19.1" diff --git a/mongo_mac/lib/python3.6/site-packages/pip/__main__.py b/mongo_mac/lib/python3.6/site-packages/pip/__main__.py new file mode 100644 index 0000000..0c223f8 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/__main__.py @@ -0,0 +1,19 @@ +from __future__ import absolute_import + +import os +import sys + +# If we are running from a wheel, add the wheel to sys.path +# This allows the usage python pip-*.whl/pip install pip-*.whl +if __package__ == '': + # __file__ is pip-*.whl/pip/__main__.py + # first dirname call strips of '/__main__.py', second strips off '/pip' + # Resulting path is the name of the wheel itself + # Add that to sys.path so we can import pip + path = os.path.dirname(os.path.dirname(__file__)) + sys.path.insert(0, path) + +from pip._internal import main as _main # isort:skip # noqa + +if __name__ == '__main__': + sys.exit(_main()) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02649824dc10d1db3ac97c447ec331e5206b31bc GIT binary patch literal 200 zcmXr!<>h+1;CPHE0|UcjAcg}*Aj<)Wi#dQq3PTh_3S%&XCQ}uQp{1UopC;oi?)dn! z)S}|d{Ji-1l?+8pKxJU!SE7DFQD#|UNveKXVv&AYeohKdnSOG%eo2mDT2e(>ib=6~ zylHY$WwxPlT2*;&vH=jJ=jn&&7i1RbX66-_B^es9MB=5ECN{Oc9dh#!hi#Cz0)xwrgI5l_%jHydnl( zfeAYTiIeWT)7^L9r(2B2gU{FZrwRe^0sckc`dgQJ(Dz876m>O70~XSt zK?_8TV>`e&Z%m^Y#>zbbEUL5(^j_N`#x=ZDa9XD@4ow;oX-z2FO z-x9-;Em28c3CfgCvLZ2Jp09RWy3|+rGF$D7`655O$n3(!x=bDu=QnlUh6piTN_L=n kr~R6PP`erRSN8C-n@M?zc=sCZ}#5uviIjtzdd`f zgwP-8(z6Eo$1vnWj1WZ>bCh5oW33ZTd}3zHx6Ew&wwVil!OV{Dz-;ki;`%N|tk5q} zo4K^`f?zZ$n?0WIJwfT3jo8w_6Ddae{T8L4KSj*xm#H%#;wAI?%d|K^;^m|UD3@1~ zs$azjkn0-BYFz^8UtXguNu9~*OLu@ z!|2QWT5{dLZuAPjk!<>#$(FyB-1KiIO}}aERmf`F--fKL{#)$U1@_-wHqf^Fq9He@MfX*78fiZo7pxfA!&OfXn< zqfoJ4CMLNcuKAB}~96amaH|jyhu|B&_C6C!B_%1~vB6 zc^t>=`w^3Bkw655F^>cCCX7cg#T5NWHqbdzq;KhVDO<})O%-P7 z0zV_?_?$qSzp#;VpvBKII=3*Iwg6r1yOhkV2J8cz`BtUAxAz&D%0Z)7$&HpU~MR)71uJ^YlBGHYHO^ zTX`0RoK3ym-5BTr9oOA*U+ZhRB_}esL(v0#Rzc7jPQ)!Z@c|6k1c9)NE0#+fLU7Hz6@0@cxQ^>&3#8e-gAaG!$-N-x zjuhOkAP@wQViN>Z4hjL?64&&XyQsVrSK!m%f=F7y818W( z4vMl=iMS(*CeEW1{xou1yv!V)B~?|EgTAh{vr61@!2D8# zp;+Gd*Pi)*M$Rd+{^sJPQW$2gzPUV7F_&{{ue`Z3j-*(Iv_wUVsundZRzT#X9#aQ% zdb)w3Aarb7FYDGD#$6KcX^8tU$>@l)k91?DW=EO0Kn-|_>y>fEAs8fftTn8OQpXN) QNf~VOcO93BXH~3!0QQ&zga7~l literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/build_env.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/build_env.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..787a57bcda45047f85c3d0da88aeff3fac325b24 GIT binary patch literal 7492 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 T1mmA!!l9Qb#9OWYL|gkWYlC%g literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/cache.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/cache.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7df733fe81e97a3f4b04d710a5aed30948be0f5c GIT binary patch literal 7054 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 Jg{uoo{{vE*)1v?Y literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/configuration.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/configuration.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6aeb969facb85f1d4aa312a3fb49a32d3f212d29 GIT binary patch literal 9758 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/index.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/index.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c3ed2396086b32cbe3110ec566b5344565acd01 GIT binary patch literal 28807 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/locations.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/locations.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94109bb8e8adcf6c95e14b2ca407a14fbb4830b8 GIT binary patch literal 4439 zcmai1&2!tv6~`ArkfNw>*|MDk`Esnp5|h}8)5LM=+H&gHmQza^$CzYL2)mR(fdI1r zC6R@CDAQ9X({y_2sgpx5z4h8_FTM0H*ke0A_|iWhr~cl8l4UnDC1$_gzW4U++xNvw zlauv-fA{w<=Fe){zqAv-17I-Y~kifdiRt1H?{Jkf1<4K=sp$!^nYs(Ce@>P~yp-5GC2t(|zbJLk>m8lMy2 zfk!Q#?=E-?-9>M)d&)c2J?)+DE_qAXZ+6bG`bhWAvI*}TYk1GGN!I*Y^PXo@Y#QSW zY=+HZbomP-P5hIaofkVV@oMK~Ha9Z7SCaPzi({DCd3B_f(1%*$S{gsUTmM!Ur*(}! z(7eXxN4l;((h}oyO;KIoui)%gxYJo?3z)smE1fq+TIV7-E$$ki{)E>%D}Hx+j==5BZ1@>*lgGwc+2z0IdV|DO{QpN7Pj#_JZN)n&DMhhG}$-|E>v zPT(#*g-ff;?2PyB7~^f|%lSm<^6X1qRaE} zFOq`p3%^X4MYuC}^BwMHX;$fbO!D@bxhdL=7KNGEnb^|SY z8(pq-^o~(zxj8Zp_1r3SrjLx@P9GYD(W&G%x!gmI89&n=XrE)mvzx<@>Mni{MKo3e zsir*J?FM3(i?I$9=u6$~i7<*%>ig@`W_tvD9_IM&I`*fyUcpB;6+Q!E9kJpw>Svx*RI;0uJyjIHOw|jrq z#2MWA`?%E;(Hq@&slhtjW6I7}EM2C#0$2^OUVtKQ75PGzKz^urQr7f6}PuB%8t?<*Xqz`l52 z=?Xz?tgq6dpV3#8kanOK7xBeSQWw|DdDqRz?#Dizttt%-&nD^0cARbn@d|CP9B;$> zHgByj*Tghr6*K5$6;_%AU5;?Jm6i5SG}7^XGFsmkvxH06mUfgW7dK>saQtq{e2~j# zlKSO&iso7U&Ogzpe~kG77?!%NF6vEvmUR0D9b#r89DcZofL8i~iZTIgg&**+pOdwa zi?>DEb;BSbRm5qs4L{!^61?H6toHhX$I+H&^#;Ac_xdkobt4o}FVCd86(z$eIIKoV zG<0Y}0e)z$V)~dIK-w&T!6lDLNyF*ZhEjCvZnPx=F=!2&t$rqySH&$bI}T@L498AF zuDz`l+LyBkWMx>>DXjg@_zF&;G_-6zc?P9qIaQ__pG=zG1ewKHeN(;DGdlggel8!B2Qb}dZZsZ zi3OO$Dusqst*9XsI}~yYyQsm8>qWg|j!^$#w3yAR%=yMRoG2z(ZMT;FJg@vpFZ8rs zR2o_~%qy(ku?xMZjEs>^JH1~O6P;=?;a3Y?e9J)RJ4L1U2S6P)H+p}Wcs_63)V^FiY~+(Tvr#loX(OYk7LBXgSARoVn1ozSh9t3Tqguiag3=VI zr>U{#H;_Zu@|lr_U6Idr<~sBFLdT)%kj-GW$ZBkss*_WAw^602vbn2TVbbl6DNZT6 z)3mpQN@b+8`6caevgB5n#Uz_&HR3^%Df%ix;KJ~YlOZs08Qu=29A`&a*UiEm-sK7l zb)c$88aII@qAehzQkck;0sDd2&W4jKD{yhDGFHO&wzNtI9_NBhR33JSAer;^;S3>t z_=`ig41}0TO*&&tUrrp&;4I6ApnwPGiGv(#S%q=OeT2mG1h#vFd?!sFn+j)#2b8BC zD_NIh^Y})qG!s`8MZd=&gq-aK0x^1Q+!R4FIfZ}>NVkh<=BHa7*}R@XQo8Dz5UG$h zs%~#dkdwK16+6pK%H&z@laj?9qQ6VsJ)&|Vl#I9|QxcA^UB0E9 z;s?11AOUFU)y8bpRA*9;q`Auna*~2B#l`YS3LK@gtK2kwtXRKf`+MwXpPbOYbCUN`GlEutCvtSP<#x8=&M^>yTi zk7U*NSsMDjtRn^Vk+dlZP<&B(lhrg^Re8c8JE2!n_Mx;WlyN9^Df5p14gm2F)BH(PH4I&W(Fe*yB)>iPfx literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/pep425tags.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/pep425tags.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59bae8f546cff39e75e57ffda4de50bfa283c81e GIT binary patch literal 8338 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/pyproject.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/pyproject.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67be238bec933f86e998444cd6df7b7f0488d7fa GIT binary patch literal 6474 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 m0)Cy2? literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/resolve.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/resolve.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..494de66752058df407b02dc1e37a181510b0d849 GIT binary patch literal 9108 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 Qa8TY*&(N>@Yf7{7e-C&eg8%>k literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/wheel.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/__pycache__/wheel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31cddd9e416098a67ecfc1f6a84181c6402019d1 GIT binary patch literal 26119 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 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, 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/mongo_mac/lib/python3.6/site-packages/pip/_internal/cache.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/cache.py new file mode 100644 index 0000000..9379343 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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 + from pip._internal.index import FormatControl + +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/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/__init__.py new file mode 100644 index 0000000..e589bb9 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3000ba9d24a53a033cb253759e7ce31d7cae3997 GIT binary patch literal 277 zcmX|5yG{c!5cH)Xij;qF7o`X$N>Cbv=;&xdg^(s~Y4whN5h+ zq2bCo9u4nox5(ssuL5vq19BS*CZja+giaL%Is?w0meu)6N{Cv@PnIT>GRkihU9vqr zie4pQq617>=vEZBHubTGZQjXSU7y-w>K0o&|-kY{-SWthOEp$j5v!N6N8B cP)=xPg{0LMDX+WJd3xs~930+XI%FdI0}!26XaE2J literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77d4eeb43f956346e3f7fab1abdfb14e1ab769e4 GIT binary patch literal 5119 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bdfdbc266a52dd42166c691e71a87b4063122e1f GIT binary patch literal 7806 zcmbVR*>4<2dhcsa&J1sg)Y+CTTVqQ@QIai7mTgI-WOJ>h7#@<{@w(BRt|5Ea$EdnT zA_vV4V0wXMv)WbO7K=r&c}b81izLr^PJsLg^%~?sFF_vi5E%QA-&Z}nWEn6rL{-;a zUsZj_@B4VAS}p(Q@BZz})fq+k59QF$K=~F@{FkbtxQeB?s;l{Gpjld=Te?bh-8U>l zesleA-pb2*!79ja(JIPs$tuZj*(&2}_ya-3s>n5Rel@6BwP4U1l=Zwn6bxI#!H6{y zj9R0?m^BuRTjR2?;75ZAO7@lf)4>_*j4YRZ zGkDE%kk=8?s*U&joKt6H}|QQTwh#5ZVXcXoAa z7WGMY3iT;Ai~5|aFDv!qz4LdRn3=Ot5ICW0Hhm|KFPK#1%y$xoZ`4h^ki{?PiR+pe zbk^d??~ZU%1Dp<0X?BePN1^41^7hDC?RjEhsN z9oNCS>vOE-bp0g$l=+=|5f7XsVZ5Fbxw}hC50=E_;?muR^AA>+?K`XU_vh@n`6WB+ zDJ-wf&fZ;K7S+{-&lVm$TIjcrJ)B=!S-pM#?!rTR;lYZ1@4@QA9MQDsb(UEigD5Ot zzT>$4LyJnkaF_Fli{be&P8=VH$H=T{e37#!Uet~6bUojl^LW-gx*B>fkHtpSMW?yx zth0Mw=;A1udQ~ece&K}z>9tAdYy~J7bnHc|0mydVA zdLtdWLz>a`I15;q#B@HFbvSF%n_=C_J3QKC;d0{Q`R+&S>)1b|x*D^j+p+zut*(pW zI!o*hkJd#kqzCZ59om~`rg$20HzTmieQY<}@jCVs#_2xo<_2qS5@kRB zV(|-m_S3twpV>>R3k&lLpVSRe%wFE{g>m1D6Omi#c5puZcDRi>`G=0*W%2}%HW>3~ z9ju1-+S0-KmRTYS{a0!dAMX8h6mB8KbI6!tsn9o?t6Dme;c8aSt-88ve4|3U z3baejEx1Lr6y1_rMoY;Za4Yyizd#}e`I}g3;a*e2hkiMvBGN2U%#o!^8!9YOcd4Yc zv#*`t_rbMKvZs_mpd1m=i+~7;stK0Y#3H>i*2~@{#+l#3x%hF)-k~gyOcZR}jheR2=>|kzG98C# zI~_16F^MQ*BiSqlvZX$Ovgn8+q@QSrIhg`695|b-Pm{eaM^x8Y$hhP8t3yONCJ-yh z0T56lW`2ubqyxOctzg74L82W8I4Q2EM2b_N5@ab0ML*U}+ z=H_(b&$QOIp14=zYxcX%we8KBE3Mwspm_BJ+8ti2}^tRE?QO#9%wOuvT zT(GvQY?k=jsTP9e!OUvA;A+owu&>%K@_Ur0hF!w9%vUH!t%&bH{8g%Rp6YUbJJsd< z0rU=_x5EFFa!L>*4Xss_YZWCm+Jp8`YT!1E1z~I?Ne9X+*Ccfz3Y;a}W3i~=4Oz3x znY|Ik(2E+sgOi9H4Ug-?yh62-oMgKm=O?JHMYuPq@r-ulg`AX$s3yD{n&t(-JxYuz9#%&&g-w zA7dxE9e+T37UIl6z5ISPdyOoQ-S1w(*!VOuMbq??+K^f{^58N`Wo^vJYld1eDq3%1 z@0pKI-&bwK4V2`I)6GEfC~Y-WcS#e1=QKWzR#DCj4sjNmh~M}v%1Go6xQstSbsH(; zGQ9`8FHuF~VEX>nC5$_RB)9%Oh@h=$<1e)xZAVQtkfF7;NwnK~LK;y=J%;6oeQruIU8ed9EQ1ObJcMHz|GQ;TkZ3k zDo*x4Nxl7czlTnQRWSD*%+)x6wVX>gDDUmNJ7VkwIriS6v6K5Za&cMt9Czs|NdwAh z3iqo;Exg(EbFJgzd#R%A6w(6r`W;?l24jvVm)#TSxw5OdC&5+4wD_wb&~-H}rW&1^ zR{JAm3G3nv@9u&^l-`4IoLPYKDM1^oMX{H_20+xCksooZ+6BHPcxAUdpS>XYdO?c) z1?kz|KQ3-38&POpXNOaTHwH>Apzh!E!Z~m#}039 zn3pfjTsO}*Tjt{3Mf2+A>-9#@02P;kCd-PmxTx$T;Wz_Y4*{2e%*^xPeW|yaC@J6tpm&B&;wHPkI z{E-uO9lmYO#K{E^efiQ4yaT!V_ufIW;Up&964o$Vo)s=5mQw&qX z-OuNjSC;MDvn%rt7J8Rwqpt6oVU(CH;C*;bCJ?iPAg+0U^v&~qwC>_YC+==FnM6CL z7iRbk$mhliOni}THF2%2sHdHad#3bsZkUT+2k#%5u|)IcQ{op1?=iz5F6*6m&;gzz z0A)6vu*rNM54*N)5-;}3`}^JKn;@6iKvnz zzW-9ZOludQ8sHFfG39zOIfXXV!cnh_w}_I5G+GaUT?j|;Q&cU+8(lEW(~y&~t(OiN zZh{?F#b-~LZ-?Dr4YyPX06oaBz(Jg(8w(wDTBC4;qo*(JxJp|bwf({%h4NE$#9t#* zw3=SiGW1*4M}UJhT~o{2h-PRNV3xdE%jZ$gt0P(sxuNDYs#WxgT2@DZoohfflk!_b zy@EO+=$b4UDi9A^=v&juKsrNMkgv6^wy;niAgoTFgKdkl zZ3mIt#hu!sV%v}5l4m`c3nV=va`*U$lo7wkTb6Rb|BR{!S0GD-w59WS8HJcwsR*L* zrr1&hdJ=c}NadowC6a;V#AQ{8W!BNf0P)$LM9P)_!(5gwy zNIzm~dS;2IK7wp--Gp6J=9HgY-YINdNYoTzwGg-JfrpD(=P|38maxCXYjTe9ia9;Z z`3R#*m~$0WHi*hS8qp4y{d?*BchLF!M}*DFn>=xl!qit7pOV8lD@2X#`VFkVAw4BxCZ4dN5E}Q)yOk=#^_$J(17$8_* z0>V(;(8vzLWcyJV6Oon1{;U;>GBptag94BWg6soiT|#~mAu;fj;vKehMgS)=XSWQM zZFgAb-I;6rIYz-#_!T|}(_}0E3u+@@z4z4@QP&LMs+jBE6VR5J1O_sgaF{qyd+t1O zcs(}H2hKJ?0C0jCFegmRvjjKxyU(4+F*oCSeD>oyUn3$^k&{im`~RQaV#cx^C_1sf z&DnZ=5RTOT4aIx{TZxhvlV`@7NfyyKbOt_71FCy543b|aZ$gyzqGmB4qcM9nLI%e~ zt-pp1b-Dq+tV~Z~%L7S8E)3UeCepe` z5xT9WRivKFVhLHDG+!P`j@FCX2u2raly)3CSW|oNEFCcEzEAc&R4nYP6taC}@T5v1 zKmb2nS%-JnR^c=i@YVQLiVTp-YC}mO&ZeYL0OYO^cwWb-M8*X$wg}Ny5%!`ufCeEq z(p*Y?0}%270P1{iXemqG>7G-7i=iK4_(=^F)c?z;LBX0zkqr0hp12kG-74 zK#IcoANm>yGT~Rx^PdwXe@@vikckSxBd-}SxN$E3D{B8I$_{8f00Ym^@n1+Wfw`hq z`9ylSDyR1PUEaWlU`XaWA<#<9$cYt}V)W>GlHDX%iDO55NJ_{Xh$YN_`2f(nbYHN# z-DVQ;%pOR?VI4oZ4vj>TZhB^V&KwA}esS@8p2JEhpmD>M7r)iU>ZPGhE(xhpdJ8hDlX{YIx{PIB`laKz?|NnVs_J9t{ zZj!}sXWx16_j#ZDdGPqySm{r`_8YI}UrVL_IMw$#it=;#`s4XjN~NkPl~x%y-ON-o zX_m8YwwjgSTs4Q^oSSbJss(AwyF<-lwJ7C+JKQW)OU;q$NOQD0Ds@BdSaZBOF6E+o zpn0%*uz9F@NZyCt!_B*@cS*VA9%&w}9+mQld#ri9dR)q*?%mB3)e}-4bMI;1TfH}( za!%+!#6HH|`M#RZIFEz&=h^Pc|p26Y_r0eW3YZ^+A*msl#ul zst>8V)DirCLj50gR2_ReU7b|_SKX~npmfS9IwR^Hb+5V)e;-r#-zik5r0(O&QYY1M zHK86r-NRD%pn6Dsg0)TwwL{fUO6{aNrKZ%w*x@Ioc3NtuRawSYWPDlbX4E6r|xfarJ~cEu){5(KAx}lzLiy%6Y`Ock9vHsoQBatDaG3wjN8~kEhhL_@2cc9+&=~ zR?n$9^}L!_=hOmfpOD(~>Oyz7h3aXkyQmh`XVhoa3+fWi^`z7-smp3vy{J~C?kTBT zRaewi^^&@#URKvt^-i(+wA8<%UgdZ|fa5=Bgi zqSjIC*x4DW-B6pVp|;evb9C!j<*Fv;KdV~G!(5-19&Po8z)uVOo>RUG&^D(!>IQzF zS3Bw^e&^M$3h{eRy{Y!_yC7q4sc%!?u0F56L%ro3QnxYtaP_=;TYUjNE~qc6ckp{r zeMx;8zl-WS)pz0dGwQq59sGV)X80cUz4*(j@59(a^#!T>e)R+R%c{R3b(f^>uc{x! zUsnB))GbNfSJYSWmsNjF>MpAvRzHGym!<7T)sHy`)m!Sv)lXpF7uDC)Poix_+Wxxw zG4)fV8`NjQU#who2SfxFWTGTm2pNch%3SpT|sp5BFWHUX}X4ul@o0 z{zG6_zWS2X{3G>`)jv_cp#G^q@tXQ)>Yro1m!<7rs9!|ytooPIc3tXz33Wf^ysWag z-(SXURi*Y{sb5k5TKyaKZ`H42XRk=zuc=>`y5EqxSEcSZWv9QTejDq*CN;k!HUCa( zJ|{K*Uj44r{hq8^le*tm|3UpnbrNfm{$5xAN&RQ+(w4UWqW&v(WUD_=|4sdO>}XAD zBlSOImOqqP>gs&N`oVo^$3la#G`{>}qQ2kL+{lRI21}+S*Z;*A5z9%eU;7vNp8WY5S$p zl}*QL>qe{IXuFQJ>1fAl_*URq%2{u;obDK}Rd=SXwN79?-135ltwzfa>{igQ1IG$B zon~pn_10|H-K|)cF-$wQ@3pKor_tI#yB%~V+GzxvmR;vgo}IMYZKtIst-9U9SLeah^g6C;O$Md5 z?fVwCA`@4vD;_pw)d7ZvA2_W5-QC_~I}N<7d#>y4VAlYIa{R_dt5PbxONld;jt7r# zFYpF1V07MVHgP2jT6=mb6OCV8U0A8j&&^+4sGVC}iAuh%*V-D_aTC4A&U?CP2lHMl z(6U}`d3Sk{4XamHE-ziEU7TCJxUhq@%1ZssPtB9FTIz!ow=0>(pwpo*~;!^wsMpNx6`*Wd#SBFTGNnl#MxZ-U}>O@CvSm>#bmI5z_`I2?WRmZ_Yz-n{kow6!!u=0}Ja2#~W^UMe2Dqsl?a$P=X9D-p z^|hNf)D!+wwbS*r-R(yoUk`Vh^+)j8Xw6)i0nwC&OkKD9MAHeCf755Bd}|5C%+%e+ zOuebh(tf4A8y(gJea+O=47_=n1w2y2qv<1Q{Qye!4Bzp|#b3GcNAMExzH#p-QoQq< z_o19Qkvf-p?cgome0nd-yHBUyxcgdaFM~VJhVPg=cY=;?^=?aO#PZg*oO&P~gl$i!r5mZjFXE9J8c&a> z52p1L%3XLuj}@4biu`3fz64lq7xm~~>dUEjQtQxfRrc-Tt&Ga4yee#DZ)Jm2015+K zK}Y%pP*mntZZEe5IHyxVZY!^bR8bAz5set|E``5$uHlpDt({HBaeb??ZnYg<_HhAi z-~hOBA6tav~owfq%8bXQ3)i<5`b_`43jE;fL z0n$3n?Lf>}ey0se!7W1?*&R2aWRhzloyVih|Mls#OV{BkgeOJeh#E0{oOVB+Xe$sS~DXX^DX}GFpq+jKX>j7~7*-AVv z8Z*uDR-LCSWp-`-?HCncAIDS;z zv2_dE^rIY0Q+fRm=G4=Cl<|o2gqt4?#d8Qyr_!c_ki|V84990Mfqw*#RI!-OWkxe4 zP)Q+;aypaNv#38mKrAE}VLl24FrO4y3`hXqEWWvo9K}qK4+^(INSkReCDsq^Ww*25 zlPDEOQy`a&zPOju7lUC1B6=&mm)5VN?sc@6MpOEA)Mr_*azLYe_$%i-Ezx42FKFN= z^p9qP5Fzf?JAU9bt+s0i1Z9G%770lJ>8Nj#nBIqk0$T&kX02e8T)JwlW+38OFDuutA9d6BVhNY@3Rr$O)()IG?CZ0fa*fglGhC zx!m3jHoaE)2BZ>Hx@jz#oSJ2Otuf7wmCI0`LqOLsxr^t4k0M4%WuP|F=(Q&L1FbCWgI&@r)9M-2s;hUf^0 zG^lm&(QDN(Ycyh@QzI;^_xRGMfAU(4j{AkyF*Eo6Iajb1pK>oXlmRvJuaq4JeHIHv z&}LyMmmVdJoJdI*1C!7|;tGQUantzlO|E z(O6QdH9h5!SrIaU?l|GHi&$qtdumYN8S@AC zF6ay;wxb0jD^od5Hm@(>5e>xx$L#7zxvZTxIt}fVF=5cLUCbPg_toM(8jbtl>d~4h z-w21xq>DArheDAQ@^!D%3c_<28aEv57YxDc1no`$yGdjyNfpXQBS5>cWoR4$r%Abx zr^MsOt)KzsS|PYVK6TIabX074VAv>y$5$aXfe1bb7VotDWC`r)rFc)IRoN2@;W4?E z7-NO7oSTiHg8pxWL*+6~4ou3+Pk384F2wLHZ`?Xn_cS)x_F9Vfgd<&>TcL$AZ7r;< zTwXB;pI=$LvN%8Yg5`P}8|){N$_M=d^lj~J@Qmd(TSueGTa9mp`lbh?Fv{R)53dR( z?^?lbTV!d{lZ%St2wmLX1&m(#dU`KB`kHkrzWQ0~p|~^!f+K1~IZgtRCe!=+Gej3b z+kCl1V!pqlo_kH& zE2zO{W@*rN>EJ3)*E=F`8A3p0|4>rMLK3`7;Tx`8vTrt;ou<|5G}kDL)*(@(x8>ON zO-hayba)_}WlVDm`j^ve2VHP?p>1#*my8vO=D@P>P#H2pG{B^aJhL7R#T}yjy6f4& zy9cf0=uN#18AOaTl8Lg9k1^SHtQ_8t60x$JMll!~dF%*4mbhI2DI z&IYhtVGYuN7c|r{SNBswNt6?6JpmLDYVSsKr&hj^-$s6c{I!WyRU#f5W5 z?OJBaS?iQP1;eSnIc=S4Oo{YCX=kd@2Kza+HU$N-(?-djS`+LT>I2eC*oQ$8GED)6*zjIqoP*-O_q zp$5SLEOQu?lPS=PLuY4ZWM+DpC!sg>@G+j0$Co*isS@<;LtHRgK&VTpy{qd|>WAE) z4gjQ;?wx^~(MC0Y(l!9vkA&q=ZlL7iW>k68gMvI3zt#BW8^{(fUS7SjGJh>JYYSoo=qFN=MCE>#e$Y$|6IIsWqEZF1cSu- zAs~oG`#1P{KP(bR0Do@+P6M#`$Y@q4nt=&Jx1s47jr7VfH0WD(!dK^$KGdwJ*d|sg zdD#XK2|l*He9vJ$@{^h{oP44Cc;J~(T4Gs<&q61q=!WY9y z$zVlTB&V1m3))V=Ao?(!$z%gbcd;6w{8WGqFqu2;0FfNuno#tMd2MN)m@*(tUIw)N8dDp}DW4T%K!C~PDuCcAm(1E6$^5QLq9Xi!+hkJr(4hm>JTWiYhxaQ~Z; z%h3?SM`(<)?D5reU4ae$DmFfi!yYW+gVECwc%%;a)?;0gf)ZYj#QvqBI&p@!u5k6U zGgxS1a0HpTaYtf0K}5{UQS}bYKd2noQarBf&!cNHi|;(XvHNxp;e;)C?I3s3;e8jN z(%Z3Sk$5QM5J3g*`iC)2R8)ko3gB@FSn2ok%HLIk^Q=aT$PSWezDC${1F5Y34m|7h zBlANWhh^E6(c|~BbTYz~mx3G@cUDLq{;&Q5z01Q^z3O+kLn>v{%b&tj}NLJgtYknY7KEHNk~jMqZ!T?!4Vm7-;m?ITJj`%58crBu;1jI;-;oIcpFQAOTa>as1#$TY42L=cEe?TOwz`<6a^#} zqabl{R#BnmI-rB|fUcOP`a4_m_GWmi-loK&Z(k-kT z$OaK5%VbUb#bX7Tzz1Lj`OdGuFIKQc3~SfKV)PkSymFbw5zW6i{z)WeG>coM$5*AJ%q2Lp|M6#N_P>OdaLU;-cBAG5GQg9-xX>av4oN_7~6>IXb z$*Dvi?yf_shq#14kL=0Jr=1&OT}zVBz)Tg3a}O*U&;9rl@#Kh=iWj!Kf&gz{h~z9U z?2kSw+ z?@khEP&4ZAGz{#mY{P1Y=~<6autMz)AtL=O&-?TJTmkdJ~U z{U_m6fsOcO_XrnEt`#U{*Xw`>;L=+TT;({Cxv^b(Kn6}V7yx7daX&E_d11nbeNto4 z2QdT~h_Xd5Vb2F4!aQ$;Ih>@-ibB$YVM@`Md5v`^y@-+L!>5;}k0p6C3H#~_IuF!< zBkkb1kC%4+iamo*MAe6QHoprCj%B)%sn7Oh3zd<UEi^=Md%)XT&BR~gq5Mk19K zGA3*gu62gmad#hsro@2ub_ml8u;`E7gZ8sMtUt3miab% z2PLB+PIRxfRD_#n6lpsT4(sp3)C@;443`{Q^o8*7xmcAGw#>HfT?$T#B1D{Gpaa7h z1gD476noL%=h)?ea~_fzyDC?r;Pppx8LnGnL`YIXh;Ak~ggAz2yDza_I4l)Bp?#K0 zO}|~(X>ozBT0<#9mz{#o9my_u?N=RfnQ)FX~B%aP$8Pup-6 zV@e+8sgmy-@3l@{S-7;! z4A5)vPI^236yt5$gBu^de&(x6{sZG-6r|>a$qu#k$Burv-+rz;-2r6$}# z5V8{94L&GN*u*X4$0|T{%+x1QBEM!-gK#o-+H(6VCW7RbyW-#2rO>V_A%f2|S_t_# zHje7(fVn;s`DVq436HNsq&io^uO!IV?O@ohj1qsaxHXV#7xTS-jjm!nFZbM!T|H%k zu$L&oqfdA9E0UN}Y!VPkRE`fN$l2*}}IzfkMo;?oqU;Q{+y2Ih7@6f)xi_ zy9T}nK9v8a_z*;Kx$U%1Kl;?S&WOMaFimaWG{T4MM?g7qF(=%Cd1bIjc$nN;Z~f_R z+8S_g4JID7PhLc901^$B7nf^GmutxXtpUK?G@L8%Nnq$s1dWBGCV(BibtdTIL{@_d zT^ZB>__94F6bZ;)B$#MtZV0kJ^vTWa)-D%#tHpoR{3?}D@P#a|4S;MP84-AM( zJvb-sgYQ9ok6UYtuP3{Y36!E^0~gd~*B;q5{q3nzv5-rTXY~)EOov%-dODu#Y}oZ(*xB&0H{hc~92<(tz!l+a`^;gH?IH?b zI>a;-C-7G*m^A}=%0vnCKzB)GbckKTZo(#?--N>cB;J^LE=Z%veL zs+i=phAfPV0LEtA7k!Z(5Ltj=wVarGlZoObY5CGRC}_L>SKh=xcBG!+{a-Qgj2)GI z+x#$~QY*k7z^9GswhzeN)Eo+p@T8I6B0-qKBM8A@B5taoDamE4NmKZyIStZ<8y@nm0SH8qnbeE0^ztGvB*}&p>l(Pocrmo>WNit? zGI&Q0n#RjOOIyJPSA4nJ!5*Ab&y_~+kk&~tGI_YNHK|F zhuch_5=XkI&oHAzpP8`T4R2O8HjoiF0Y9STatIllIzkn(2e@5?*GecK;6bhER+9b> zxlFp}Ocp(Vm9M8~-vzq>hT~r%dc5MHUaqB$P@umly}|hyn}O$3y1l~{zt{19}b%rrFiVbR2+0{g-ve;>A` z@9^<4K6p?1UObTH=L9hZ3)h2oFRK0**yD?QNY;Ih%S8nPoc$7Eq}Fth8Vk3wzxf9g z1II8fl`A5FID>y)Kq@iZhDEpy52y7{phc1t(O3TnUZMhBTdj?7<0T;YI$;X`C;=NQ z-HbDvxU}(wKt&WyN1zaMgqRy(nu@h>)24+y3vSCU17KVS9N#Mr#58YTHV)dP zVJ|c&$wN$%?IuuQwZ5rM2$Acf-kdT~x55Ll4G~BujVU<1&fIK9 z@pO)zia3;5n>x>dp?m!zo38Ou<>M7TKF7xz9}XYud^GuJ;Q>w|o+l># zXpgnbkkLLL%*l|11I-w_ev=QzPmwgJ>n0}05SXSzS;7V;Zbi?qxN0?Bj^c;YblqtB z55&?pNw&1*qamoBG}-m{v+)P;hz_GlM0>4kb&1j`YG!q8Ku-x&SdY&@x35(O3yeeFq1aplHU8?WK^f^zu6XajyFfcRmDx1~7v@3E zeeySW8tmzK(jq}UIZ{NChRuNVCH>)&_& z>R8sl))Nf_|1Na#8xUee7C{6v6d^O>2*YSIJ9i=n={1MBxfgkccbT8JqE_CH+Gg&t zAn!z-yc>1%Ueq%(pY`*NXv6R=b}HYDHVxlqTlwkeG_vSv{v(_lut9z%I+Jfl+pyjt z-6@WqBR$gj-ipqWKIy`Ej^Hn?;l|>f_d<~sQ%1vzB`FOjB@ffG5R%VR2@7FTkdPi# zrQQ|Fdo;|GtO%=w3(A8BV5qe>M5+_Vhm?z~EaDiZL7J1Yk}wrRthRQ`VvKW-A zHu8)LxVXF9XnnwW$zk5o8!BE-f#3S{>(9TAcW-^L`*HlmS9^OO?R^N3b8pWpMwRnP zCZyU*IZY&uwT*FOqw1OQ>E!kcn;u3dduh0?`PX;xXomrRor1b+nXHD#Ft448G_GW$P8#P+t zr48quszCz++=kUnxwW#E4hg162mE`hcHXyE=s9cYlHSa(-4(nbK3yXSdVlfet}#=X z;BqSGybw>v)?`AJRhLA#`^iT^2yJmbxS)L*-dG1 zwUH1K--EEm%_h}`H4$<9*q{~;im9{2q(PE_4sOaEbo;Cu*1CvHhA~8 zvQh-2ZhG!Q{}Q@*9>^4&e0OjMFSP@~Sv8*EZR=HhJ-)oYW*{XD$_ zZCZ?PkKx^yGk{CN*yZavT@Z03w9xc8D`M4cmo5|C_LQ?&GIm;YLOvmSA4cN^XV_x6bg zmB3q}75Wa|NZ_Yy#nP{Rs0*MEuW)LAqKmx0$2D@4qp|ovvx~vJI4H{d1(bSIWW$#( zh?f?FJUQN{;c+<+bD9*gk=o(qaJXr_tAeH$>Wt!-;2?fcAM6Q9%DGhTeV#$Shg#;d zte}Ec%ArS@R5qgpXmbFBDG6McPwpG-q^f8^cw0+eHWE(r@{kT&$}u;Mv~c4j)7BM7 zwe?y|nSj)V&rNKS*qzR)5X#QQw2_(v9s#{clnprVUFbr;-ojqH4++tSU(0?GwScxT zP#i$|^l{(rq5u!iD?g4&nF2gQP-+afAzuwzqD|mNkKjH6xEshsXP=Renp`)4HTYHA zPwiQM_a3{bfzMM%(W8_$Us&Tg_0;lQW=xFo3=pU5gVF`|i3c{z^0G8!aU>?S~vOM=DTatVU`69IC_AJDfTNC4k*%3*TJ_o|u{B{P#? zDRp&qb#+zstM|V5z1Q!qtd#%#SO4_GUw>26{!N?vS*Sn2A^sT!(^?wSnGx!Jqh;t+ zH$$^!%Cpt7q}wpQh} z9oG66S{HQ9H+yye;zVy<`bc9-to%}AW#8&uo|vsQv@Ej;kL5)LL&a^QqRjm|p$1CwwO!BtaZG1CI-zJHk(fgI9P{t)XYD z-mZwlVdA?%e-QIz2W?9t;Yqw3$005%xCo-In;Z{(f$NpecD}Ro_}Py8!ILMCpEQhY zWf0M>Ue6lwY&0V~zBq zMbq&ZhuA{F^pU}gZH<{YTiaTqO*B@xrm^Bx4J{?K=slxnjN89&#d3mO(^ z@4R{oBV-r)-jPeQyMtH+B+yqhT~-Ss=0}MeL~ZW(QRCG7%Ak9N!+<4w4U5}!WltBH zUH(Kq6;67tvOwPo8F#&bS4vih(lCS zjI^FM(qWj!gv`L)Nej;QO>sXp)*UG0nya?fRd(Sj4HpfAU&O;%Q8i03sNxDWUtajo zH)u||5It=yTJ6H8zEbP?3hQap%IR0cLFy#mVuVUp8(Sm2r}66}s|SVYLBXzR6Q~U8 z2EUWH!cJ6cVvei{-g)2RALE|IjFCA3fT4F`qH&IMaquIQrJg;}#s&GjF)Gm2njDvz zy(Jn0GP68DlU8=}-xFX4j~vfw$Nj#yA$;r{bb~ozAQC6;Od%#0rQ=1+>HCQX-4V_5 zY?v*2tewD^W_QcEeQTq0Yu&lEv7uynt8sq3 zKBnpPldb8Lx#>D;HO_|PzwpALT(2jbyti|6+Wq`+m>VyM<>jv#^H~pRcD#b!$+Si} zTXyBTNs(Yc-eBNIEGxV82CB^r{U|HK8hoB)%Zaz|3zyd7XQf;`nZ2y@|3M{Io*Nya@ zMLN3J9?sYoskqe4OQ?`-?HjzpjHgsLuMmV;J6Y+mbTopKRiwsNSuSpBSEW7QV{j$s z4Xc`)NPhc0JS)f;G+=|lG_JdlEE&ibUw<eSofSvu*CDy1*Hev^a446TS$!{vGW#K6O2kCA{OD9x znJ(p$mTrozGK3^`s!_^Hd!B&z=2=lWkE|GynL|w23!HfqOXizY+(9vw+Vb2sz}UQ9 zKRmC8^;~*$Js)8NK^m_a7ObdfSVq~fjXLUnC`A9t^!Ozf*Eu7Pnnj(jZR2CBd9;Q0-kR?o;uA3aQ_O z@aOcGFQHBD0&yuor(u_DvwX!a*tT7_OY(jjw`M;Q?E@Tw9LHkT4V^4x-}r36K<=aN zBfsMf!$h1Rl2L`$vMII_5il{AJPQAAlw9As!4#k zP;uY!j|Kn-%uaXv>kepTe27blrPSmku>&`Jh*3aKIQQEL&>PdzXp+g3Lf{Dnzh}&m zl%AA8+(tpJf@%9pAY7J>)N=n1(FeFrZ3_wYnkbJfz_>8dk(TH|El z`~vl=s&|-n${nKg@8>s>f{6e}?g7j2+Ufe&%D;Jb@SR41e@rufLdEY>@f|8?;JL}9 z0!bDBE^h4NkScB$EQ3?a8ATx}J)kZQic>`aL})G3hbv&#OF#s|vjU`3L<}f3Vt&JC zQZHZ#8c#+|Q>nv6m_OG+cOi9194IMk=12z}B?=1+Y3S)YpGYDF|Ldr+KjJYq-Af$L z=>{+0pQlk%vtea5kFhDm?^4HXC6;d3l~*D&2l0U4z*-C89m9^57wSRDIpvq-TufYIZO#T%p~X8VjafN4u`o7QG5&IP@-^@D4ILqAIrIP zXar7ycvb{Pg3(TWsL8=g^x(WeR_C5`F>Ok(Aj3Gb3P)Kp(i;neaqc0qsB>ydJ}t8c zJRX2NAM+pJa&GEV1^yH_Vw#iOkZssYoLbsAWw6dNTh&{nF$4j z)QT)bPZ#Tn^)sCaTd%YrD*;Mxk%!9c07)W>pFV8Z{3(X#k^!k3C(hGC^|EN~^Wd;kf7egrWD zzS5Qm%#JI>WC&ykzAYIK?3ek6IwEXcOW#b8+#6Xc22KF^`yy@4O#5K4rF?xZNJY<1mK}DN6?bGnWe^a{tQ2{D8z|xz#H6Q=+LU(R@zP zpp;lvK*l9XGE*Fj%<_+dB*!Hc2%7u;ab_ZT%uN5NeNJH6iW)z6KEK4Ix#$d-Ao107 zkrzJm&`g<1c$#EMCM14^LPb%`=$hd366{C1 zc(RDGWzWyyAP#=^Ogl)PsXeiGvSK%kcfBwzY{6ExX756lPwzrXD@dyXqNnAt4w|a} zEeDy4Ai0GcB`FM%Cci&Oj+>d@l=+B8NiF-wSXWk%^B^>eyIo`z z3e4XfcKHXm#eWM0`bvLSjgj!=0rS;rvlRjE1Oryf%$BE@SOf3TxTU;>6Gb_%f{y!t zy!T(@AwjHIGb(Tmmnc-x4MbIjQA4c1W|k@E_wH{X(HXlSw?o+(vO4hu!Bzs4J28mG zofxi}SO`*$U+70Qv>_?>Nc)BU97_46Ha5|MT>go61&;Mg{e%)}Hvjg4bAp5!D??pR zjw^{x=s7l@Y0)}hWC6Tn!@lt|M7Ap{)JU&v94NSgd3jG=;6 zm|tjL=wBEela-i_P|H+7R^4jdRAObuqX_NA6w zMnCgJn;>jI(Y7I>gC@+(Ao)qEv7G)|64IQnE8;a}z0P5f>?s`;PKP5bAQrBS;MAYZ z@*s3G_iat*QB2+r3?@mC6%+%%9l+V`f&C*o>&h&A8y*HZ14n+1K;m#Vkn+01xlQav zG@7Zgv9Xht5twk_O*j&6%c|Z%jOb^Dc05GbNycynD#)XeX$XqJWF%WhBn$s3<)%-} zxp=mr^ANqj<_R=1{RMcEvE7OI$@^i!L z>{5Mq;FR)~0?kSoh*CV@8nhScMV5$vxRl71P}Ew=mn6Db37b!o&T$F?@7K3O?!+J9 z)<58opKP>Z75KAeR13ClfMAfftWs&zab+XmNA477V)bSHx>3bnSzkj|HT|9c#}3YP zi}Z@T&qJD+W+!?t>M}8@A$0}{e_TZy$OlC~z?W|UUy8sNfY=z;o37z*DY26!O07{$ zB*$J4hP4kK8gXIOwZz&VWhKH`;&*&0HFHZ*b?Rx3RdD()Ub z#!_+kk5NOuDfSpAV#D{SAc_c^fXQ^Y32;4+(#;%gYlsba!bjbkfJ2`m_5?Ld+9T`%0H$ia;?buEK4rx%G5CL z;@PYy5-=KmD!*wO<6F3U?gjZvwEY*3JZ}d2d3C|sr3vpe%I70LnXn*pk$50sOYRf@ zD{7;$=jM~5m6lD3I=U&p0ousb+Dk}*UA6DpmpR>=r927l=$I1>E5O5FLW+~Z1exVw z)@i*_O#e`Q0wV{7j{&6La`pIzBr(xB+(Y^yN6oWgK(6c3Re`oaYhQqJvF0g!r}0nj zjET}kF@^9Fd2^nJ6qxgqyW@O}bqC+e=!?E|j-6v#3_jEQNQmGe(84f)Q6BqZGm6(8 za(kQ7-#HlN?&ck7lK2SIOn>m3PZ$mRJ`aH2^Ha_b4!xK;CQ9+DL^aU(k0Em9A&E@R zZK2$~3EKV}hl*QFnZU#za%yk9DU(=~LG29jB@!7_PTHN7h~WZ%l+lx(%G7^WWpJ3o zBnU;5O6A~I@e#V|B2C0%-W0)+H00J>vUU1dx{1%yP2g5C6rk?N;wz|l<6NitFi(cT z5?fl=&vsJ_AiwP;>g)Ux%=NpHlq;R5#F5Mq%IvJnyzyOXqZEczTKWESvYM%TW^b!( k@_o=;m72ph3i;)nzMdmwM$n9Je@5A?Kd!CRFV_zL2dpI|)&Kwi literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e8cf29fc230f96cca508d13d84edefc8309064c GIT binary patch literal 406 zcmX|-%SyvQ6ow~ldZDz`g`kgM7j-PHxDm0o5rcIixl{&kQtStDl%$0u-ivZ*Q7s{tI1oU+X5PZs z%hD{N7$>EYHwx@nDP3Yuf2nfO|>&@?~1*Oj@d zSq8qc)Y%kIRsGlBLmIvto0A*G*tu^Y>54r+_~I~5{FReZxN;KcMU2pdLw5;NHt-hf z6&dj}eCjSX%fZmwJ_qiJsHYH`F!tlVAM(^;tUn6qmhiP0=Epz5ewflEbQpA*4~3Lw d9J>*r{5am^&GR548KW2Fzwov|yCO?}=Nmt=ajyUX literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/autocompletion.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/autocompletion.py new file mode 100644 index 0000000..0a04199 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/base_command.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/base_command.py new file mode 100644 index 0000000..f6108c9 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/base_command.py @@ -0,0 +1,340 @@ +"""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 + from optparse import Values + from pip._internal.cache import WheelCache + from pip._internal.req.req_set import RequirementSet + +__all__ = ['Command'] + +logger = logging.getLogger(__name__) + + +class Command(object): + name = None # type: Optional[str] + usage = None # type: Optional[str] + 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('%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/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/cmdoptions.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/cmdoptions.py new file mode 100644 index 0000000..a09e38f --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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, Optional + from optparse import OptionParser, Values + from pip._internal.cli.parser import ConfigOptionParser + + +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 + # guaranteed 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 = {} + 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/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/main_parser.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/main_parser.py new file mode 100644 index 0000000..767f35d --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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 + + +__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/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/parser.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/parser.py new file mode 100644 index 0000000..e1eaac4 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/status_codes.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/cli/status_codes.py new file mode 100644 index 0000000..275360a --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__init__.py new file mode 100644 index 0000000..2e90db3 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__init__.py @@ -0,0 +1,79 @@ +""" +Package containing all pip commands +""" +from __future__ import absolute_import + +from pip._internal.commands.completion import CompletionCommand +from pip._internal.commands.configuration import ConfigurationCommand +from pip._internal.commands.download import DownloadCommand +from pip._internal.commands.freeze import FreezeCommand +from pip._internal.commands.hash import HashCommand +from pip._internal.commands.help import HelpCommand +from pip._internal.commands.list import ListCommand +from pip._internal.commands.check import CheckCommand +from pip._internal.commands.search import SearchCommand +from pip._internal.commands.show import ShowCommand +from pip._internal.commands.install import InstallCommand +from pip._internal.commands.uninstall import UninstallCommand +from pip._internal.commands.wheel import WheelCommand + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Type + from pip._internal.cli.base_command import Command + +commands_order = [ + InstallCommand, + DownloadCommand, + UninstallCommand, + FreezeCommand, + ListCommand, + ShowCommand, + CheckCommand, + ConfigurationCommand, + SearchCommand, + WheelCommand, + HashCommand, + CompletionCommand, + HelpCommand, +] # type: List[Type[Command]] + +commands_dict = {c.name: c for c in commands_order} + + +def get_summaries(ordered=True): + """Yields sorted (command name, command summary) tuples.""" + + if ordered: + cmditems = _sort_commands(commands_dict, commands_order) + else: + cmditems = commands_dict.items() + + for name, command_class in cmditems: + yield (name, command_class.summary) + + +def get_similar_commands(name): + """Command name auto-correct.""" + from difflib import get_close_matches + + name = name.lower() + + close_commands = get_close_matches(name, commands_dict.keys()) + + if close_commands: + return close_commands[0] + else: + return False + + +def _sort_commands(cmddict, order): + def keyfn(key): + try: + return order.index(key[1]) + except ValueError: + # unordered items should come last + return 0xff + + return sorted(cmddict.items(), key=keyfn) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45eab26472f04842af40d2a258f9e58f8761ed90 GIT binary patch literal 2505 zcmaJ@OK%%D5GHq5kI2$mb`;0&D6cjuYAHdI7A=CHfbv9JBdDFEStMAjmz2FWxvP+? z_yPH31MQ`!{()Y5>d)w3DE3iJ3~vh6GYv`P&4E#$@%!rP&X@;(m%ib`SOn< zA%BxoPX+XEK=dU_2qPY0lv#pG%d;rzwy>q+IYxIxPUgM5(Q~38i(b*_d2vRTypqui zVoa93veAp8B3;il`WZ1Ut6tUUB{3lg}qq|~8 z&U&*(9~X0S-kUdiRV>IwZ;=wdsQ!YzPKXP#?$zZ*@1hx>6qn>>?=p-}^CF++C0^xI ze3IvRjnDHkceuM=@vgA5taeEFm3!oXdRN&3n_}k=srLz+W;2Jx`;^VHIrzQC=2u8# zaqnvBNf2%Y>%1N&aT-K%6tC9N>sF1n}8?;@R^ znC12c54TS2$_fuuc>42|jb!^|+ z^?!J}y!?3iVZ+KC+)C!G?shqZTo_Cl0`tscLF<6DL39n8i1f*;@;>duyGeevUOOw~ zcSO~R1Ib}Rt9d=6p+aBNyh~eM6}<^k-g*o z){UE;y=@s@hi5%*t+wFwmIh%h-I9Ed=^c%oM*JvFxrzhP3I_+=@}VzEeZSe=eOJ1} zqA-P_?%mID?-)p)s2TWKJ&q0|vq3@-{WUawqN*uLX=)u<`!p`5bkjZ{`*df%Pw$ae zwU^euwQu*WzP;&mtY?Ih*Ne{~CxM05-t89=7fjbRaEi0~wZXpX2+Ze08rF3W_@#Cm z^|S|!)6L~ZE^~eS#vcZfRfd|6L1gZ+nJ54+%S9=dIx7sPafIUsmywADj9g&2A(07~0 zzd;r90T#<2(OE5^X=eo>7?M&o!B#D7FxA1|bl{R|7Mh138et-|TrfS$4Z7NBWCh=6 zN$C4o$@e?Gw5Pc5E5tUt2&vsXPV46I+)x?RW`)>iS4R4sD%T3v&Mu5_WrGT?a_F@% z!mDG7y2_)^+z6iysPn4uzaCKf6+%C94gn=tok5TJ5vu_I!!3o$IdZew+!+c9HgX{i z*N8%PXNw~i8kAdw|3NamK0kIKz2Rk}Tyz_?>217!)Hu4#zCTkhjf8HdyIr`aRTUlb z17iXVH3^OP;SNRATnnHY3}~S+ixj4xNq~c*co0w#S*V z(1XJf0|)p5d(@li|?&>*qf%-&+X%i4G0{ z{1QmM0!9(VISTc^k>kP$4Xm-5n*|9;VTBe(3|-mG+2PRr4pBm_cZgcd*qLFE;@4BvwYCo`7Jqbg43@svf9)#}Scu()Q2vM3e2h_X`Fah@}pXhS#0 z0Pqq>-Ur4|h$#vUibIncA)#hy0k*Hh2_0%fAdVWGX|MYzHcx+KB1_l)t$lwVj`U~o zlKBZQs<_T3IrAy2SV>u#WK0Ii>Vn@Kd46{uRDw_apLkVgyp(Se69Up_2-E{Q1CqZ3 ztI-Z!8e4NqYTTMT4A|P*tLLrtEqZghby~A^j?tB|byxRWOJk7V-S%qpics7-t=smf zag25Zqs8e3T6}(iRt_QTfRYu~#xx8AnD9dtIpKG+zvUfbW|Tg^0(= zd|c;`)5&T{Pvz6-n`E+{KYo&K-WJK%aHi$>hjEovC;O2+IW5?R%9Yf@j$j#TCdxP; z!*uFh0-JiKgKDiz(UhNnZ}}B4ggrbkJm4Q;f(?9RYW(RQ4=^z{cMi890Oj+MtK6td zEQ*vDMFpo#&HxXhXwk&Et_D0gQABwHfM|iT8VNhB9N9obVlD21_pS&B>@zKcFAeGg zNe`F{p%6n;Cm(sr(Y=J~hxZ`c;5O4B$+KV*OBU@@7JBv7|1R;030PKGz@RHgHz(c1 ssNR&--*;mojzLrCo$P!b#HV{Ebdbt@ex3CTJ(E(m-ZcjJ4)M%?04P~>@c;k- literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/completion.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/completion.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fd55d866649d07b76f61283dc95c6fe22020559 GIT binary patch literal 3079 zcmai0TW=i267IR~dc96a4g?4X)c6=_2Wi%^5;)RP91)B`;SyW6j}F-+8jYuW*R!6T z*>v~X@vwe!B%VOxorm+vFX2D*E8>B_z!O!yH#@e&tfsrBy1TmitFLPN_QFE#_y7O; ztSzmZdq3-TxM%5R}zgjpHsSuM*#+0N{iZF;BWK<{L3&ue*R%+35>rBwmhYgL)g zDy+)pes)@OUl3Mf^DhXS=iZ6asxf<;1oc0_IteU&HQtp)Hc&iDd;LPFhoGyh6}?`Z zGZ3pCuA;suI^~zOf6;#0ryn%r9?!Bs(xmA1Gp^Dir&7g2!AK&~z6#_kX7ZfX;@2!f zYIOWWU^SZAY6R1f@1_z?UEBC(b8CI`>qn~%y3{bA(f>BKKHFYhT>1_NM_-RWe0sb{ zpPX4b*=pRI$!oZFb!jHQdd=p8&FKDrcQzti@b&u6`sxZ@TA=}*xqCd_b9@?3!-6v2 zjt7~d;pgmmzu~mZNP}p1uOoL}fJm>Th5?ycou) zoyxrl%{ZcZ3KL2thX`fQPqB(NAc~j;S(;-Y1G>0)`4Yn>+PL7vy;$v`tz5-vE@_z3 zFnr0j3h0Q3hRy+Ccb2|0iXnj~uAW1YuAKExi8Sv}+0Rl%pHQ5IAXBj6gZFpp@Ay zmpLtuxh?;D(zck#{1??$1&i1V(yD$>T+*6@vNfl#txc;ANEn~;_I(N!sm}#gB-Bt< z&|OXkk~7*aX6o^wpkOt1ZT3-y=M21R=}rO+GY^*PD!foSYk%waB`ja7c|VGOlUq(NH)?ffZioh^X&3TUs6wWRBHefHYWIkBUpUO!GYnqRKf#iv}X!+`R;lT2rxS?h>ROtaBbjfKQ^UCduFY6 z8J9}C2x;ksA%qg_m%;~=9ysknj3m%%=_6!okj8+s@9$F){(*8 zg`s<5<^mt9n44v|2^B|4s`mIfz7=hw?xY7Ct_ygBn5K~p{$eU^qw}vr(}A>kT0e&J zFtpwzKiSV*FmC~^LU9v@16$k8TLLal#C(sMci{8S+TARb3UR+@tf6V2l)-rj#UO9q zHGiP;9te|FnrPSjDcjl~-Db=_EzDztYfQpL5~Ez&&j#SL6o8RdZ#Z{nA4@RfSO^y3_ng2LEKfN2MC z*aW@AOd)pFx^C5gh;{3VbHnzn@{J3T3u>6CdEDcWsI@5S6>N~9T#uq>gE$+HRHBF# z38-CE=!zTweZ>(ZZzsoECHS*J3O!Kbz@&$`1y1ONakeHvk|>&a99ZIQ7#A36Q!Q|| ztV1)(9>^fOe$$Ku^XOK4pax(*5=a9PV6y~G>pjTX<}_cMNtQOD6k_c(=_N3$^jl{q x4OE)RW-kR&V5md`oAv32cBY43dhV&Go;p4BKiFeCJ>(DQC8vIGK~kd1B#t;(EEcvW)N|SL4^;3?y?ZEK%Wz$7eztT@_G^X zg|`)mq*o99XiLq>Ao0D1p2BMep^uRz?stXXs3$(Bd0Kwrbw%82&~k=<)}SK$sQ3mc z4GLp5i<>o@TeTdwYtH9JlkpsPo)v0&p67*UMy-$uS}XD?UdD5YPxBevr}!+N!@bOp z@Oj*)`BA=r`wV}9AH#i?ALl1Jk<1(S{T#7Kv(s*Ov8A;9@SgE z8^(=#=t6;RD~#7s&Ey@ZtXe9$gTJ-jdLvV{yt>~S1~R$ouAp?24d1Odl3>dppTj*D z3%4oaj_yHvbY<6X1kC_C98K@@023{v)ZNBb;p#y_gk`$aFBYR=*nq3B@-1_Y2HkGDQ5^Yh+;kTg zd(s!@aUZCYG`qM+mgLrj?{={|pPzT@?!eGSlfdEv5l0l-aU)A#z$ zXgcmU>%B0k>IUUxo0I-)^!^O_fcxkgtzj|l()8CKyJQ>R(dE(NVz!~~wd}swttT58 zOHcb&HhF&R{rKii?nXOFJME6|^yJQZ|MzE2&pw}l>ccH`;bP#~C-d1pu{q?u#758{O&-1Rb4A6o4&W*JK zDRk@6QLEF=^97oJ&!jZ~9bQ;X3q$=YC)2;mNw}Ave!Q&x%!O6JBIri%M}}5)A4p%i zzqq~j;GGp0{=Izj_Wir}+=E8ERTn{hJw!LyY!oLhjASd|KCf16WpiI9$|1Y}Fy{vb zrtA$r?9!?-?@?3PU8Aom>7{vz==ncSU&jLUa^#Lo{LbQ2%sk0&;waonoy;v&k*r%! zmYyDtr>1WkNUp1jIuww3rW)2;CVq5B%Y_H$JVF{jSlzVvQm}mT-RtroNiq} zFY0IjAQTC8K(p5paj#pklr8iO`SGzmnBm`c>CErD1uzAxl9cE@fvydCrS;6|wI{K$S zxN-0cgBV&JDzq^S_vH33F3;KTbGugGEF1EC-{j_tM&H`Z zi#tiK?Qjb&YPSnXv2X3M?8l6xv}R;IckP{Hm}d$=V)OE*!;4>-ySax(bip=~@@7eV z$&6imI9;IG`c8YA=HCP4&>S4^K6O4cBJ)Ednd!6kY(K|KUtne49A=$sAK5dQv2(I- z^=+&QUVBjlnWMBC;6X^Gx-ysq*y;{jBn}UI|2}G0y;8qr3S>-g`YI{vj zt@;RWi0~OExaU6Etq|_OgqyMGR8#Z3E6zc;qC&-MRQw19k+KLwJq_<5bcI01A%%Zc z4C6XX8ZPmbb_sjp_@ioy7MG2eY9>Zdgqe8*K-3(M;)j~Sl0B+rT~$f1UbiSGj9V=@ zOb!kg3+2#~>kzmd2k<5t3#>Vc}T0TvL#!Nd`~6lDC0`QkJ^=;92uSYW#AsK_@^7^cm#U&)?l z1$c>V7Hku3^X44G&obGJSweY|&C|1)o|xzdm~`XyTG4NfteZN4V0{mdt&Zk z<2dUxk0oHkhg0xThs}xBn6r}dWx2l(5Y*WJThV_O|w5^tJfttZ|()U*UR=u%v zXhPvX=>-Dua3XZ;kUFG_gnxdWSI2k-X?G2mJb|JGXn8#MvAN53&Aut@KKqUN#9kZh zH*Gp_+N@qs)~3Isa@si#8N}D6Yh?HU((d&?(7f~k$8hZQ%EX;MWVqF9I(LxQQ5jAn zs+c14=N0YG{x;k>+|is>^H_K^91IDW@AkT&p6B)%GbwhTIgdGiWloUL;y4urDoRvn z*Ktr&_Jg(Md*T>Xom(q+-+gCAEa0JLuid`Ctjt&{o0uhNj%LQ9NIfm2c@cl z@jA7ZX`O?JCl9GiyoDZL;F2V$Va_lIzbv+puQ;~DO8CuN+PBOybIbxOvw~@|^z`#+ zb>vIrM_&$!E6D5wmQYZEFwSaMO5v4Ax-n+6nPWn_zqoy`H!aGq#so z6=yL^Mh=)_QJOm=-##NMj+*j-$X?`892ZxplSZ8!_M;=kWi%)|h?;RFcR*Jfu_(d{ z^7g}eT0+}ja7o%71L$#rrS3%e4`A%qA1keWZnW{1p;=L_{qtEc<|<6uWdEb<~sft>L-G zAkY6EGE?yQ+rG>Th!W|m6L)qzT#h6slo=T|1@v*r4{okbh{j|tX9?Q>Z|#`0Q(0ur zHkKfB%**#JmtZop+%r_WgyQeG4sPeEiK6XC{*hQ@=ySMq?CYYU#R82R3bbeJ!b-WZ zSrDfY{qW{9wlh!OO1|1MiKu~QT?Wmv+Yabl8#D_!VS0>WWjo(TBqUP!8GC4a1fK?> z%YB;52%XO7tkv|)jkp(boo$U+hKn>`#9-ruxrA-i^tC~Dhcg|#YWPyRz{Syt3DuDj zA)x{XE2<+0fIlNene)t%QERYFV$GH`9wSW~&8kX`4ZpGJ;fN_z^EXiX{DbU+`uI)! z77G8$2EiW#cd%mre_hfHgHbS>#U^$RDLjxh81OXWb5!Q5YQ-GlD5mR${>>z^k^r(0rn4soDs=k7)vYA%BRiV znIR`?GeSMM#%pj56OM6(;Tc&C0e=<_k)b3AdbAlI=?q6Z1Oma;2N9h?kp2nv#uNRj z`$6c}k$Ho}fuUm`=va;T*?O;49RvVS*XNGxXQ~O{*xfG^8@iy5`fsAASxp$ z(hCZGI!FjYoh-W2E(%(@njRc~H2g61ynPQrIDVBn=@3JQF%%^vofH&iZPP~51!sA) z@Ot5F!5RE!3$ul?KDeozPy}|*LX7%dOcd}lcKsGcyDdKD^I@=Z;a%Rp(dfiufRwIS0!nMo@t`oRO UN)P}_aIrGwv|#3Rm67NE57+Z7P5=M^ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/download.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/download.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8de66bae7d0c6f9397fe36816c1bc74300b7e0e GIT binary patch literal 4720 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a942fabde546af92e2644bd750ee44aca06ef56 GIT binary patch literal 2867 zcmb7G-HzMF73QBrijsEMyY||3Qin+3A_|sL+@xq51Vsxw34#_*ki>PtCLk!zNTPQ5 zlII+F&G7XF4 zxv0$|DQZ_xSr#(SnW$Zo2+5Nv&Z#@6N_(u%-#q4;5WfLIwLm8t{MQ4M7=cC1phK*n zOWeTzUYqHpOYE2MUitV^3wqycmKM11sSo=abJhk|XRe3mi&7S)^pZ@-h%rjMB8rcr zITc`eoW3X%PE(pm;msQF#%{CiYE{Ik$6!8oVngJ`k)S@b(M%*VIia3F*dWX~p?uuz zD@h9$CFuhy+ma#KA-iOc+#>tr z;1$5P)^(fQX}E{rcCNU0$vtp?M(!^=vU{l?YUGVq0PlLwo8;$^KDgr9ONYFrWS52l zFB0fItqh-6L*L&@OFh_n5p_2z3YwAHnk9@@7taLsAwY@Y;MK-I+I~UMY~`v}7_Vph+ev72{E-wg?px zM#U<(wN2EKH)r`YVqO%-REQ&wvWlPr;8SUYh_LO=&8My3>{fMG53B&(e#pZq!e@{gZ=U3ZI! zs|X#aKEmaCSvco;S&You5|qtqE8^&-#_=iIYcC9A76}oC|ImKqlY%EFk)#tqY%fY6GT%nI#SW=hPrGC)?rz3v3>MXm`zC;g{ z4mdpw7o(3cz!+letgMwFufKj=@i?`~h%^44;Hd9bpHaaU8C zUM!w#&(W_|*7EkHrfYv`dzbkXkmzrd0Jq7cYbQP9EPUrNjb`o5` zNG7TK&CM9b>f!|ku!O&nv=SGpc4$#7lT$EOXxEi^&OM@rmG@2NE=FSE}<2&GHY zcl3eo05Ps%0Cm?tg)G-J^gaEaQQf+UB4`*He2DGMgs%e>X%?jvMe2si!ICL@5QZ<% z5Z4kr3`rh?Z7D|GDFwb1YFm^j2!3AoSw0W(B}1cBG$q0RfCK8`x;kUZSQuVAGt&9H z$^hk4(V+@et=4TAd{{z3$J-`3} literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/hash.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/hash.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2289e0de3d3c2e20999789e59b69aacb4cb85663 GIT binary patch literal 2069 zcmZ`(TW=gS6t+FLy(XcpsuFI~OMsP{T}q2URjH`j(tuDZHW5Vwl{Gu|?#^azu|2u0 zHoR=5K2gL!;FVv(fAA~ffxo~L$FrNXAn?eZWBb@T=lj0no9%Yvk6(WK{%04V-_a}0 z2KzJU@&_0gVmLu54lp)0Nk~AdzZF>3-wtf}TZxmpfm`|5iI>)bT4g&)J#7Syv>7z3 zxtp}ocF@L%Tay*OI>*784AuZvV%I!KOqLx!Fn|u$UG?( zr*T^3LT$sEcRx?lFk@gk5BvSc{SMLX&+mQnxc|lOL%MZuXG^ztcKeUFA61iwJK)$9 zJY+N)m)V|-%-yHWS{m{bFgOY@Ly#$kED2<21rDz>@OJ9OA{xgByxXY!cgI|E zKMFH{!2MEk<{!pt>~C&X$Kwo+3%*~*f~P!F(jUeN_f_t*9M%gSs&J6->ZUl8Dohf& zyja`jhUxl7A@Y&`U0$d-&*W48j=ABk-|cp%S5JdAo?Mz>{}rU{?nZbCmI18+eHFU= z5(b47o}oFJkQttl7a*D$nphK?VMdsx07L~KGI!!BXO1rd^*?%*Pi<0XHRC%cMkoMf zeS1na!)bGKGfYOg00dH9e`z{W<$_PI0ay!I&$bK{fZA<8&$x+yLr%$czvF0|ajCQy zjq^C-QoCVf^4A{Y!>~*gpu>|wnB0IzN0tQ_q6RZvqcqN9MX9buDWia!)Qyl;7Th49 zf{<{Gr#;EzOuI!WBp3QT;Ln9J2f&SvL|zshOWTqsLv4p*BsJMP1Xb24jgnAGN`FOv z6}>{l2chD1H2MJADC_O^in!QZ zQoeaB?}z3mQSas8)v6_*k7WtfZ-}^-GnYpiios;wiSE{3$xxi zZzvj;5GGJ03?Sk|7_?{96K5mw4$OkLp^Ca^71WKAxH||Xr^`|j*8e!c^Q%e;Zt(O} z($wq!ys1<%JkKU=a4K5;rGndU^DzM7wmHaCiR|>A( bS?KVtdEcr+Z;={?5AbN=HQXW%YwgeON0&QuGo8LENC}B^Re?ArvKKkyd0=ltN10 zwIN^PeUM)JBz*^7iyrz4J#{GC#kL5A84ZWz@cU+l&rVOnKY#uG=hqHGf1q0f=I9lO z`W6&L6mwMK1Y=`c+$!zF?robprJK0D?QpO36Cb1R5Ot|{gQ&;sot*^KpQ2Il7eqoM ztna2XRq?iAq$ul3HsJCnRavHj8gu%?Wb$S@1#@ulzLBz$nK^wN78tKU)K{PwN-#x< zMR8(ND{-iuxYS8J>Lxz*sDFb1K>!F&^qsei*N3Q^;q*gw6@36tG_Pco?I9@b7}sVP zM*VnP%PNmv99Ca$9(?}P_;8zu zxq}*e8OkRZnXhrC=qJ>MCIN2Ryj=Xmg1D27cPmfFqEwVS0~fV^WBQNs;pLF_aA8T4|D^!|w%U z*L^vqX)x`jbmELVJ#sPF|~lgIg0VQ_N%%nDgh-*Wv*@o4ziLG zk(NxmdCQd2cByjhA0YgOdH+ z_44Vn`R1z3p1{aO{5}R|mxWMG%K7Es-Ozm(%6<=CJe*K2LdR@{TD)fb=; zzGqq10H0yc3UFYB*uiJk8T>45Z{2+<)SWkp-gz#b6tu}!&Q z3p1Y(T4i83d-|B^iq)YYHk2XdS%Rr{<+;Z)M;QAj$CA{{YB_R0041 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/install.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/install.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d9b73c2e33df08ef97dda750b53763a89deba921 GIT binary patch literal 12904 zcmbVSTZ|jYb?t68-y9C-t_*g4@IDnQ2aw zO;tBFBHi@HJMtre$JU3D0EQ9Rf&G!>CkXOF5(NH9@)P94aDt$b00DvkF_4b{`P-l5 z+^TMpGg`+%IMdbjyj6AU)~$PP^|KQbxqth?-@N~sUs05QRmOfg;-ACgy`w4$Q<&-~ zEw!eq6xSTBripi=mJn~fri*v7mK5()EroZ&Nw+e!jA)}f*;cNW6Y->zZxw0<5l=Z2 ztzxYx;%R5HRjQRlJmXBYrfbt8o^@tgv$fgQTy3s3Uz-Q?;i=e9Af7 zI#)Z_D%Z-b^R@FLZ`ygfb)j}a#AlpJt6Hn7ij`=tS{L`!+9fv2<{l}vXV^Sj!28)Z z6n2CyK2q4CRoY9`o?}PZG2}nbjT`?ruc zv3_@L?e>lJ_4=DP-ddxK&dyeyTb|qH4a-AD?%uX#IoHg_wneE%i@6=&cH2}oecQU< zwYk-@+Ws}S)iT=*xyc*1Z-41_IT043yc?XmJe<1O_I%TEOlmE&=GM6Nz;?UdYhBx6 z*KIDc%UW1sw&!;s$oUDL7J59)2VzU8tR`X+Z<^_I)*O}ioZ zQg_?+UAxWPT^hv19jny=TTtEQJ!BNbVhC6y?98@Z)%W;;nYL{lN6C)dwbD-E^bkn`tyyA-p-|GH~YJ-#zp+L+N*a~!J|slbLF{~)o0#A5VJet0dswe zw@qiYA!W~7jp|lAJuItN7b6?3!5Iw3%OOy7O)aQJHKp+-q#C4#=$FEi#3LA4MZ{P3 zlz|>7O*K%11Tl3#F-QhFKQHpMI8RlABp90Lzb&{U7D)2YGd5jrK&aw<;$1M9)v?;l zZf_axi0hK$PjZ@Aoc1hF2v5Q6`tAm87PKzQ(T7QqQBH+v5wUnU)3G|wUwV;bdDv|@ z<5*i}qjw;apTs09HTte67o0B{aC6%fqD8SFVj=)lCDpR26Rp@vP`aJ>NuGdoEP&QSTWT{7)TAHO< z2HGscvMh&pmgQLi@7y;OU8&{4_KC1~Q||vr;g~leo?<1U{8*B)8rX3!=R{e>SnI9b zG|oY58Lp6gY&`2Bw4TxRXm!TeXLuc}fn5s0l^dX9ymM{cz+P@*a~fUl4D;V|8z#0+ zR02&PcCT$6svxAI1yx{3U2B-Uu?-D`YGQPda>H~y*YLU>($>Q*NF$?J7|Ubh!^CXI z@|G_^>g>igb^pL-mY`&|4a@X;#;(~je9#j!=@}-fx{hT)quShUlMbii4QzMG%y_Sd z=_tcoiP>rxE9ha%crQ8&J}@qi4Q9lwE5>_~4#74CZ!5$4)vDy?1q9@ZIH&KA1Rm&o=H63 zw=_~Rz8WZdT2q6P(Y_7q2g)TeNCb(d?kAh6J!OybWGa0il{t{g9!TXzDNu@RhN%j`7r&Wu`v{`81G zQZolqvjmu?lA@7+{ z9>#QJL>sBa1F542QpXOYjvq*!kSS1D!gCT5W$bC`K*mt%u`n)9gA>Cfhj8c5TNo z+O7{}+HuSV)XhVfc0z}d!iuc{=$x3sUC%Nqm2PK?o6I7O^hC=@rI1FHjnIp~ZM3aj zBeJr*YFQ6;W_f;?ZdtwwyCY0T;|ld{%jxt}=)=QVIf1ZFvASpbR+#f(YFTxkcdh=P z#xunr$S7Lt`P(?LsdB6%jaa|;#5v!C*=%5*J`Vj>)wt8^z^-$gp7E8{s?aN|7Yr!= zm8)xO*RS5Wy7GQR5>)R=tFLODTemRnQFqL3bV)f2`%v^k1Fha&zj3?%+ST* z!+==Wj=6y|FcKTA7)rM>2#2QZZbqh>)o$SYjuIYOZA2yNwBq?3w(VAr1cO!k)5CEM zOTtoAw;tE+7u~kgtJs^Bwq-Gkg-HvBHaFkEDRJEbV_S9`J#M?ZqamOJF*_QXwAkpd z7NfP8@m?g}FB>aS?1QSYET}FUl@S%12yrqR5ySS{GC9Lu#KbmfJuo*30vcV;A$Sm9 zJGKa7P8l9n(StqY30909{({OFdxqRU=an&_gVUyw9UKjn(;x(kp-Wt$JY;V$U%>YN zYhPtuYyw`Pose#9yEXu=+zL~b3N~oNs&FfsSvV;&U>rvo{a0?sQJ7&vDC8Ls$+lr{ z(okSSfsv-eEtApWRD8F>APQB;=S`9Wd#ep)5+fL_a!KZlAW8rEo1%`G*@(+S4R>xh zAX;^*fWFFA5`KW54pbdipL9-`iO-3!*bxWI&_z&$f5s6`70IrIxnXmHO<`7|E*v^x!sCr_K9Z-Xcdsrf zh12L$R<+@;kW_MX&`Dren?U&}8BRuwrpaMSURad=m0>zd^z63Ddtsh-Xq2c;kQT?$ z8I@&Ft>IW^J1j;cs&AX#w&jHdf(w9=UVQ^c@l?y)u_EI2E$((ZVP4>aD3OA%hR)_0 zjLYKwftuxHsC$;P8S1c4yinWO<)0(g-f{eUnUvn4s!&UrP9o>7UEi5j(7qzkd`@_WL%O`Gub$v0W^-v$NHsK zvR|SS$49Xz`jI0Rqb7RjS?w>}lnNROfShpESY#V9*glO3uj09e$NMh)9lr2s5U^k> zpoZGi_)&xeJJhDmFT!X{HPaN|gYToRqkbk3Fk+t!N41&dwpkviQx!zM(IFt#xl!(Z7`9&6wE$3elLMu{He7=Y7$0(pNn znDC!M-dQ{|1%;LNwL$T*)_?R^>m9+^&IQGQ0Am&-RGQ@=zn2Ej&Ic1s;#Uq(k5=hv zJQsojo7ztgCjCk#{xyn6rB|aGmk4eSj{4V|H-e++`bEmA<3ewXqfoT7oYj9{0qJ(9FbH_5yN+fqy zfCnTbvOrSUrZ8S{n!=K_H*r#tlPfyx#Hnb+)`!=x#dLA<6MQqw5#^{!)woO8kMLJz zXrhq~NW*zxdp2PSpcsLVMi&;<7;KW+CP(*bn3B`MS*7pb=<2_EN8oK>6+l@5l09Ri zi_v<5x;X+^@bSf<8g>S-bQcz9x>DJ8Th^=O298c~;oRkKK;ws#2Q3Vbe;&E~CW8Jy z-+@g%La}F8yt4#RZ8#k1#svHt6-HyB+YV-INOL>_2@(|(d~4vUh%7eg8U{YWJS?)a zY>(_7RyD+O3X2!4ZrQ@M4NyXESh`0c7~*f6V;xtGo15T?)xebyD3fbcAbzjQ+zSRk zx6y)cbJxURDeJ6fRNgc;9doP7&tZ=6pr@GS5UesqlHbLvHZR30@~`5GMvl0g=3hWD zobJ3KydDMI#!YSqW{_&Zd8^02{`hYbWrg1kE_z}}1Qpu*H9*(zMDPnehV zh-((7BbvWJ!Doo%Ol002Fj2oq#V=EFMjCe(<6oj=0(`-4nGp9$Jur%{m@xMVIj~qN z-bP&@fMp^>W&x*b5iyqj+BLcd5b`G4#A}G{V0?Li6uFjRHyUd<)(l)Qh&5}NZ4&=+ zzi}ioPOqmX6h>%b+J#f=o@!mh%Uc)1_dSf;I*B5n!Z=9g8mJ^1Cj_Hr}dxmj8)b`9wAPi|gG6 z5T{43nQ;WY;{BXl!Dy7R9yWk2Hr?`Fi6V|liHx*OWWh^QoIg*U3egbKskvULldcHU zxYngeEYEax3LFdkfqPH_C~s0ri-I)@gp55$u`C4>6wsv@yhR>qCIovqT{7_!1+<03BOSNX1-`MyZ?$L*#PaY-sz{rYZ&NTs0c|Ya zqJTD1I1%q5x`wsnMoNQw;+A)TYD_|djg#lEQEuvi>2%>wSR_hx$Aw)jCJ^dP*KUXN zW4FKJq^Y}{_WY|{ zo$_!^1Sdnrg<3V?#sp0DeRASrx%fO)&)#_0umr{nbrQU=bYpb;b3vZQ13NEj=&^7#2@K#Zh(=`UCo9A#sz`ibSw8^Urp9G;mz`AJwKzP&OP!*>e zt#tV`e~;R2Q1CtlLaG}SBLNL3qq;sWzo~%`HF=orP736$3cGHB%q6^YrxN2cG+Orm`O^mOW$G=R( zboAn32VqLsw)6_8hAm>;&wof&i|A`t92?dKjt=r)3!WcRf*5$W{afFg zaG{-2O8}xNHK*xX3AxAvyi6rzm_vRJAQrU%AWKw|%%DX<0APZl1VDAvLb*0isbmH) zxghFNNg+WHnCMVS!c_@FV-OqDpj`SxkEmM&gw{bNqZYIh(imYPZjnjS=ydG}pl~XQ zG1K^UKxgE|bz*9Cw=8>(X-`uhVwSknr}^WLLdq+t(_*BUA7)7TH2#cwPNP{Awf^*z zhem@o7X1o%ig*%uybieR!|o+p99F&_XphzJ+=1n+GF;jmsG=tJdA{Q}LdH7F(4s`Le zLH6O_p?xaI?x{%sWRN3dx1;f&394zJ!rY$rYl@!{SLrF1ev}F50x+1Z*utpztZ8!`Esaur6q& zNOgL2gu%KfN$cX9nC)Q;1NS^8F4f75#CH@N^+S~$M>->oL!Yg1`p$v-2>t_WA6psE z9TJ!)_1mWy9sDbx(*Hta;Sbf6u>z|%@*c}WwrZ?LxAVhG1ajQsWWmi@bPq;%LDl}F zUrtO|XE51KT(7ius>Yfyo1^PE`j7<2ZFD^qU$Id|e4qmFqX{byA9lI8@PV^?tZM=! zxLCty4Xpa}|HiL8#pj4qv|aee6nvF}uTk&_L6~-6kq}qEOR0p}?(uI?;XWl(wnv@v zuZx7YO&@)QDc;PPAk=9b<$^pngk|z$B0wflSRi!^>Nq5E+n0(y7t2S|B20^X zBrzh9A*m5Dj7zlSzfW}HQ-_o@6$=@F@clXUBt+pyi2amAfxwfZW^`R6=Nsvh3^Zg; zoyCJUG%V@4qPhgFMy|vZbd3frN-4y287n|9LZ7PrQ@>QC8f4hNr>%B}ahY(Q9a%rX$|2x9|5p2fb{HX-e@ri416X156zV50!K zR?A6F2Lk^-1ww{@h#2k#xGi>4ETX?hx%t=#hB*pLsR;%#q}obuk3ohUDsGGIwFy)x$!)ejgua(%_Iv*8z_kaJ>^o z3X@%7GN!#QeAB!qyzu-FQNn3MaT;nk5xMIdmgB@OdzuYay-tEf=Fp1g?#Z{kSK#AmFgvA3CkxH?APRrnBZj`bWM%+ zIS&7CveW=O4Tgy3`SisQj{FQ<-pM^>OSF}A0yy2#A5nz)0KJfdA%XHHzAj?P1=^8? z{+C}Dcm}74A*_8PGDOABMCM`SAU|8X=?huQB^|fkF3dLVwwaOWJo+SXS1p;cjVd}=!Yu9e9hXBbw zuydGn++A=>oODTo;GJ?x*!BDmKp~tI;~4wgBnclI?g&fdW{9u3C@UnYd5?2+!ycJHt0>G|N0q9}D72e(vH2zLXZ`$WP4*p&^ng0N@lHenp4f; z412mqRXr5d7$(3{h`m9SO>ziwSOg0L36e{W`zIs;@*fm(Tja2pAcvfkOMb7ayE&xj zj~p^YRaaG4Rlk1qK7Q{t-&|N|{>RV%<>Oy`%P@Xv%>5j+Z=#4_pkf9yV`FUgOq1GH zZ1pU4wR<+McI=F6y_&k`#O}D>tE+Y`_Qs7~L$%$wId1h@s$GxUu=?C*wy=)GaWBHp#+5*vyv7>Xcb!z|p2 zBl*%G!ayRjFpeV@(0xAKnwFa{%-`mHBDMV4MMK1BL`KhK1{iLF*;dbCcCW^qp8JWh zZL%73pL)GIt1}O;?Xd=H;@Z$m>NN}YvIw8zuw4d}*=KR7(o(2tVYJA7g#QFxwCPekh`K z>=h+qm<{(LU*J4&Gv#38hFU8fT9BVt9p7J@@O0q+s5q5}`ReD8v(YyTw$*U;P!>@{ z2cwyhnKR?i8d)=QX8k#&cxH_31AAtV9A+|$*~}qUK7$OaF|bpOHRi^eU@FaP&y7L) z)YxJ%hF!7a64*>Lm)Y5B#}zel4)dJi8Ryvrw#vT7zRfPNuRn8((U&pr8_Z|ltma*2 zzs6o+YjY#7V$Lh?%C911`he^z1&() z^XB?`I?Y%J_RFToQXT~vpGNQH=M{&`d)0Y&ZRv)65?@(o(RMhEGwJL^@dUd~X}9Sl zOKH1egR)y~fO!$kD}^P$pdM6qeH`>C>StmD6XU$Tz8tA}$@O^Q%8d;wL`d zcrwkZNpm6((WQCoklARX>qv*eTyT;vzC_g-RC#TEeZr&s_up4q5#e>BbsohLB;JP+ z@maJN#pz@mC7Hh$aY06A!@u9B#?1!XV4p-#E98v5wSEYLx* zXcEDICjDU~{FKi5g`?`)a}QUHUWN$mljVsjQIah!z}sOgBDtguQ&idFeC=JmpfXhD zDdSbsalx0396J|FtDW<;@;r~^R2#r!OF!y5C&<*2K{g3*aGp4KfvQy+XyO2;lZf*+ zdeRHvCWcuMNDuBOfTa_%88X#^kZ`hR^2|8gjp!amf&ovb6WJo)vtM-FNytf{&ysQF z*|C}3nsh`IZ%ZfS10k*5$NU?#XH#!L4}?o=1VKLzg$ROwG@eg3Cw#aEW!~Hi`Q~;S z!#s=4{_bWLzp=fwzsKGZzY%<=zx8DIjW@UR$K(F%_zjZHk2WF1rN*tlHI8y7_5}^9 zf)~vqo`mscU%OVZNg}*4dBR@?MLvqyM`f7HmTNhtV_Nw0aQ%Xo?W$R7Cf3juYn-xm zymvJ2RdX>L?Y7-9^A!@-!u@TO=h7!ML_fOLQEsCMI?2qKnIrfV)KuV6nE9**8*Ami zUHC8Gzs(~s63(yC0j1s%_rnP+9@tDbvlNOk6xwnXywUEEJTMNhNj4#fhsiF4L!aA} z$3mV1x=0@fr~??B!rlnE08>t0H`qx9#HlV|9w9l9Qu2)aDk^Eyf=#qAx<&)_!pZV= zn)5nUuT|BzX~wx=YdVZsP`pV%L`8gpTY^N{a4dCDbX@s2kFoN!b^Q|P5MNys#n%iC z@Y3Kb#9O|SSzM;DZjL;D175E&LmM8DMhyNTMw;bFvWzj4 zGmN#$F|^ydUHC=&UjCgQXz=GB`9@{CkDMD2OhT4xD}v!1Zw-@(kw<7MUlow`mJRY1 zy4fj>hS2>pCoPlcE=aF*wbCnnCMPN5O;oa`cIL~}_R8(}CAxo+#+C?2&Kq3Wrjcq- z)hqXv=e3io4v@4D0IrY#{_C{utLjmu!9FPhHlHRl%n+oohS`R$xfUHe{Wa^Z*|uD> zW70KWoEHJCs}7tFo(^3dI2lKRVNVH`;pk`9q4kb&XhMzbdljm)iY51P74-T8OnFzol((#wpBj>)BTcGkz4CR80Ec~tPC@aazK4w@Oufv^#3n$+5dGk8)24_6E z@i+8HEu)s1U!8xcc~);+S4SmopiwS`UA+jIf`&*PRU|uPir!$X# zAFIEVOE)m-XY`oQ<5KyMic55uR7eg5EzgWY<0r=cD>L&Q_>I4#O=)+>$Tv^Q;k*%;V`sVc1x+G2C&-5E5RJ>4#!rpiI-T}k z&FPWJe+#opO6|$+0AlR{y9Iawp{XVJ076BiRp#$$Zz9zF>V%eS5op+GOLsbaRs@c4MKP?G7$MqHaesLwZ^b0S`uTUmR&6GbuLHJSA8vTRgPNiIeE84rO#2{bG0;n6rnVyrm5lZQj*_a9IM0Y*c)^<~qs+GfXU!riyw`a6K%O+a)D zZr?-S!PPbMSHIdJR(j`Re=6is1X&M)*4hFy`R0tC~lapJF{KN@obW5u6#BhlRbjWV^_41W7oK2-rPF>d-vR zb4u@e9FDhGc;nx&k3ccv!yAy>7Fiv9;|4nQ}23mnZLj`?ps{3Q>GW zb{h8Cy~pWn_%5pFreB$28YEAu#L7bh6c{VC!n*g|TvsX!e{AlbRNfKh{t`ut&-E{7 zLV1Fxh*4eINW4i`XBVW0)YO!06n}^ZNP8Sk)M=|wuv;7^$1P3|mn}esfYRRy(hoH; z%p)Ofn8%Y8Co~yFbWj;EGi|GFx6Mm1Hu-B`o&N3_%Bhf&A*a#|f^o{GF}2%4@CX^i z;!ZsXSlY+1qxEqrkkCh{JVnx<>x6`|`TTnzMnQ2-P*K4P1x%F)az*q)kv!=~@C?Dx zdqMxYv_|0)!WN`e3Uqlj1WXo{_6J_uyXd*<&-a#9R;W7u8WvQB@l$jlY=8+QkYXuA zT+GaYi5MAKYzm+>P+c(&%zdAF4_6N?Ert|7m!Z{x`Do*T0xkQmt65ht%Y})o6A+o7 z2>{|iq-!v)1b;tzfDHM}+@|jdk=U13#G)jmrfxqE(1VL>5Pg+L?Fc-ia-jM6oHpDfir{# zyA6IBgn~q*l|W`It(F3mhp zDZ$%m0tcxR@?}PloE)BoX(f2s|Qb2s_WXEgD-HyDT*t-yCnc_ykDgL zdAG&Ci>L7vm9)d;34cai^2HiK+@jVNRYa8n6ugC2w=Nwx8lgf%xrBUE0zOumFy)Fk zIVDWPrzZYWT75!e#u)n_6mbQWQKKAm$D-`;B@HR8rrk!5Jkv7jChkJ2X;mfFWUwo# z&e4I?TKgjh%%#{8ZRa{kbDeJ$ zt03PPtzpzg$`hy-Eku!pfo?u9vKAsoSP+=#`aK-lk3oax96<{Wzz`SdFD+bWa)_PX z1Z>2z)WRNefg?OW^<&sZ*l(B*!0N z%qPjA~pd}9kA@t|w!zX3RTW4U^K z5?8ugrILJjAGmWTZl1@7rjqB7_ZSI~RP^Y}Wt# z_kaEIc$Kk#vlo6A#y8N^f6xggc*J7f;he@sWONMuG&`n#S{(~dGpfXP$JRVn(MLmT4zm< z7otn?<<4b2Zba+xmChACZbq-huXSGIEHDPI2Un-O^TuaPEQ+NkOe_UUQ?uiWWwG*v zb>0+fVpUvt!aHw?i{cef-WJ9lYh8K@Nm+{*Oa3F3M&m5-!g!R*Y!|eJFQo`%AZ~@- z46n`6u``;Hc&S(2v~;;2K#Z?&Vb#_PDNN9TU0vEx2(s7Eu1H? zoT!Q#bW;;`v4Cg&TV}D&0`$}UI0ZZDNCUC$l)-J#zPlzViLs=!VB zIB+qi#!!Sjal2`f`C+2m?Z@Llo?LGiw$d9;uGU@s+Zf5T?|zexvM^25!#U$*eRh&Q zg^rt_)ZXv%nUExG6>SMk3!Jfx=WJ>WjGX7jUjgBq4a|WhxG;n%tgJGC@WTEMz{QL+ zs0xQTrUn5E0#|n@#%4HiHaAJX$3>-lnD@TAGx_M(J|x7*O?wbNJ4h4vZYjR|IdQw! zM9}lcQRZ&U2CbG=SRzna;lx4aANsOzW>bZA5JV$MqO@v7MU6*+lq5(|^}H|%GtVok z-B@_gj4JBB&?D$bHZ;@dWE6U185OpMqbx2!&4J8_A6#BvrsGk|EG!j7y~6TkUlqpi z2+*l{K&-En=lz2{lUpMh9{O3Zh0AUA(g@I3TixMS7Jb-zbbKg2R=@Cm-hFg3{P3gR z>WktOg)hyOY)zp;BSe zcV+N+93mjNP~td-*SXh9VO$OBR=cz!FBZ?d^e7bBL8~qoa6d_6VvbxLK#skG5EeDn ziGnj^A{}Ri9V$P|PGplfo3IEx8zBc!QnE%{5XxJQyh`)V%va#Td5cuhG@-p4?Z1sJIttpTN5yw2-J18)|eteiIh)|}~{u0bMc-QUI_HwJ8` zabwEAZ)=U4(7AD1A$`LR6^!lN9#r6xT<{+aVSwV~&K~L5y+W)}7Wc^JsMGCe-gnr>CKn&i)j4z;()Hl|A)HD})2 z4WbBpoZYy^CHa&jL+d!Qj)C?tGO`5|Q{PyqF6-H|7)na4plOr-1%r%D*(pCh%-JpW zFgZ1HLvXl?i6^;?g{O&UgDip#W}ZRZqcA&gv-zektaMcd{R=ltqA&^C?*0MJK@P*tnW7bX zpO>$aWT~4bI5Kd%e&UW*(AIp~z@=rK+1*;^3&iUD!tw_64yc=W6xJ}H$l#AgK_ZH! zgRp;q1OhB*;R=gRFYH4<8lxJqHExUQT(rW3^FKdA{t7!j$4Ci|4bXPb)D?8hwt?v? z{f&k}L3r6*H81jILlWPa=abiyCu*47M%K!is#3~?PqSfFzDp5U7*9aI1>;S*FfRc{ z!XjG62L@43%^&!2oj88r4+%;Z!2?jTguTv2Ukit#bZ#MGqax`ef@6&Xz_DRX{*)uB zUuL3ynVnYis#q9W@+V5@xt&)j#)yV!;x>zy*hO{;$vwBR+7?ToEhEZ1J!6gKcF$a6 zr?rzoRvpyxS_#YC9NIr{$iN46g6e5KTbQ!%w*lGuppiR61G5IL5GzEXav`~*-&g1F z`t3sQ(A<5*v@*8cXOFL2ENc$y*x@>7^#22B573AUAiubK=8FatOd)m;O_9s@q0Wcz zp7Knqc^xX$6%N!%$}SZ&<(JssjK>zXnt|&ERzBmKNd9INB$7;4m?$C+120=H|@v>#e-+{Z}qn9ow?|?i&D{sV}L%U$wYb0f%rxd`RQcfs%{TX+k z(j6wXjm`IzyXkJIiL;^HYa6OHS^Io6R1g--6p>a6+- zgg1Bp(zcXW%CKXX@)eB?r3((%t0{ye0qRn^$yxp=V?zr|eKbXBk17PJ5e#I$Dz}Yg zzKAE~Kk5-L_!`p6D&|o==qS=a+*ssS_%fHY(-|%hFP_(IluQ9=LdRLpSpOMKBZF~m3v9L9dWUjvZ=8*hNj*tOE*!E0j3(cu zjUEtb0Sb+PKS~&7;9WrR+NPWny5RnN`q;Wj=N+mG-e;mrzTN%idiV?t$}jTPAN{h;eVT?rOz=eHB-Q4*!T&=pZ} z`TS&X+zra_DqV;cSI$qPJ_#b#*42^zs_4AL0FYvyqJp25wdt$pcPJU=$|W=xHQ?-y zM!ozc>E|2j=(|Se6Ag>fZJr}fkKU%m)$OuoLZpOY$yg0T=O*3&+8QSH%fR03Z`94@ K_p7hfH~t5;qg0Rp literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/show.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/show.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3f11d00ba22997ef968f8c5e330e7bbc0f13e72 GIT binary patch literal 5924 zcmbtY-E$jP72hvOt1sJe+_X*7bd#n{1d*K5K$(mQ4R)M{rcTB-4Ty%FweCumywb{d zSBbr|dSD!A!cZo>^T05?@K5jx(+8fJ9flVMW_aO&$2{>nXC+%|Lt6%E_U_%Y_nve1 z-1G6f_pNfd@b_Q;;lm%lq$qz=CVmF`@8Al4jz%a#^^~q!S5@k3o>tfRuGe+kbKT4#c-d~Qp5uPTGrReEp8Hv^&@I-B+|PNXZn<9W&eUgA#nn2q?%aV|KXy|QrpP~1 zMBXhP==FI~5XDDI{kWJFWij(etuF{|L#fRD6B;QMHJNp`0^b{iuHEkTeHpHSR#yxO;uz??vYtH(=V#$ zKT-^(UV!$6q`0x|KOBjS_6in$M6uevrZ2lr*!Fvtv*iy$%kR0CFRiXGUAzrK$Mala z^_|9!({h7af#+^+W6&V%V|+WnFl&8vx!Ul%eXs5GLaXbvJ!{)_ge$F-e~qUlMgXDF zd4900*Zb0MSwHmqBtE!rEsdmHvud?k^p*dj;B%DPY^WnUk-bb@v$%q5XhJ1aW92~W zXt5e=zkn~rN=NS)LKT|Og&{IzwU4t*&vdfFr1u9J`3x+VUyHPAGs;z~&9>(TNhZA& zf)MtxLpg9)qqkYn5GH93JkRpl0j$`ZFdok#Ls+iU*dE)mRxuJoxIvg?od#JT$qBdV z47@Ngwq36;>6lZ9G zb{0eL&F0qL192sI+x~iEYk%j>x0=zzZsRh3t={71V!z$5j@G4mrRzo_*b9ir7gP>i z*>k)_cnJA?ut;uD>+j2XeAH=N!5kVzomaD}p=$g$wP=A1J966E_{$sPkjP*LUCX#Q zJYp@F50#E8)B`MYh_H>dp&sh7exMGG(1?v#?PPFeh4!%?T%i$R4vVa>MKzAWtJYo5 zbpqFdV?JmL*K)>-Wl`8tT+ltJA!-Y>&UWe!xd*P?@&mVGCRxvKwOpCx9y+qu?zLnN z>Lm+->&V8oJq{z7r0FA5NSKCl1r|M!MU0eZs38xoWaNu9H8%uM=G)51|fv5(8Z zh0IE`(90h1Op*DOG1NtNXyD3(xyQ&Y9rHkwf5n)*$Q`KikLVSsH$)y`nOT;ZX6HQ1 z%S})U6BLq}7e#RS3wlNB4KuyFOf4O#PgVI6b4P!e@+(iwPAM}Jl$75r&#W;=^oJSd zhspQe5oJ#n3+1_P7}@y# zMV2xzPO=7{#O2QMI3F(1v&jBLdl@UG(#%ipDRCL{Pc132@l=y@;R~@roW*HS^bZtO z*F)iW&sqwokUhuI)KS}nKdN+euiT{tXjX{D)!d*KDD ztW;Mf6$z{hHMiA5x^4Own2|utHBgWC(;|BqDToaK00m_Xk+OiMg&4SB8mgfZBSrpF z+ch@Q$yjEKx!+60pbjFiD zqttQYLXpo(EpXT>J6Q?0jn$Wx3FTOoiY6~(aH0cTQQ11Q)=~14Z(_i8Vw);AC6bB; z+kp}zi!6}H&ZHplEg|uDV9XSyjb#eA|0#R0tkok~6@#soP$3}SNX)TsB<6V8*OKh| zjpaM*D^rRcE)bgUce8qHZS_tx=k`LmZ}+j# zVL&M;DNRz6{H?W(&Fi;s-&j8iLHTU1i=--?(5a5xUsl2WS$^B^y45~Gg{(6Ow|)7n zl-{c@?GTcj*KW7~s!?f~Flf8kcI8zoDKaAErxX-bvhrQ}GU6(4QS)7D-lOI=n#u`D zVU!df`f>-D%MRR-6Pmn2L%u-`Sw+$&Dk-!B_JUr+O%_&=pl%_P(tVu&lhU>m*yC?X z=38!f_+)$S9<~9cNgCo2bNiBVOky;#7fdn@4{$KiF)S%?w5Id0Z*XK7JZvMJvQEG6 z_C%t4E`WQ0y`(EDGx9ts`VO%wGS=f%6ePJ3bWHM8OrQq#4d$VanUsBo0wj<(SP>#6 zMN$W_llG?R&XnqgE!vGR(RbW^`96tbG^V9t^cE2qlAT453>f?fjgm9ek~*)=Xs1(P zrk>z?Nh<(k&H%d4qgT>Pc%nY;bg3rVIowOCX=LdcP}EcxbOUor>S?^s;x0+n>LIi* zkUU&u(cs@I&H~h-PPh$~YmCkIc~MWEg#Ad1U@E_J!Ce(5wQ_DAJ5WT8U}pDH_lXIL}Ve=9qSDiZ;)*<5RQ+ zroAvlJHfOUr)V#UmpfUepKL+H1El1UmZ$hlHl@Tsvhp{q{b?Tk$`qF~OnY^TW|3|7 z&heYG#2c7vewbq(=i(g60lKOK&5=!BCOOG4PlQ6h^aN zpP2Q=;jH{+;%ZqVRVy1F+xG)xudg+&&O}rY7crM zMMJBbTs0%TTCJuvT6uo9y$E09`fCkQiEzNAV#@%4kb-|gCU_cwriwPjNvIuD?K4GlsL1BrbcJK zP*7y9VfS~{dOe7WAEY>k9yq^7#f@|`$P`M{QTg3*`sXP})gUTd=W4)1DU(NYDIqNj zJbJ27M8(@_q2L*m@uSl15%y*hCHJVbo^C$_W}scN*cQ?3h%BmG`}}6%{c*LL_=xB; zH7qLM8es+0Bz)yfmT^?5f~%Z6BLnAHK~%m$g|nI#&a0e(qwFdj8C~UleROu&>Gk|D z-7`#_tR3MH93JG|-k{4H0{JS$B?i0vJ#@LiNdk3@Gvp?EIMypq?F{5A^qx)-lG)J# zfz7LmilnwVy(h&H92NG~eo{E9v`K~wy=)MR(e9jmhTY{Hs6$-A3L3>Q)Dzg7o0Q_U z1*4=cO#M$H{bzBKGXp9Y18!*sJ)OY38C4R;inh91d4bLynuBnFg9BTV*8>;e428~4 z2>k(p5Ll?CH7qT%MeLnwbj%=pnU?-j6BG=k!%8ryVL#^u33;6BF|s+u2- zM4m>RW!l`;Lgb1jDk@m95TrR_BiK|Mjo?3J8Of(I(SDvjPEE*LKu{D~1cf%SLWkI) zOPsJl+|c_LjV#h2-jg8oiBEzjC=9+uE()7)?q>DOqpWtSK2iLRg-{E_vy|W>PIluR zD*G)X04Fh%I399}RgTM33pmZC!nHX{&X(bivV59hdXUgU9|+b8dV684hd(I=#e_*! zD#qn<)rz4hQ)9fnT^y=$o?%HtPT zt62L=sG=f;pu>t-;Su9h;wc3OmTvcrnI3+S2v#UO6>(8eA@bG_}A#|Veyx87e ztgo8Ou*@FSj$MH)@8GZUMGU^icj~y_#r^(b6~<5N^aQ@MiX!8(SunfsKM6`8dFIjB zXu{ZlAwP#nA!W_cu|2Wp*4+LMDr$}<&cr1av57<69i&l0{1d37S^{-KT4as1N#_JA z4Y-YoN7l9U*w$4A2->(mvwLFJ>Gf8;tlBFtvhs8UGg7%a+_TA<+fX%Fjp45fYb zObZd!1wbYhN-OAIup{!a=sJ}vDIZmCEOumN?@pnKG@~ftv6NBtGy1z66oT!?iVonE zgHg^2V0e)14ivvW8XoMETk@^w&187Ed;R8UHcgXj@a$xRhXbhYUR?~mTPd9pc_1~@ z3~(6=D2w?ZSu{X7SmGQ?Qf$J>UW6g_gsk(HXStSL{{rXqEwE?LFJVwOp8jb(lGDDX z!_?3dPO&qZ~_vWs0 zHGOQ|L3^89=-@W!G+@QGBmdxa<;{Jl1?ZM14)8A4>mEO~?(r7d`(O*rUHPN(iK7CI zf8w54o9Nj3#!^kvn7g|k@lK$o4sOidN$VIHue2X)uwxrmbcny}k^sC5=7IQS9!%Dc zk%jht*+N@TNuQ$6&=-q}YTk!j1`Mtt$R6q1m0vfE%9m71z`*R|FY^+x4$W4V2!=)m zJrCY;=xZzGq8r|otLDa%_^PB7U)HT#BYw%h+=bm-ty4K5>{?;RTs?;@+tIht0=ah8 zj!TtCHTWxkpNe5FX?LSqkA@}VB&vNAKIEzDoVp)@F)CgGp3qqpaNQ%}>8Sw|R3}T6 z2sG*K$GoIcw6ySo<}??ZFm+gY8f{E)>fL{f= z>6r7KTZ*G1R%5tE#7o+SnXoqGh%y@hA#cEhtTte`1=wxd9w1r2X(YD+)0;K@j05k^ zI=r2?U2FF2e=rROyDeSn+5;%{R-_|Ra!t3RXs?WUE%Bp>1Q6((JK5weyks;^8$dtdtUrw5Bd6{JLVvnd7yqqvcIBIdhv)t+ zh6EWjJZ&5JeZZQ82An`AmJ3upW!t#cPnk>%g3Qs*;<1v};LalEcXbz*x-++J_(3Mk G&-n+Ru@@Hr literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b923f9a42b713ad1cd6e4979808caa202f2f61a GIT binary patch literal 5004 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/check.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/check.py new file mode 100644 index 0000000..801cecc --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/completion.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/completion.py new file mode 100644 index 0000000..2fcdd39 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/configuration.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/configuration.py new file mode 100644 index 0000000..950e205 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/configuration.py @@ -0,0 +1,253 @@ +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 running_under_virtualenv, site_config_file +from pip._internal.utils.deprecation import deprecated +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 --site 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( + '--site', + dest='site_file', + action='store_true', + default=False, + help='Use the current environment configuration file only' + ) + + self.cmd_opts.add_option( + '--venv', + dest='venv_file', + action='store_true', + default=False, + help=( + '[Deprecated] Use the current environment configuration ' + 'file in a virtual environment 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): + # Convert legacy venv_file option to site_file or error + if options.venv_file and not options.site_file: + if running_under_virtualenv(): + options.site_file = True + deprecated( + "The --venv option has been deprecated.", + replacement="--site", + gone_in="19.3", + ) + else: + raise PipError( + "Legacy --venv option requires a virtual environment. " + "Use --site instead." + ) + + file_options = [key for key, value in ( + (kinds.USER, options.user_file), + (kinds.GLOBAL, options.global_file), + (kinds.SITE, options.site_file), + ) if value] + + if not file_options: + if not need_value: + return None + # Default to user, unless there's a site file. + elif os.path.exists(site_config_file): + return kinds.SITE + else: + return kinds.USER + elif len(file_options) == 1: + return file_options[0] + + raise PipError( + "Need exactly one file to operate upon " + "(--user, --site, --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/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/download.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/download.py new file mode 100644 index 0000000..a57e4bc --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/freeze.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/freeze.py new file mode 100644 index 0000000..dc9c53a --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/hash.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/hash.py new file mode 100644 index 0000000..423440e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/hash.py @@ -0,0 +1,57 @@ +from __future__ import absolute_import + +import hashlib +import logging +import sys + +from pip._internal.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/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/help.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/help.py new file mode 100644 index 0000000..49a81cb --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/install.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/install.py new file mode 100644 index 0000000..c13da44 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/install.py @@ -0,0 +1,587 @@ +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__) + + +def is_wheel_installed(): + """ + Return whether the wheel package is installed. + """ + try: + import wheel # noqa: F401 + except ImportError: + return False + + return True + + +def build_wheels(builder, pep517_requirements, legacy_requirements, session): + """ + Build wheels for requirements, depending on whether wheel is installed. + """ + # We don't build wheels for legacy requirements if wheel is not installed. + should_build_legacy = is_wheel_installed() + + # Always build PEP 517 requirements + build_failures = builder.build( + pep517_requirements, + session=session, autobuilding=True + ) + + if should_build_legacy: + # We don't care about failures building legacy + # requirements, as we'll fall through to a direct + # install for those. + builder.build( + legacy_requirements, + session=session, autobuilding=True + ) + + return build_failures + + +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) + + wheel_builder = WheelBuilder( + finder, preparer, wheel_cache, + build_options=[], global_options=[], + ) + + build_failures = build_wheels( + builder=wheel_builder, + pep517_requirements=pep517_requirements, + legacy_requirements=legacy_requirements, + session=session, + ) + + # 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/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/list.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/list.py new file mode 100644 index 0000000..d70782d --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/list.py @@ -0,0 +1,302 @@ +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] + + evaluator = finder.candidate_evaluator + best_candidate = evaluator.get_best_candidate(all_candidates) + if best_candidate is None: + continue + + 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/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/search.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/search.py new file mode 100644 index 0000000..c157a31 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/search.py @@ -0,0 +1,135 @@ +from __future__ import absolute_import + +import logging +import sys +import textwrap +from collections import OrderedDict + +from pip._vendor import pkg_resources +from pip._vendor.packaging.version import parse as parse_version +# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import +from pip._vendor.six.moves import xmlrpc_client # type: ignore + +from pip._internal.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/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/show.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/show.py new file mode 100644 index 0000000..a18a902 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/show.py @@ -0,0 +1,168 @@ +from __future__ import absolute_import + +import logging +import os +from email.parser import FeedParser + +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/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/uninstall.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/uninstall.py new file mode 100644 index 0000000..0cd6f54 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/wheel.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/commands/wheel.py new file mode 100644 index 0000000..cd72a3d --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_internal/configuration.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/configuration.py new file mode 100644 index 0000000..b199fa7 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/configuration.py @@ -0,0 +1,384 @@ +"""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.six.moves import configparser + +from pip._internal.exceptions import ( + ConfigurationError, ConfigurationFileCouldNotBeLoaded, +) +from pip._internal.locations import ( + global_config_files, legacy_config_file, new_config_file, site_config_file, +) +from pip._internal.utils.misc import ensure_dir, enum +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Dict, Iterable, List, NewType, Optional, Tuple + ) + + RawConfigParser = configparser.RawConfigParser # Shorthand + Kind = NewType("Kind", str) + +logger = logging.getLogger(__name__) + + +# NOTE: Maybe use the optionx attribute to normalize keynames. +def _normalize_name(name): + # type: (str) -> str + """Make a name consistent regardless of source (environment or file) + """ + name = name.lower().replace('_', '-') + if name.startswith('--'): + name = name[2:] # only prefer long opts + return name + + +def _disassemble_key(name): + # type: (str) -> List[str] + return name.split(".", 1) + + +# The kinds of configurations there are. +kinds = enum( + USER="user", # User Specific + GLOBAL="global", # System Wide + SITE="site", # [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.SITE, 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.SITE, 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 = 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 current in-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) + + # + # 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(global_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 + yield kinds.SITE, [site_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/mongo_mac/lib/python3.6/site-packages/pip/_internal/download.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/download.py new file mode 100644 index 0000000..2683cf0 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/download.py @@ -0,0 +1,979 @@ +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.misc import ( + ARCHIVE_EXTENSIONS, ask_path_exists, backup_dir, consume, display_path, + format_size, get_installed_version, rmtree, split_auth_from_netloc, + splitext, unpack_file, +) +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 ( + Optional, Tuple, Dict, IO, Text, Union + ) + from pip._internal.models.link import Link + from pip._internal.utils.hashes import Hashes + from pip._internal.vcs import AuthInfo + +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__) + + +# These are environment variables present when running under various +# CI systems. For each variable, some CI systems that use the variable +# are indicated. The collection was chosen so that for each of a number +# of popular systems, at least one of the environment variables is used. +# This list is used to provide some indication of and lower bound for +# CI traffic to PyPI. Thus, it is okay if the list is not comprehensive. +# For more background, see: https://github.com/pypa/pip/issues/5499 +CI_ENVIRONMENT_VARIABLES = ( + # Azure Pipelines + 'BUILD_BUILDID', + # Jenkins + 'BUILD_ID', + # AppVeyor, CircleCI, Codeship, Gitlab CI, Shippable, Travis CI + 'CI', +) + + +def looks_like_ci(): + # type: () -> bool + """ + Return whether it looks like pip is running under CI. + """ + # We don't use the method of checking for a tty (e.g. using isatty()) + # because some CI systems mimic a tty (e.g. Travis CI). Thus that + # method doesn't provide definitive information in either direction. + return any(name in os.environ for name in CI_ENVIRONMENT_VARIABLES) + + +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 + + # Use None rather than False so as not to give the impression that + # pip knows it is not being run under CI. Rather, it is a null or + # inconclusive result. Also, we include some value rather than no + # value to make it easier to know that the check has been run. + data["ci"] = True if looks_like_ci() else None + + user_data = os.environ.get("PIP_USER_AGENT_USER_DATA") + if user_data is not None: + data["user_data"] = user_data + + 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 not netloc or netloc == 'localhost': + # According to RFC 8089, same as empty authority. + netloc = '' + elif sys.platform == 'win32': + # If we have a UNC path, prepend UNC share notation. + netloc = '\\\\' + netloc + else: + raise ValueError( + 'non-local file URIs are not supported on this platform: %r' + % url + ) + + 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) + + +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/mongo_mac/lib/python3.6/site-packages/pip/_internal/exceptions.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/exceptions.py new file mode 100644 index 0000000..7b291a1 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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 + from pip._internal.req.req_install import InstallRequirement + + +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/mongo_mac/lib/python3.6/site-packages/pip/_internal/index.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/index.py new file mode 100644 index 0000000..81278e8 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/index.py @@ -0,0 +1,1105 @@ +"""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 HTTPError, 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 + from typing import ( + Tuple, Optional, Any, List, Union, Callable, Set, Sequence, + Iterable, MutableMapping + ) + from pip._vendor.packaging.version import _BaseVersion + from pip._vendor.requests import Response + from pip._internal.pep425tags import Pep425Tag + from pip._internal.req import InstallRequirement + from pip._internal.download import PipSession + + SecureOrigin = Tuple[str, str, Optional[str]] + BuildTag = Tuple[Any, ...] # either empty tuple or Tuple[int, str] + CandidateSortingKey = Tuple[int, _BaseVersion, BuildTag, Optional[int]] + + +__all__ = ['FormatControl', 'FoundCandidates', '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', redact_password_from_url(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: + 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 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 CandidateEvaluator(object): + + def __init__( + self, + valid_tags, # type: List[Pep425Tag] + prefer_binary=False # type: bool + + ): + # type: (...) -> None + self._prefer_binary = prefer_binary + self._valid_tags = valid_tags + + def is_wheel_supported(self, wheel): + # type: (Wheel) -> bool + return wheel.supported(self._valid_tags) + + def _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 get_best_candidate(self, candidates): + # type: (List[InstallationCandidate]) -> InstallationCandidate + """ + Return the best candidate per the instance's sort order, or None if + no candidates are given. + """ + if not candidates: + return None + + return max(candidates, key=self._sort_key) + + +class FoundCandidates(object): + """A collection of candidates, returned by `PackageFinder.find_candidates`. + + This class is only intended to be instantiated by PackageFinder through + the `from_specifier()` constructor. + + Arguments: + + * `candidates`: A sequence of all available candidates found. + * `specifier`: Specifier to filter applicable versions. + * `prereleases`: Whether prereleases should be accounted. Pass None to + infer from the specifier. + * `evaluator`: A CandidateEvaluator object to sort applicable candidates + by order of preference. + """ + def __init__( + self, + candidates, # type: List[InstallationCandidate] + versions, # type: Set[str] + evaluator, # type: CandidateEvaluator + ): + # type: (...) -> None + self._candidates = candidates + self._evaluator = evaluator + self._versions = versions + + @classmethod + def from_specifier( + cls, + candidates, # type: List[InstallationCandidate] + specifier, # type: specifiers.BaseSpecifier + prereleases, # type: Optional[bool] + evaluator, # type: CandidateEvaluator + ): + # type: (...) -> FoundCandidates + versions = { + str(v) for v in 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 candidates), + prereleases=prereleases, + ) + } + return cls(candidates, versions, evaluator) + + def iter_all(self): + # type: () -> Iterable[InstallationCandidate] + """Iterate through all candidates. + """ + return iter(self._candidates) + + def iter_applicable(self): + # type: () -> Iterable[InstallationCandidate] + """Iterate through candidates matching the versions associated with + this instance. + """ + # Again, converting version to str to deal with debundling. + return (c for c in self.iter_all() if str(c.version) in self._versions) + + def get_best(self): + # type: () -> Optional[InstallationCandidate] + """Return the best candidate available, or None if no applicable + candidates are found. + """ + candidates = list(self.iter_applicable()) + return self._evaluator.get_best_candidate(candidates) + + +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. + :param prefer_binary: Whether to prefer an old, but valid, binary + dist over a new source dist. + """ + 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 + valid_tags = get_supported( + versions=versions, + platform=platform, + abi=abi, + impl=implementation, + ) + self.candidate_evaluator = CandidateEvaluator( + valid_tags=valid_tags, 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 _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_candidates( + self, + project_name, # type: str + specifier=None, # type: Optional[specifiers.BaseSpecifier] + ): + """Find matches for the given project and specifier. + + If given, `specifier` should implement `filter` to allow version + filtering (e.g. ``packaging.specifiers.SpecifierSet``). + + Returns a `FoundCandidates` instance. + """ + if specifier is None: + specifier = specifiers.SpecifierSet() + return FoundCandidates.from_specifier( + self.find_all_candidates(project_name), + specifier=specifier, + prereleases=(self.allow_all_prereleases or None), + evaluator=self.candidate_evaluator, + ) + + 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 + """ + candidates = self.find_candidates(req.name, req.specifier) + best_candidate = candidates.get_best() + + installed_version = None # type: Optional[_BaseVersion] + if req.satisfied_by is not None: + installed_version = parse_version(req.satisfied_by.version) + + def _format_versions(cand_iter): + # This repeated parse_version and str() conversion is needed to + # handle different vendoring sources from pip and pkg_resources. + # If we stop using the pkg_resources provided specifier and start + # using our own, we can drop the cast to str(). + return ", ".join(sorted( + {str(c.version) for c in cand_iter}, + key=parse_version, + )) or "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, + _format_versions(candidates.iter_all()), + ) + + 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, + _format_versions(candidates.iter_applicable()), + ) + raise BestVersionAlreadyInstalled + + logger.debug( + 'Using version %s (newest of versions: %s)', + best_candidate.version, + _format_versions(candidates.iter_applicable()), + ) + 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 self.candidate_evaluator.is_wheel_supported(wheel): + 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 + + +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).""" + # Split the URL into parts according to the general structure + # `scheme://netloc/path;parameters?query#fragment`. Note that the + # `netloc` can be empty and the URI will then refer to a local + # filesystem path. + result = urllib_parse.urlparse(url) + # In both cases below we unquote prior to quoting to make sure + # nothing is double quoted. + if result.netloc == "": + # On Windows the path part might contain a drive letter which + # should not be quoted. On Linux where drive letters do not + # exist, the colon should be quoted. We rely on urllib.request + # to do the right thing here. + path = urllib_request.pathname2url( + urllib_request.url2pathname(result.path)) + else: + path = urllib_parse.quote(urllib_parse.unquote(result.path)) + return urllib_parse.urlunparse(result._replace(path=path)) + + +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/mongo_mac/lib/python3.6/site-packages/pip/_internal/locations.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/locations.py new file mode 100644 index 0000000..10860f7 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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 + + +# 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' + +global_config_files = [ + os.path.join(path, config_basename) + for path in appdirs.site_config_dirs('pip') +] + +site_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/mongo_mac/lib/python3.6/site-packages/pip/_internal/models/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/models/__init__.py new file mode 100644 index 0000000..7855226 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/models/__init__.py @@ -0,0 +1,2 @@ +"""A package that contains models that represent entities. +""" diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/models/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/models/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..456ea90447339452ce60b90a6372bb250b89bb91 GIT binary patch literal 265 zcmX|*J#GRq5JtT;K}g)eEd@9TB2q;8xj>qvijXX0&w{mHujQF+U{8}aC&?XXBQ8P3 z08&2bjYhAS`DVl6;PCysd=f(ZG5;xeduFiD!-)^!iZ?Opb@wka8C#h(NZJ^ZwuxkX zL|Hcu0$yc?lmQ`4QV>~FMojn(=`Ss)?`&S!9hl4D@9>i zuC}e4<3iur)vlV(%I>SSx14oU?<)B;=GSCG7|(0y9B%O}FK8bLax_6*n<>r4lh%{8 Q+xH(>eg=3v*FZ*`0Ihma8vpN`iZ)1`2!)?L*}m&0XB?h?@w?L8ve z(%!W~Pb@tpe&;(>AwI2~BGN{Ja^!)W+>VSCgFFSBe3a}Y8Q2d!T7SIG2lws_9`Gm6 zhr|2ByI}P=`o56bBsqH750h*Rr*$iv#F%2F86KgyMWI{kRu zFV&^d>z!?}X0Gtd@$1R>(&}jXHjOU=ZDjpt{URwY%yGJ~mddFxJCH0XYKA6Csk2D+ z(_Bae85aNt#Y7)~Mv#pMf-skMsLMKZg-%cJJGWr*sF-2^5S}=N0kAm&LeLszm_UQ{ zu2thZ^{?-n@!Y#J`u+LdZ|UCvz+9Mp8kPS*rVl~|efXEaf{3(+ZQ}eSe3^PZnEjs@ zG|n(t2+X2Xa$a>f2Y9v=>K^BBwjwpZX>l&{7%Cu4`WV*h&c_x@rQqUMH$K&e&nYUcqhJH6Z1;Ytok1~<#porpev;hkj%=bw%jK|pUMD4hkV6ast$^^|E zHLiWNuR}R0Ae}}aw1a7m|DC2u5GeT5HFj6I^N1Ek;PU={Q=>I7UvD6~fg?A#!XERe K2T+5gp7j%evQ`=Z literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/models/__pycache__/format_control.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/models/__pycache__/format_control.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9dd283fdd76e97b96b2a1bd2fc04bb87e44a295b GIT binary patch literal 2268 zcmah~-EJF26rR~XZ#GV7N@%45#h_l)sI^;K1d0GvO8)?1Dhg_A0i(^%I9YptoSAjv zxb~I93-AQo@+3$+!rme-`U<_`o7p5yLJDKenV&tLbLKned~<7QDfs)hKYskvC*&`3 ztT~w9L05MnIN>xQDeY3K=T>5+cGspv*zyL}cH*RN*G;{ym)5#9N*)mIaCe_@SNL0Ao$~e394p$(+K=CBBTkfWN`dVO-=Eygpwp-Optj7VCLd$UK=mcqo#gkd0n0 z8)=w@n{l?O7f?}+p3Kw6?p7RaHNwU)j0WMRXyCey4bg}*RfI_*cq?e2bt3JyZhExP z*U{BAh$${G@a1wr=43{vmRY@HR@RhG3Bw*F_TeDy04G~%bh4an#91i!%EdfO_6`>K z>?o1+v3%-LbjzcY3nw6N9V$l}CEfIRgqZ&Kl=OjGpA2-!fC$wVcpSk((~^tO zDBZl+64G3}654d>F($SdyNJ0mr_;&mY2#Yq|4h$m{U8`ruHdi(tMVM?XV}aHW0(HR zrdEh3G<4IWu1Av~7ck+tDy~fXNQ1tO?#yjm-0Dn%=d-KNXV)6fXU(QtdKL2J0uD<; zr5Mw==!#?PRXQ}OLFlxb(3D~*8G9EN75D*;IEayRMtmy8ql|W;d*tx1Sm^k0I;S&x ze4krWd*I1OQ>#zsxEtbjI9lAAgJPyONAKHu#qEpa7wdBn3jS4-b)ECu^(SP!Hns1P zpFWy7Q-?bPOJ;}XY(Fiq2U`v-xO!%6Sk-L%=@U>Gz;Zh;>9vWwhLT)+p%I>VYoH~u z*7QnO4U@Pi-6#>EEbWl<(v34N#!}}v&aLdk)!yAviOQF=uvH$`E>UD}!0Egg;W zX-F?@g&9u-OGm{hOqdu)$%qSe1&6B35X25>fFkfAS5Xjp)Y3Au$(56tdG=vPnRC z3&1*^(mS9bPvs*Si360Ij$t3E^T}jixd6TdpM$)bc2%XzM{k2k)6$bdjgsOtkZ%HP zhREf+g0m{g)u%XCtwLxj326OT59s9mlh~c{|JRpWmA#M#qB$NulR+rADt+Mm2Zwhu zSA0!HtsrlV(-kwvLfz9o>q;RO%Idw7KK@G^1>R}ax^w9pQ^ep zYhb=SLh&v`&ybNkuV*}fnz>{&4qt}qORLx$LQU#SMF~|4 ojfT_&B0aO6Z}de}7)!@|Gp-s2_dly}_(IpPp{cr62b!z)KT1p=`2YX_ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/models/__pycache__/index.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/models/__pycache__/index.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10558630696b1c4197bec414288b4c184d5020a7 GIT binary patch literal 1169 zcmZuw&2AGh5VpOW%_eM0OVu8L!yY)Whi0i-1VRWQfmHQURlsS5WNp??yQ%jF+X+dO zTPpR$J8BJ=~@8W5w`VCp$I zh8Py8zzMfU`(2xQ3xP%&FVK>V z$P!_+08Ab2j#>-6#3K(Puu+>q1lVsdX>eyjV5Z9ul}OO0zT zrM=7el;&lwDK*Ym3KM`6`G7X086P55i(DJ8TX=}H1wlvPEVmyu&!#l=wiaI3rv4z%e|nu$~?O247sRb0z_l4>4LQW*~`!MId$ zb`fi_KO9Ua>`*j_km^X#+7MkhOiZrLK5N^EELA5%cNPxE~Eki4My=pMxnO?nQ_jGo8ocJFgwM94G Z-LP!@mn*VfVcTFAT;Oc(65J&O{{dG$Iy(RW literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/models/__pycache__/link.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/models/__pycache__/link.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3116bb30b2c64ec52a2dbb59b0ccb84ec983e05 GIT binary patch literal 4988 zcmb_gNp~B^5uOd;5Cp+R6h%t1J(f(FuticEy(qFATc(znf*CDN3`-dg(G6nAS)lHL zNaBH)P=3C|mt1o7%Ppt;jQoeW=H;M!PCDhQ9sndH>Lq$Fpr)p#y1J^Xx~jTbmq$kn z|N7-0kN!TXY5&v?{Vd?W#v}g(z%-@@S~Yv?RUO|(V1#DX(urmUxiDYNE8Gf(Lc3~* z!`0!iP%S80E*J@m)uO`l!Dv{jmUNAm#17^T1!LiObv&G?PK1-yNyTFa$HJ-Vl&;;< z*f1+R(^!EQ_s!~Yrr+1fBhRrSty0$0T+uG&?>($k?o@6;iTzD8@#Dw~(%geqGvI0NVT5n++qWOwU0w4wc#Rg? z`;kNGC;tt=HF9FrV0zVL^FL{IoteyfHe9t>j^&?e)f^jQHr{zYl(}GEuiC&zSn-(# zd>HsBD=EAHe2k4Ne1uJ~Nz5yPc8pCa+9>ejY+B(ZKDIf|PC&v0s55LXf3s1?q87-)8S9>NIeNy{qsOz|XL=3ZDV~9-CA6Ebw#eeTAR=Nwc)-DQsLh zwO0LTtNr;s-V|K&D3Olms6Av(fDwnb1*A2vwgvY&cOu4j-j|N_Lpa!ZcyG1f;8&^j zd`WM5O!DhZfR4V2P~F$XWTJQQ-UIAtuF)|7&5kL~bpz5hz#tA64e^{v(68=o%LO8BMDmQEo&iL)_@!@!Lrs{2`7oqb<0+2NgmY21jquFQWM7jkm|#3rp$H!roD)k zn!ncR^?R1X%BaDhUz6vm7Pa*2XrvAHXbV-3@IhZw_tketubb1_ zeJwE(E2HkC9y3tNR;7L1neREXyVqCeWI5H^r8()$tIWnX{^gYOGB@V10Oi%xL_C)b zLH4AEXo?vcQDBxxL#_)3*S&xbSpv{tY0x1!@6bt^+Uq#xXil0J z@R;9Bhg#8-R-Ev(^o5jM(8;zUL@cmdYD;uC%||>5;#z7c5f)8<#aX?zT!-6tyO%%<%cP~T7gOnstf$~UbnAiL_tJET4*@}&6;fwKfihj)koKcBr6#(zYG0Gtww1LY_Lb0NdX%p}0CEso{d~0c za-f=M6O4}8v6xoRDF^74p6mPZmKKmutw`BY&S%x)Jfy0PSB^<@Pg-2;rgmL;8zCB; zmlI?P5?nfu;#Pt#AY*bNL(-;Dvb1NF8AtK8$G$&%?lIrk_-y|BKb(8~LAh@zd9v?K z2Os3kUg@D8NKR9kMt5Y=9;@&Y%EMMV?n2_hS_Eo>`}?iN)^!)udVXu;|0KiDj%y874jg z)-_9fOw^Z*I)0>#C*T~k?xeErNapsXdD-wTb^tD2x= z%c4!tDf$MB8di4DQS;*~D=R6-_Zj-jqmtb(aa5^#Sx>>wjD3Tdv&eXcJ}1LfLgaA1 zo>e)a4x1PH=g9wqvPb6)nnSuQzNQ@6vJr37o$_Z|DP^N(_NrfZWMGN?e5GTO@-@-7 z=C(nZIM99*kgUf`h5_Upi%dA_)@=y(n~?{zN- z%5+un>wR&4GC2K=w~ht`6VH%r+)Dy~i(@(+S~S&jzP)kZLEGU`OLEZpXB~l_non!; z<^zQM1lr}reyh9)vY@grs6eM9Sc#h*|FW0!YV@U?AA$3Fmiz@1vrHc<8b#eQ+T$wV z4zb{nu9Q#HJ%J+Bb<=|DqDOB9gcn`+2|UvsLI29)8hS};+QnN0-lmn==;UzWNOr}C zL>oL#va?sk!ewGMP@IQwdugKM6IY1;69S(SxJp1}*EPaEBk%=*FA3ZPNJqPul^TaP z+=F_D7&}2s)M%@l58ZGiEyXr0qjb_9vCZOeF-L#41(+`wMVlV9-)7OqA4b&7@^qFn ztC(Cpt+wPTk60`g(Rwb1@l!4rks|0(1%;&QZPMw%tz+?a6vQ6Ou52@dgRR65s-8TOQQert5V+DK8Is*5qE66xmFBx2!z7ckQj8G!*q~sa{!>B}X?T>t iK?o^K-B#>tSr}ZWS|q0cY+TMLjHb+@y0%Q|Me{%BD1)j1 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/models/candidate.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/models/candidate.py new file mode 100644 index 0000000..b66c365 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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 + from pip._internal.models.link import Link + from typing import Any + + +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/mongo_mac/lib/python3.6/site-packages/pip/_internal/models/format_control.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/models/format_control.py new file mode 100644 index 0000000..53138e4 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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 + + +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/mongo_mac/lib/python3.6/site-packages/pip/_internal/models/index.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/models/index.py new file mode 100644 index 0000000..ead1efb --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_internal/models/link.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/models/link.py new file mode 100644 index 0000000..2f42076 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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 + from pip._internal.index import HTMLPage + + +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/mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61de1b1c0561cccabf2a4e433a3d881af7b96abd GIT binary patch literal 201 zcmXr!<>h+1;CKuJ5IhDEFu(|8H~?`m3y?@*2xib^^jpbL1QJFNzsmFriZaU*OH%dA z5{vZH@^eyBi;DG=v-L}I4AYV-%2G^<&ErjzlPa?fjnk^ibCV5#AU#h%M86=jKsPh5 zxFj(rN7p1bwJN2!q8KCy#_^eXC80Gr1-HUIzs literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/check.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/check.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f80b604b8d2f9ce1d170eb8f120e74d17c53f449 GIT binary patch literal 3626 zcmZ`*OK;oQ6(%nqqA1z19Xqj|Ny15!NrcYG4U%?(sgX|WOqyUaZjhu+L!=;R-7A?A zDa!ZKj;%^X0SD*<$ZWgmqTBw7F569i0k>@z1-k8~tA6K7eodzo?$Lc79-i}^@18p| zGyXsR@R!&BK5rO*Gfq7=`k$hyz%&eQga$V`OU=;4zm>Ag3N4f7?9|Sj(9wM-b+bxX z(S0}dvT9h>{YvU*wXml9URuv)!Wq*LW_MPcJ2b;NF(dyDP1SThTL>5QEki|U_#apV7ajS@U zq6*Aj>WCsr`l^W2RB$~jldWAcNztJ%UOjykZ9MvHpu#apQ;?FUJ#D7_yINLQSe)^kym&I_`=w4dPZmJ17g8_hX14%x^Y+3UtjW9I|gDBPYee`y+HpmMleRJtCwM)t@#B*fZd z_R@G|aECi%=NHaTae~@Q0~%PHV(AX=ZRCB}U#K7sQhc2bDE^PV86^E8$Kv#(;fX-2D$-?g^+;DT0Rg`X9l!xi&n2WI4Iw5Nr6{J zrwonSGS5x`d=0j#WeCIZOrP1NZO)m#$;@SQj?J2@ro4)^7NZ?_YG~xX4K(#Hh!G&v z^W+?7+`4W?EYNe;yft)St$7VPe+N(j^cbnsR;T+Wv54jO-Po%djgQR{*w3 z7i(j0h(UE^GY9ptpbN3w^F#`6;mDe!mPUisUbz|om_Og+sL0cLA zZi8GKByHew>eK+y4-yr$KmZ6l0OxC%K5hqUJKs%tlyv&J6trg$D<$}cK~hZDf-M0} zfU>55pxBO!paAV4DYTNKcMzC@xX*#>VpsMlXSVV@6>)!(6PqnuAo`(yYR}OWL71CJ zH@5ju!?0n>OPJIBiMWDcIdjI+@6k~madUV}W9c-2n(I3E)cxj}LoYycwSg2;z$zt( z3$30wXv|PPfY&UzX_8kK8L&jJb+cIZge*O=7pJ=bYH7us>l7@jY9LxkJE3K`7KGPV zrK@sT2o7b1Y}DimX$nYFB})|LeObfac8V9$pnimVos0G9o(R{5D(6mZoXl9@4DB7* z1#Mzt$X8u8|341-7zU`j5Jtr_J$rzH!@{m+MezrMlGRsGTEh5q8FkWQx z4$d71kK#q?MJ`g`fuKZs&BkD9uriYEkb$28N9z3sW2B7vE2E7h1gYDoA;gc|U0^T5QgHVWP!N2;JBL$sgPxQ}_s)pyW;eJfNcbW;-baG5#q4dh2PNZSna29w|UGhK-4%r$$6a;Zi5~ zJ30eU2RPBNHCL4@kxH`Nlz4A?Skq#Zx6AoxN{A;mkpCNY=@ z4lGN9cglO3I{zGtunon9Z(nRdboRu2xMy%(`_jYFYKg4x| zDz!^1SKvhueHWL2UcUvep|&BfJvDZ2p{|)d^4(^`nS8je1oSs+qxDBR@)NvPe`Gj6 zr5F{(?KUb2K%_~Fw@DCKPCzb+D5w-uq|{&@^UVoG%o05?y^efo+$t+k#Pe1Z$qU#> zoQ7Hxl!hBdQkIpMaQ!zUq$JN}b7BFqw23M-RXRf9%9$O#4xF#@UD*<9Qr84}{it|o zo)iyFa5#!6p+jCSpWUWk&;&cSbP-jqe%*3$Fn}?#LWWjREk8j8MJyiaDl3Xgmue~@ z!^>w+10GGZ<1{21Dcz~IDhARgK_!T!#F8^42rlv*iEl!L{?kc`jA}8gd@;Ec!rI2k zr4ZJpvs7(|=T5EYiP{ET@Xv(WO^XS_ss7O{t&>+{QAg@jbak9H8+hwk&UaIBpTeXF k2{x{QI;&3_B-L1T^SXl>a~9Xb9Oh;%Z^>Wtmb~--1$C~yVE_OC literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1793b581a8f5e228628251b0b3f1fa14940969ef GIT binary patch literal 5673 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..efe9a574ec2da6f4ff4e5c396b4c0f0a0e3633b1 GIT binary patch literal 10571 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 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/mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/freeze.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/freeze.py new file mode 100644 index 0000000..0c4c761 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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 ( + Iterator, Optional, List, Container, Set, Dict, Tuple, Iterable, Union + ) + from pip._internal.cache import WheelCache + from pip._vendor.pkg_resources import ( + 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/mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/prepare.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/prepare.py new file mode 100644 index 0000000..bc7f86e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/operations/prepare.py @@ -0,0 +1,432 @@ +"""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 + +if MYPY_CHECK_RUNNING: + from typing import Any, Optional + from pip._internal.req.req_install import InstallRequirement + from pip._internal.index import PackageFinder + from pip._internal.download import PipSession + from pip._internal.req.req_tracker import RequirementTracker + +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 _raise_conflicts(self, conflicting_with, conflicting_reqs): + conflict_messages = [ + '%s is incompatible with %s' % (installed, wanted) + for installed, wanted in sorted(conflicting_reqs) + ] + raise InstallationError( + "Some build dependencies for %s conflict with %s: %s." % ( + self.req, conflicting_with, ', '.join(conflict_messages)) + ) + + def install_backend_dependencies(self, finder): + # type: (PackageFinder) -> None + """ + Install any extra build dependencies that the backend requests. + + :param finder: a PackageFinder object. + """ + req = self.req + with req.build_env: + # We need to have the env active when calling the hook. + req.spin_message = "Getting requirements to build wheel" + reqs = req.pep517_backend.get_requires_for_build_wheel() + conflicting, missing = req.build_env.check_requirements(reqs) + if conflicting: + self._raise_conflicts("the backend dependencies", conflicting) + req.build_env.install_requirements( + finder, missing, 'normal', + "Installing backend dependencies" + ) + + 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 or self.req.pyproject_requires) and + build_isolation + ) + + 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: + self._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))) + ) + + if self.req.use_pep517: + # If we're using PEP 517, then install any extra build + # dependencies that the backend requested. This must be + # done in a second pass, as the pyproject.toml dependencies + # must be installed before we can call the backend. + self.install_backend_dependencies(finder=finder) + + 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 not req.link.is_artifact: + 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/mongo_mac/lib/python3.6/site-packages/pip/_internal/pep425tags.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/pep425tags.py new file mode 100644 index 0000000..3b68f28 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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 ( + 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/mongo_mac/lib/python3.6/site-packages/pip/_internal/pyproject.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/pyproject.py new file mode 100644 index 0000000..13a8f35 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/pyproject.py @@ -0,0 +1,282 @@ +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, Dict, List, Optional, Tuple + + Pep517Data = Tuple[str, List[str]] + + +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 read_pyproject_toml(path): + # type: (str) -> Optional[Dict[str, str]] + """ + Read a project's pyproject.toml file. + + :param path: The path to the pyproject.toml file. + + :return: The "build_system" value specified in the project's + pyproject.toml file. + """ + with io.open(path, encoding="utf-8") as f: + pp_toml = pytoml.load(f) + build_system = pp_toml.get("build-system") + + return build_system + + +def make_editable_error(req_name, reason): + """ + :param req_name: the name of the requirement. + :param reason: the reason the requirement is being processed as + pyproject.toml-style. + """ + message = ( + 'Error installing {!r}: editable mode is not supported for ' + 'pyproject.toml-style projects. This project is being processed ' + 'as pyproject.toml-style because {}. ' + 'See PEP 517 for the relevant specification.' + ).format(req_name, reason) + return InstallationError(message) + + +def get_build_system_requires(build_system, req_name): + if build_system is None: + return 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.", + )) + + return requires + + +def resolve_pyproject_toml( + build_system, # type: Optional[Dict[str, Any]] + has_pyproject, # type: bool + has_setup, # type: bool + use_pep517, # type: Optional[bool] + editable, # type: bool + req_name, # type: str +): + # type: (...) -> Tuple[Optional[List[str]], Optional[Pep517Data]] + """ + Return how a pyproject.toml file's contents should be interpreted. + + :param build_system: the "build_system" value specified in a project's + pyproject.toml file, or None if the project either doesn't have the + file or does but the file doesn't have a "build_system" value. + :param has_pyproject: whether the project has a pyproject.toml file. + :param has_setup: whether the project has a setup.py file. + :param use_pep517: whether the user requested PEP 517 processing. None + means the user didn't explicitly specify. + :param editable: whether editable mode was requested for the requirement. + :param req_name: the name of the requirement we're processing (for + error reporting). + + :return: a tuple (requires, pep517_data), where `requires` is the list + of build requirements from pyproject.toml (or else None). The value + `pep517_data` is None if `use_pep517` is False. Otherwise, it is the + tuple (backend, check), where `backend` is the name of the PEP 517 + backend and `check` is the list of requirements we should check are + installed after setting up the build environment. + """ + # 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" + ) + if editable: + raise make_editable_error( + req_name, 'it has a pyproject.toml file and no 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"] + ) + ) + if editable: + reason = ( + 'it has a pyproject.toml file with a "build-backend" key ' + 'in the "build_system" value' + ) + raise make_editable_error(req_name, reason) + use_pep517 = True + elif use_pep517: + if editable: + raise make_editable_error( + req_name, 'PEP 517 processing was explicitly requested' + ) + + # 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 (provided editable mode wasn't requested). + elif use_pep517 is None: + if has_pyproject and editable: + message = ( + 'Error installing {!r}: editable mode is not supported for ' + 'pyproject.toml-style projects. pip is processing this ' + 'project as pyproject.toml-style because it has a ' + 'pyproject.toml file. Since the project has a setup.py and ' + 'the pyproject.toml has no "build-backend" key for the ' + '"build_system" value, you may pass --no-use-pep517 to opt ' + 'out of pyproject.toml-style processing. ' + 'See PEP 517 for details on pyproject.toml-style projects.' + ).format(req_name) + raise InstallationError(message) + + use_pep517 = has_pyproject + + # At this point, we know whether we're going to use PEP 517. + assert use_pep517 is not None + + requires = get_build_system_requires(build_system, req_name=req_name) + + # If we're using the legacy code path, there is nothing further + # for us to do here. + if not use_pep517: + return (requires, 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. + + requires = ["setuptools>=40.8.0", "wheel"] + build_system = { + "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 + + 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)) + + +def load_pyproject_toml( + use_pep517, # type: Optional[bool] + editable, # type: bool + pyproject_toml, # type: str + setup_py, # type: str + req_name # type: str +): + # type: (...) -> Tuple[Optional[List[str]], Optional[Pep517Data]] + """Load the pyproject.toml file. + + Parameters: + use_pep517 - Has the user requested PEP 517 processing? None + means the user hasn't explicitly specified. + editable - Whether editable mode was requested for the requirement. + 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: (requires, pep_517_data) + requires: requirements from pyproject.toml (can be None). + pep_517_data: None if we should use the legacy code path, otherwise: + ( + 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: + build_system = read_pyproject_toml(pyproject_toml) + else: + build_system = None + + return resolve_pyproject_toml( + build_system=build_system, + has_pyproject=has_pyproject, + has_setup=has_setup, + use_pep517=use_pep517, + editable=editable, + req_name=req_name, + ) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__init__.py new file mode 100644 index 0000000..c39f63f --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__init__.py @@ -0,0 +1,78 @@ +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 Any, List, Sequence + +__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, # type: Any + **kwargs # type: Any +): + # 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/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..efa22d25f5d3ff0cc93e797daa1cb2b7fbbe0450 GIT binary patch literal 1702 zcmZuxPmdcl6t|t($z(Qvx@lRea$q>{ClXCswFn8VR-jU#qAajm)b5DNnjJgIWIZ#f z?a6MU?1k->B5s^ePY5Iq9Qg$B9ehGU9QqY{;(3y6R|1dx=K1;g`T6(r^NmKs|L5tS zUvJeA`Wu~V4(RVgS5H7N#IQgq4l%Ym5hNt6!W>aaozMYWg{_IT)D7KIcSSYzLa+3# zidyQ2eyMw6J*|gzjCfrRAx=#+(q`C9TVX4`5MBTupRKbxYYd!lgOgF4Up&R(r9SFo z)?|&xIDCnbJ=AGEgPc$Yn^tt7a#3hblXRR*z4Ht&Cfav0r6VDB`J*C{Jmr}N_vX3b z9=DeEIFgD}`NBQLsx%+m?IfzG{OusGAhx1 z47Lx^DTa?=q${WByWcQ6{@Gd|K0R5RuZgc38ugah1?x=POGvA$pSs( zK?zeJ0Mo8ty1u3J;D84)Fv(dE^);8lFq+sUEI-Ob9x-drSWsl+C_aRNjbqhlz*VOV zGJ9>gqg@u~5GvN-xN>?gcwNoN+d*uvj%@_GWoZw(YJ(U64-fqlJjWySJ$dBpp3-^>e|vRK57Hr^WUD!SRIMRPWMv;)Cho z^&9=!Q5s)^HpqJSdgEk#b$M&9-c0$7sbgi0Wv5972xO7y!FD|g!$ecs9Z#S8TNbrA zPsiJD+O+K%Tr_**zZbB(C33)1ZG*B}GJEx-yZ{jSF<2ISl+_dIB+o29_u#nosL(l$ z^Q@o9bf;4{E|kZBOXDP2KR3=OPcm7BeNEFki6qvF9wmBcYDKop!&FyF?e=lZ$2Pv% zSS6{7IOZG}HJ${T4uD1D!kN-Uo0p-8^9iS#+d_}zl&ZXtG4Irj4{5E!wpOw7GPW|! zfyfUcL04lZk^^Pj!=v)Qey;G%#j`XyqvJ>q71ySvhIt_vJxi#uG%WIZ!MWV9?AJkT zLRZ@$P}9KrVIRAt?hz0EZ9>YCo%czTxY(;W*aPWemso9+bT*AoX}{2gYm-6ZlM#Qy31G#&aV8Qhn|jM zGwIo_-Q~c(Thg~;z08PGC{9XEZNT;2#f9)FwWR?`U$TA{lXEzgRbs(1-d38kLhx-{ WdFnEVI`K#yFF(NHl0~KByZ-_Q{^alg literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__pycache__/constructors.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__pycache__/constructors.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9bc25bfe7aca8b868e90e91aebd89da503ca5803 GIT binary patch literal 7607 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_file.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_file.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17a5997f0bf035566392499ccdded6b7728dd41c GIT binary patch literal 9245 zcmbVRNo?F$dL~&LRVtMhOO_?OZF-f;ZIvwd;-x*FcDto%^&)F5b$hzTJv2qKB$imk z(j!aTurkTWNjyjlbQ;KlIRrtFLxS9M3y@oa9CPGpfFMBnI!7Zw^8Np-DoM7JLrQv& zk8gkP|Nrk__|CvU{y+ZepPzj9o}&D_a^yFF@`p&_zp9GjC>6y~9nDwkT18W-obpqZ z6hG6IG(R(y3_r7#EI)IV9G+=kulH5@cudC6*ZV64E@%CLda+XEa?T&D4^@V^toy_D zk;({{`}`C2(aLCjtTM*$dH-a6yfUsT?zs3b%-!#ws!voV>XVhp`svE)`kBg^`dgK^ z>Srrw>*p%x>PE%jaRvW;{X*pemk0cd^-GmYTrT>T>sKmQxIBnGOjV{Z_i5K~r`>Z^ zZ9jU1?zGM7%EH0u^?*OBIsZXmsb^e)nSNbe)v zM7o7^8|ez5lU-SwC{7opERAnOb?^oN^|f zDV2|%k~8U?M$No)#(4`h3(i^R9G*XN4Cg$apEwtsi+CLZe(GFtrttjCNv$ZQ ztNW+(kKC=6C)~Q*h(e?4`L5BlMCdiv^WPH(l+Ap%j-k_oR7MwaiJ z!rd~fBB-0L<3-k*?*cS_2cOJ8_{@Ct<HV3?^_kn|H*c4ov`aSRkbfHT zG|~g4@D#FjC04!}YO9eFs|QL=Jy8Ed+e)t}f2ZJfQ(=VjJ8l@^MJr!V)IiW6&Rzzy zP2p`@kvogkXRCpa6NR((=4|B8Ro8a6op-~V=6m+q-sapp)%~5ieI38`#_Z~B(`(Lj zs5A3!-Q9P>-H<9dnI1?l8kRqci=f0DQEu+N%-{7v3OlGb?=8^&=`dMEoW*0o){)b1 z5Q*@|MhXS87zneei=jwyv;*~*YNW+QZsi~Hi#f!5CNei-LJR=&A~ z`u=tyO2q~A?T=OTPsQmt8|UJTlYWtJ5A2S_1L&D=7vthrimGfqd8};RcnoxdoMfyy z?2Q@Ku#BVhloDe#9AnROeaCp6WemQUhV6#seBQwC4!FXq^FX5P9jaTlq75SuMoaic zPoM5Nn2bNPll#*kE0TWf z?egLw(HpKXq7AFTH$->&8hMVbutU;o+9bYrUb{SQEFTK^(OYkYuGw^(@6FxB*1od* z7GF7*H)dwgHY3|QS0a~O+JEpm0!){Tx(9q{tQ&LPy*kFGySEbv$FRhDi=g<9G1a-q zDTr$RkZMV;Q%}{0d!jDgt1G3GzSX^^#8i=m$RzouaGN3k6NX8lQ!p7m2NRt@h&VCH zRvE>_IU17d5LXy@6Bnqe|H$Qu^HignNv;F!NuK5lO}EjiC;e15QCf2WIP{X}B>5hY zAW5Ng2s`2}ntvSGA`)YmGOnwdnoVo!P%5t#)x4@BO9kscom4CMHyKWYmn>I{$H##eJ{F3+=Q)NGf0wa0c3&?Bi{w<32-0P z8FU2FBgcffa|d_8i7qiI={gc6dVP%_k8)K{q>hLaw|`Fv4}Fq>IuubUoAlAe($a2{ z4{6i9!z53;Wm1O8pts%#1S#7(t8;YR^qSB=>+Wtc>h3miI?!j^1ipKu6~j_Wyp46l zG-cN)>!|}tmrJONkir5oB{u|05G{07P>Y?XTKrBU^�v;U9xcL=X@lALofI?S4m% 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 Qns4bN`lNnVFX+Yp0lVrl!vFvP literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_install.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_install.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ded65ea3a54f48e63983327f7fd00877cbf14278 GIT binary patch literal 25037 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88a38d844c8489bdbafdd321aefcff6248330a01 GIT binary patch literal 3224 zcmZ`*+j1Mn5uLp+F1(1OWQn3=Rwb$mToxHwik+lXjunb=SXLmJW-Mv#WDCFy$OZNS z&JHLN1?EA}V^aQwye1!!Cs*Yk_BEA<{6d~`dKSEf25K%l+cVRB`gHd`oSCWq`>+4} z_7`=={>9GyY|KAH%m0p!Gj7BzF#^M&xfz>*sYffY^k@gR9-Y9^qZ_ywt=LQaz}I{1 zxRO+Zs=-86{u%F_xR%s|x_;-zGs$c)o6H4s$$T)MTnn!0buV5>7K24S_v5AHdT<^4 zo!$-c-oyxQe$IG>SKl#S6}KiLG1qG6Sv*uCjFLenRTFD7J0cl8 zjil(POderj;difJybd>hySed2xc&QPbF2Be7L%=xXtz53ouh$h*oD8Pglu6?;Xfa! zC`(&$VSOc3VQT@Lvz6wm7026Re~9A~kt&>HKa0|Shx9r5S(to=mT#jIEHF3&k_I>5 zF(7Gi8>7t~?qYPf$9;@$X=UK?8n5Ho=QDg3V?|VZH9p7Z-!Y(3=htBULa}g8g&mmD z7qVmEGWyX-e%(OJ6*|RwMi2K-j4=zXG3&vbeP8YI&_$q`>;LTU3(yRC6XmwlMALdcI`$H0qdSPaH z;feGhl37|}_a8q}7IdDF#gbbI>@xhX5wPWD}(2T?@RgLpC~cNtA>Tf>mcSkm*dTfrl6 zBP@gr!yn@@H_??e8nPvUA@%4tQcSshXl({aB!)Y_X9ALaviNZgozK-Gz?@FF@20U0mBh#J$u5A zO@)Z)c~ICNn-j`AP`6Ted#!vgj@pHr@3lVq=uxpWlyUebQhV7@gGYh!DIN^^D|$@c1`kHOSTZyMw|ImslV_!4V&$<#*9B#JrE_H;t-k8+VO) zqmKD3`X#i{jVpKoT~7Hx+$R!gKG2~hAK(MTz|;p;&&IPuywE;@Z@~xhsZT!90c85i>B(5>7~$@eTN$;WuyLd$)0 zghm}0jBZ_FcX{J!2E1T8mFUA2MOg_(K4pKHJthOE5bW1q(i!dA0@K6sy47pqwXo!8OJUV91>*8R8A}-o!`3hjBdH0kQlpLvb&@{92PUlH0ZK2%DPf7kvQ$3@CC#gU2x~(K~n6mq2Y4<`6{a< zbL*lE02WY4M`I1|iwZuTp6Rb5`71h@$XK{pyNAzejlfmF75?MWQ=d}F&k4)A=_60+ Szgaix$W?XYCR*LBTK@wFSQ^g& literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9733620a5fd80b26dee2f9c7e9244d83566a6125 GIT binary patch literal 17314 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 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_string) + + domains_not_allowed = [ + PyPI.file_storage_domain, + TestPyPI.file_storage_domain, + ] + if (req.url and comes_from and comes_from.link 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/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_file.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_file.py new file mode 100644 index 0000000..270b75c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_file.py @@ -0,0 +1,383 @@ +""" +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 ( + Any, Callable, Iterator, List, NoReturn, Optional, Text, Tuple, + ) + from pip._internal.req import InstallRequirement + from pip._internal.cache import WheelCache + from pip._internal.index import PackageFinder + from pip._internal.download import PipSession + + 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): + # type: (Any, str) -> NoReturn + # 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 discussion 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/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_install.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_install.py new file mode 100644 index 0000000..111ad0c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_install.py @@ -0,0 +1,1030 @@ +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 ( + Any, Dict, Iterable, List, Mapping, Optional, Sequence, Union, + ) + from pip._internal.build_env import BuildEnvironment + from pip._internal.cache import WheelCache + from pip._internal.index import PackageFinder + from pip._vendor.pkg_resources import Distribution + from pip._vendor.packaging.specifiers import SpecifierSet + from pip._vendor.packaging.markers import Marker + + +logger = logging.getLogger(__name__) + + +class InstallRequirement(object): + """ + Represents something that may be installed later on, may have information + about where to fetch the relevant 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): + # type: () -> str + 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): + # type: () -> str + 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): + # type: () -> Optional[str] + 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. + """ + requires, pep517_data = load_pyproject_toml( + self.use_pep517, + self.editable, + self.pyproject_toml, + self.setup_py, + str(self) + ) + + use_pep517 = bool(pep517_data) + + self.use_pep517 = use_pep517 + self.pyproject_requires = requires + + if use_pep517: + backend, check = pep517_data + self.requirements_to_check = check + self.pep517_backend = Pep517HookCaller(self.setup_py_dir, backend) + + # Use a custom function to call subprocesses + self.spin_message = "" + + def runner( + cmd, # type: List[str] + cwd=None, # type: Optional[str] + extra_environ=None # type: Optional[Mapping[str, Any]] + ): + # type: (...) -> None + with open_spinner(self.spin_message) as spinner: + call_subprocess( + cmd, + cwd=cwd, + extra_environ=extra_environ, + 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, + 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): + # type: () -> Any + 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, + ) + + 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. + # type: (str, str) -> str + 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, + 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): + # type: (str) -> str + 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/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_set.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_set.py new file mode 100644 index 0000000..d1966a4 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_set.py @@ -0,0 +1,193 @@ +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 Dict, Iterable, List, Optional, Tuple + from pip._internal.req.req_install import InstallRequirement + + +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): + # type: () -> str + 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): + # type: () -> str + 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 + + 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/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_tracker.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_tracker.py new file mode 100644 index 0000000..e36a3f6 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_tracker.py @@ -0,0 +1,96 @@ +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 types import TracebackType + from typing import Iterator, Optional, Set, Type + from pip._internal.req.req_install import InstallRequirement + from pip._internal.models.link import Link + +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): + # type: () -> RequirementTracker + return self + + def __exit__( + self, + exc_type, # type: Optional[Type[BaseException]] + exc_val, # type: Optional[BaseException] + exc_tb # type: Optional[TracebackType] + ): + # type: (...) -> None + 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/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_uninstall.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_uninstall.py new file mode 100644 index 0000000..733301c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/req/req_uninstall.py @@ -0,0 +1,633 @@ +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 +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Callable, Dict, Iterable, Iterator, List, Optional, Set, Tuple, + ) + from pip._vendor.pkg_resources import Distribution + +logger = logging.getLogger(__name__) + + +def _script_names(dist, script_name, is_gui): + # type: (Distribution, str, bool) -> List[str] + """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): + # type: (Callable) -> Callable[..., Iterator[Any]] + @functools.wraps(fn) + def unique(*args, **kw): + # type: (Any, Any) -> Iterator[Any] + seen = set() # type: Set[Any] + for item in fn(*args, **kw): + if item not in seen: + seen.add(item) + yield item + return unique + + +@_unique +def uninstallation_paths(dist): + # type: (Distribution) -> Iterator[str] + """ + 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): + # type: (Iterable[str]) -> Set[str] + """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() # type: Set[str] + 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): + # type: (Iterable[str]) -> Set[str] + """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() # type: Set[str] + + def norm_join(*a): + # type: (str) -> str + 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() # type: Set[str] + all_subdirs = set() # type: Set[str] + 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): + # type: (Iterable[str]) -> Tuple[Set[str], Set[str]] + """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 = set(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) + + # probably this one https://github.com/python/mypy/issues/390 + _normcased_files = set(map(os.path.normcase, files)) # type: ignore + + 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): + # type: () -> None + # Mapping from source file root to [Adjacent]TempDirectory + # for files under that directory. + self._save_dirs = {} # type: Dict[str, TempDirectory] + # (old path, new path) tuples for each move that may need + # to be undone. + self._moves = [] # type: List[Tuple[str, str]] + + def _get_directory_stash(self, path): + # type: (str) -> str + """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) # type: TempDirectory + 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): + # type: (str) -> str + """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): + # type: (str) -> str + """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): + # type: () -> None + """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): + # type: () -> None + """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): + # type: () -> bool + 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): + # type: (Distribution) -> None + self.paths = set() # type: Set[str] + self._refuse = set() # type: Set[str] + self.pth = {} # type: Dict[str, UninstallPthEntries] + self.dist = dist + self._moved_paths = StashedUninstallPathSet() + + def _permitted(self, path): + # type: (str) -> bool + """ + Return True if the given path is one we are permitted to + remove/modify, False otherwise. + + """ + return is_local(path) + + def add(self, path): + # type: (str) -> None + 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): + # type: (str, str) -> None + 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): + # type: (bool, bool) -> None + """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): + # type: (bool) -> bool + """Display which files would be deleted and prompt for confirmation + """ + + def _display(msg, paths): + # type: (str, Iterable[str]) -> None + 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 = set(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): + # type: () -> None + """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 + 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): + # type: () -> None + """Remove temporary save dir: rollback will no longer be possible.""" + self._moved_paths.commit() + + @classmethod + def from_dist(cls, dist): + # type: (Distribution) -> UninstallPathSet + 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): + # type: (str) -> None + 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() # type: Set[str] + self._saved_lines = None # type: Optional[List[bytes]] + + def add(self, entry): + # type: (str) -> None + 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): + # type: () -> None + 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): + # type: () -> bool + 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/mongo_mac/lib/python3.6/site-packages/pip/_internal/resolve.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/resolve.py new file mode 100644 index 0000000..f49667b --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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 + from pip._internal.download import PipSession + from pip._internal.req.req_install import InstallRequirement + from pip._internal.index import PackageFinder + from pip._internal.req.req_set import RequirementSet + from pip._internal.operations.prepare import ( + DistAbstraction, RequirementPreparer + ) + from pip._internal.cache import WheelCache + +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/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..143ac2e39278bda95a03c355ac0b7b71b079724a GIT binary patch literal 196 zcmXr!<>h+1;CKuJ5IhDEFu(|8H~?`m3y?@*2xib^^jpbL1QJFNzY6sWiZaU*OH%dA z5{vZH@^eyBi;DG=v-L}I4AYV-%2G^<&ErjzlPa?fjnk^ibCV5#AU#h%M86=jKsPh5 zxFj(rN7p1bwJN2!q8KCy#_^eXC8tYh5=U literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4e72efde7d028a2860e7939d6037c939803df59 GIT binary patch literal 8037 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/compat.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f16d9704054e0e827db447435b2898daa593868c GIT binary patch literal 6173 zcmd5=O>i4WcAh@~!yyQgGA&E8tsU8xC1@!?6sezeRLa^CwPq}XDp6X=Q@fcRPB*{- z2Q%270ZFhx9}K6GN>!?q)SmW~YtFeORXL_Ad)i|TeN1W(+EdOx<$FBFb%>o@Ox{k>kDn{)o~kN@$D&IL{TZ|%hIEb2eSmEATpjcK07bY{eQ&+v?%>6tn` zo3Z6t>R$3n>R$HB>R$0G>TY|sy3cqsxLdK)oAqYZ*iu~W&3SXW#^*#I@5*tlH}B2& z7Q6*r8&=h*MQ`z$mOQpJernedzt=VT8!q5oC4Q@ix4MS+%aixNE8eS-OWq=1?7qzx z{nNO=gZr7Uw8VI>6(zIT40G5ltFk#(WAki*Ep{C5EH8J@@ps3%_a2|=zR#Mwr5Czb zU`yV4NPRp0QP1^UT}y7NIWBk?h7P~bMH{p@2Q5C>buruuJx0?46x4IYEIsVbufNjosAF_9ugZ7Wrh!r*B1-s7PXS3hx-lfE0 ztL%JHXFp<9^t`NkuBo2?4(;5y-n-&mfwT*35$}JTETQ#-_(E^lTSn`LMJxM=UBug~ z>|=I`UEVRh2IMrm*I0e5zcBh$dSX|0jTc5*<(2LV`|+;fU1!T|9-~(I8n@ZP7;nWg zyUG^Ob|bM_qo^@+ORL{F{9-E~wA*gJ6XY(7+HEc}H%cZ|p5*SMVZM_l?jBx5X_C1? z!rXowh)8ROPfV|5e;wEbvcvsgWS)D zeU67yUw-xIEC1f->-WC!A3triHd;S}fYOseKjzYUf}S)Y>IaMoo@K(u46-`Nc;@$q zVG!#ZuIkke&;5Ro@A!j=$=NJtakTCCcRQJ^Jlkm9-+Zc6Nlf+_#b0Y}9UfqOYv5&`TTX#XDB+mRRLg%UF$U8~C<%>$T}akboxT&bi2#L93R4HT$6f)CX);CPuh2BvoE5(Am`1!Ks4KF%-|Ny zaJQMqEA8!rJ+_wJ@^6IO!`+qD_ThdnyoO&VX+CN8qyE(>$?_nMudem@A7q^}-uZzM$9ASL zn8T&?{tYTQe0!`N=_9?WW#@CFYm&v`-#UEz17;lQ!`evemZ@aRQDAxQ;BOW&QXZR#3zSFZ$P_O|Mz=aLv9C~HYh+;tlV%uE zq|5|saFNG6ABe;aT!OTuv+QO;o4bHHHyz~tLB8y!Z8sZi_eB~4iYBcM$8qs{#@!&x z20acW#eNdxfg33xrAOtF-0cevcom$vJb|}jj)oe$(RQQU-A|KCfMDgv=$iJqh=Np$|ZpEu`#EeWSI~k z%&1qoJLpR*0j|q(VNrSNX%bO~`^v!Uv2M({WMO;`aRu|p3Zw^lF2u+5R4!Dl zm!w5sRW#7(RSTiarzSaHnAM+Z;?+(zaQ0>(I}q^&uIwWe+Ptlw)-B7>YxuKtLoXXk zwW@9#mU^-c$9NDDc+rpU1mr57K0pPCrR9hQaURiNFvOKO!;HjW<`|wmB1pGdlg}e7 zlWjzTNN+MCMHqHT;TE2Gd1M_tx>6VWS)GLHHV2&T7Zg*!!*mtu>s5?}nK1mg*0x75Q{EeipO#<8<+C#yF;1j`BsnIa(K#_F|O*RHJ=sPl+O1w&{9YubY(BpOESt=KLLP8_$WvDHZ-gk-OyrAu_~y3~<^5?Hgd99=e^>4fccKWHq0NAOi7n zH@8&yeBwUa0c_Bs3G0BH#p+xjCJ+W-hCmlQfH7#L(%JM|n-4Z0KHPkExN;HTcw)?- zxzD0FRyZLF7={rQ_D)S!ugc0!kWpYtBh91*fJ~&l=|8@|*?Rbu_!OU9mfCRToZMUS zy;2yb8E7P_D9ceswwIRbQkg6Q{tGx>J*C6m3IuNCx04J&pm@yIbx>z0|+?i3-n8~caGR`X6ffbexd&(o%5BikM ze63QNuhr&CsYEUYDv+?nscsud7!MfyKENI=b_0<#us7)?m;!-};LWPi% z_7Y&{IjVu95iiDmqMj^OmdN15pk8Z33);+)F*0}2pAow<5AQw_>0ZP*4DAN7V)~S! z72FDzLwGi(Nf;s2vnXNde%35f&+B3yO10``@fq%~jHjBVogfbl1FWustdm65E#Lqm zd8N2rmnCY&6Wy+#@HG`_B>O*cWwa}6W)0Hc?uZa|Hz*GwNCGffWF_S7=9p||A*M!#T*7Cui0VLf$6=Q7?%vNno3b4i!5nq!Ee}E=92;t4fStNcbPL zsIvtP9M)EU#AZ(;SuEqp(ho1u#xV6_b-eOwPdF*5SPvOgoTq6@4>wxtTQBLvQ&#S6 zK79IRYwP7BJk@6kG`O$cP_Xo{d9UM1d``u#YUjybBvJq$rk5s88nEa0=ygnmTIw4q zJw?eMaTUuc+qE-L-_TEC8AQ^{czREV-H8r}w@^&$Z&O`Y?REVD{h#b~Q&xPRrJ?Ur zp3@#6-Q>P62wemPpje@zi9%K=Gog%x0#Yz4R5mh?6O)Dyg2qzO$f5(qo8>vxIz2;a zs56uX4%kS5I*2My9*DDx3Ki-cZFWN)&lSng>sy~Orh^jPT{Dz z#dF#XRdX__V|k#BSl$dw{jkWbY~QCm4C}l}^IoE228FB@XM;G8Qwj?rB=|hNzN~!; zl1GP%Txq7Vvf{j!s(B3RN8lXDI3K6E`7W#M`7s;M&b3UG^+TcHUm_# z2IpBoNpF@c8)-|~a*Qh6sAkyc;h>*m*w}o^6}w#IfR<_B0?Dj6wtXIV!vWp2E&G&X O)%4S*JzLcs`+otQav4hi literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..709a637040edcab0ca66e0988ea12d011f0ec0bc GIT binary patch literal 2605 zcmaJ@+in|07~Yc)ahxWw6qb_t=d4_71A=^89SToiJ4g^ zHtr4XEfSBwEf0cthrLBy^cA?`o867$Qi-*84*$;lhj0G*e&1MIYyJJ(pWipzhVhrN z^f(yb#w&kC!wlD8CbL2_vRup5V>`56yXYO)LGOgMsP5K_Z?&)yHQkkBTn}5(s=I0$ zd{sQdx<=TJ*4(vd-Cf7`rhD$5!B$x7rNLT!V{W_WnN2s@dA7>hFHQFXTVv}l4fi73 zWarohBwNgWVstJ{`>h=kB`ga$Q3q6!AWB0X@mNWsk|Ye`5qiR7I=~7}<%Aql5ko8q z9VD3|jHiP8R0T;ayRBD<(&(7^IXaL@m?`c-VIou?vRX=oJ^r@e-|OG&Sh>9uPx9u&R4b<8bnVXFN00CB?(FY9>~9lan>l?<3~u9< zz~117YXWAAnF!Cyw;l!Qoih)gmcI8pcHZ>7m`2?5@|Ne72w>dyydN_fmS281gjQKJ z|EOLnf-zORH>RRDOhSebdj3&Qh1Z9JlQFv~Z+V~lgUQkL8^h^wtE zVyS2tUb`9bDU&Bs3yaqaV#Ng_>}4tlWp4@2ZaNW7*x%BzS!kMOG56~j>!(q@yXd8h zX67*CXhpoQkZI_@Q^w4gnKNr<&zxCpj;xA5Q|8Q6*4z?zlzoVdo0~7{v-)9eX3R}| z-+XfqGc=U_>1FubUHIEw@>F)}`IeW6U=$z{PaY)4RhHzfK+0_3hg8bK`MeP(BP<)` zD2qeKU2$6sh&+EuX9w)h@CAp(#kQF-4PD-o+ z2^{2-7gsbun`jKPiJxU|S}nU}wk^vPmmz&EooWyih<=2DG7e1!yqLx8Uu@G*Hjr&< zgby8RtC})AU=Dnoe%@ewNV8DwBd6;$O?k|KOY`);6jTK1ZDuPZ&D_Mw8df-1QL9$qW?{t-%2v+YRQAl8n@2Uwv2JeuY^wTU zW9FzDtFgKUthk2_`Ump&J`YnaG@YEL4jAPmkV=!xFpK^2st0P)ZM6s<0lrD%?P9Fw z`}{=Va#nJpVT-job-+m`p}J(Gf=;Kg=`bVWUMUD#>aX@2EDC&lee3*r#fSU{xv9O^} zQ5POE3}S|WLb${T3#6Y(T`vfQI2Fk_V4Ms&X9Jk2vSlYcrV~k0Fb#Gtj`9;y!CUMt zT-Qz<@yT%_7@=a6mE{h85b%^h{uTb=9iWVqxay+Jr8B_tG#D=9q~j|<+fBp*m~c&>eNq*Z%IL# z8*@jK3dpKnUb%dADK58B0qE8W@5KeZ!_Gvw#8U-DwHEi9ZDUQzxbJAjUB}xt*X_5_ zi;wXQ^#p$j`khO8!}D0;mt}aEsZ5|G3mvZ5(2aJ_y;4-3F$gsg-4wx7T|v6l6)B^$ zu|{ax6Ca?-|5L1r;@VY{6#IlG#JpZjG(!qqNySwyZagjjBAoGaNy$X7(4H>^eMZjB jFUo%qUuvM`yJ#F#7esEgtu{uExnVmXXvb-tZ?^vh&eP*= literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58cc2bf5d05fbdf56564baddd5cfd0b6bf4a4a25 GIT binary patch literal 1280 zcmZuv&2Jk;6rb5IeB`#Tz?ItdzLV&6!HXu^BYE!Ci6Itt>vAy03}s(tuP-|Q(4E6kjg$8r;IA=gihql9?Nd!!OYRHe}7h3 zVx>dZDx=G2{b1>;AFQLGGAiDIo?$|wxcB<=FV9ZJ$9u0Urx(?;PrMLoKCobz***jm zzk!(CmFNha?VTEz_|ll80iNRp=FS{RLu&;8XuOLC=G<7o!QMD8(d2u`vIy7&6H`aw z|A&|6+$0vUwN0F%!JE<^ICB$ft+hdJfrzE6k=$b0ZB@7V5A}(d{N2T#ueSc4gv*3FkDFZ0Zs!L2+fDx-?#nqgZrd zH3P;v0n~wXmV^PL)gF~8r(FvFl2!5^CkoyvX^*IWPSQ5LTZ zkX)-*T4c_TlpTmLike+s1DJc;(R zhH?ZAc-U7?k0;|)C}+u0ZT}xhWs0d#TM#0&8;qG;vG*)xkw6B@>?9+VU%8dVqL}`U z_>$t&7x_B;3Mrp(-zoq+W o{@IXki1#xNUyKqmX7nrlUc`qW@;Lj9vSHzE^V-UMWwU7h2Rx-=YybcN literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ebeec7fffd6381ba2cf6fd5340ad65a7e21e1f6 GIT binary patch literal 665 zcmYjO&2G~`5Z+lku?cR-q2hpe0DNdn)uLVyLPBssY7dDN6d@wlyJP=t*whVaAotWK153K}8nOpfqV4YyE2rwiHZmRO-O&jt4}D^~c~6ajxR3cG z@{TmrWsb1-GH9F(_xShmu(j#(o~x#awL{;et%*D5Ho%cNPCHg^+&6L028&du#wbfG zZGE?m4J6+PZM1T$D0d|rT#Q~TRVmv|vy5xZoXjrX+JFgFrUj2Z)pcoMt@v70D~;B_ zyL=<6kD)(0sg+o#h9~P(CG$!$u5^;+iIKa*Fi>~fnQpUiKri|i@VRhf*F zTGU6P)Fzek=(ONBOmDE6s9T#z14;n!+L86*@9>J?Hg6sC07BC zq93Cmeh+-=Lk}Vvc@!e(Ll;6ipbtR}FdlbQ2bB#fJ#@QFA0g!MKisf|8)j93!S+UN cRlDmQ@xZkRpBEKdN&dp!T)RVsh!lB$0gWxG*Z=?k literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4daed2e5ec5f313c36e1ebe1a3b48edd3a12a8c3 GIT binary patch literal 1689 zcmZ8h-E!kJ6qe+lxNZ_?x4nFFw_5IBzyAK>k0wHYqAQKS z{B!7h3?@b~PEm&Y7^^u+NuTJ^=o@-8`zDM=YGroc#)#VNF}#~;BXjyrw$fjLeO7G$ zjQVceh#eSLZDORJ7$2eU)k?F*fmP!LIw!)eiD)bc->=EUi3vm?waV6*?;KK5v7CFO zG#NzR31u8|@wi|~KHBmM=Jkr4ddbks3*l89yvwDXp0q+9C5gWx?MTc@%B8vccz<7R zjPfcNQ4y$!!9_&b{z5>^0RXbcSiz(d1<^QUK`9%IaI8-;9c13z` zI5<0rAMlTZkD|eBdhh;lewsyhp^ftHakos$ZJj}yZa>KAJmzOyIdu<`Tu=rybt{pi zysH80lruQ*)q|=`0Hl`UYy%8(TuiWw+lFm8*d{J^2~!^;MXzcmbT!vBKZVJX<{B-? zxltSZjvx~wCN+8$33EY!V&e!2t2QQfY%ZW2YCI*ylM9cfJ!EPDy>@SYXY;dzhgmo& z*rOlrZtwi~f&ZeTT}l4GYyRopSxF;7;~QmgnuxLYp%)cU!a26@NCSJ$vZSX|u zZct6ZuHe_uzX=n8lwNAM8>S9hS6ULd2IxUY0J=|lPy8i&I*xBJwTZo@j7t4xVy}$D z6B;P^LXiwox=e8gR&oanA~tp)E%pw~Bjr#HLsto2PYTr_ZJm^P1Qk%DAqZF{=v(t& zj@ir;g%?w(PymT~Voa}7>AD`YOR zyeR&erHoRg=2i2de{>};b+<5GZqCE3h^v%7QcP))H;Ds8I;2TV{IcP^;jB5g{{{5g BymtTq literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60ca24a792ae92424ce249d414a785f707d11394 GIT binary patch literal 3603 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/misc.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/misc.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fcbaa0caf58b1e7c337460b7138c099c446a10ca GIT binary patch literal 25091 zcmd6PdvF{_df&|K6N?21g5Xn>G)IXNK!FR2dLG52NP?gQi2`{9C{laUEf?DZV1a$H zXFvd}g=`BtOS-d8vVD%@w<{0ll5)jK%74U;%TC!&oWx10V!PsG@^V#dSClxf%Efl6 zQg!+LzMg#m#M!d1Dixr%r>9@j{dIrO{<@zS7|8tIPyX8Lf9EaB`j1x6-(kehb&sERm&&gNzR-Uh(&!3n0aOFbvV*aAU_f;mVm-3eoA5r_&0d-IvQis(M zb)Pz_?pF_}2bHTnqmHSE)WhnydPF^{M%9=)p&nD?i-+@5UUK=e_rjK)e~~eD60vEO z%fF;1@-M58@>kUN=3i0IcrPzF`5EGdi&M$>b$z}fup`(O{$T1Y>eWTx}>I%`j4QFRO!izM-zD!+3sCy`qlbSx__TK0I%$tLiA8MK8WQzhJ9t>hq{w zQrFe}NL6Z9J%FdDen8z&4tu zuPW+cJOfo#H9S|<52}VbjuLm(9i@@7_JXB+6})4qz+2yncPzlIr8d+fsI{q@>PN=P~T0(huRy{-p8Y_zh?fLapUGjY9XfMzkh{UeFc6!VS z6XjZCH3<9trHZ#+xU*UhSS`^gYM+tRYR#lMVRo`!trlx)O6$4~_fFURpjfFCgL1tl zNn?rdkY26T%C*J9YE5~%aJQ_3)ndh~-3szLC9z%DOzi%GU9Y#%e2g4$Yz_icHt=nT2A>3zNDUXwM6?s_Zu^ z#SK6%SPC=qfZuAPpvpRo75$YkjZAuNCoNSj_bT=om)XnN3TDc_GY|85Np zEqdVqAz1+Q0#y>azkc`@t|mCEbL#capFzJo)Q*K!C#$66|6`sydcp#;f^wmu?JS zxIX#f^s7^asatbXGqclIXJ*5Z*&ElcUA;axb*VRX&&?O7rml2T!u{-51O+sH*V8^H zYeak1`dzP3Tn&~A3%Xt{tm;a0s8Md@x}B=)=IF^!`PYo+)|M)tq;nW=ZoYZ?lXxze zZ+?=J_w^=UO;~9sBGMHu0)d{K&+%&*^7Px{Xko+{06tUUh2LUXNJI)%T*+Qi%hrtxGn=O>@6dQIi8`%IJ{ zRs--0XgvW0toRevvR}$IHuM>Mvq1P{5LhwC9<+z-tX<+8{|L(g`~-$q5ZM?f43{0k zN!f=1%T23gspLvhKceDDO&qXhkupmN9|44uK`KZu!~o~ZhC>@}t`dM{YDV(|pY#_% z=E}7~0bTmUIazA<9rxXnRTsSvV+h6^J&SUB4#8NTeu?p`2*UJy(HC3{WB!I8#*2FK zE=i$RS`CC|4PFQg)$t7c`{p(pQ8Y6RLcMOtH|P=3Sf;=P*ZGYn5tQ-sxr{8wv4`!n zopI9kh@G^{f43jG-@pJcje~wrZ(tDXB-_P}Ftb)H2f+GuPhBo?A@YyU1bza{5k$;# zY}tXM>gkJ^uGdP z>x40^N_`szb`FS@*6{NoonyMwb}7aP{`lli`gR%-=^KP2Of}HryrntuarD(*PHZ_g zrnrS%^chI;wuC^9e{r?u-YnNtea#4&dBU4W4}v9KU#sO@_onBT$dHgy4BRD8 zd*eMdqlTg{y2bWlV1vqCsyDoa)kN)#RDIxbQr24-2g?t_lphp8 zmAo)DTbRB+b>UK&C@moYJhU)<^ZNAM6s9P?uv#lc3lzNu?tw!QyL*;a39nF|BE(A! zJA+tOaYr+~L&1m~oGF=<0Femyh=DQEF=Ag3UrrDcm9ygLi!Ez8iImh9^q?(=xVfCh zdtc9c2CejOnYOYA(TZ-Uc*_a~O!}6s5?^u-TL&%H#)3>X=Uyn^<-}k@Bc|-$Emi<7 zjLR*$i^#3HBxK_*NFMm8TMjS_6p-$Em`}H~rerG03vQ$C`(?m3C#e51aUujm1*Zq^ zw*l|LUi>EKEdj^F6eK-9v#JB11UyV49~}iL@j!MUx{cW~i94rm6g~I=KYtK`6(13rIb& z^Tm}8!gKCo_{sc{)PkEhEqgPzK5AwXNEDM9IMo6Pc*bIG5NkPGHlQE7letMWLkZzK zuU{@NLO5{AX*d;>LEQQRCIIN}m4dq7Agn1UxvLE+VrB-}ZKN74D#FBNH^(JBJ?>)I zV;^&^jm3LlpY+xtviSfA48?vJKR=7WipTA^5X~XG z0~7+J0~Au4^+yaaz-*l@XF0ZIU9#R70w@3su$7S(ME*M?H?h!#=1>8M&4hceO<#k^ z1AaSOxG*^f@hG&$5(ZaO5WCBo;wh#yOo)i5PvBEP&J+YUpMqejF4V*ilf@E+(j6m# zZsD(pyjL)Q_$k!)(+Di*5ZFN4*6$;}ZCD-Ro=495Tzgo+up>cCIW6k|uB2;Xh32qreh#? zJ(5-~=$;kOMmiv+-+b}&0H-^&s@7P*L-HCjwYZDxobrqq_%bbW%VOzv+dF1bX8v!YgntMD zg`BMI;6DwDo5egbJ`&qTbUW*lA`iry^h#VG;smPLeL&*-Fp(5;R3FmERRXbYnvJyc zDrw5HoJw)x@gy2&X3GBwtv8d$bB`~)a&eJ8vd({a{$mPY&G_;1%0-ihXX~wS63(euPi`E!PLvCBrLQno1mr~X;8XIA^ z0jSH>%1*eQMCE^upFfPiif2Ky1_8Hr*n!-xi!t{BU=ldg~rZV znn0P~=NHLUEeHK!KlsP>%yAmr5~~EW2^CQeFZ1n&-lFq0yHs?$p)GkWXy=WB3FIz+#XKX?B1VxLRA; z(dDq8gDXgu{|D@xXj#xBGFV)Wt^YF8I#4BaIg&{hTtdJx0ID`Zz;YAumIZ$JBIyvG zPa+?yZwsk-qQr{jpOw6nei3O7_$fp{V5KSlx}-TK4f7RWWFBc!V&)Tj;uHII{U*Mu z-$sDZB`b#NVw5$dzr@7d#i3Kk`rr6PRASq1yc}d8pvOkAB(ke0EM#7=igZOQC^5iDA`N)#*v#cQz=LCl zvJaCXJ{Jy@U?r@>&ZIqPeufAo%?sB#;JHHycpTNi-7TNWAcdujkexUHn8Yt_&vn)~ z*EfH%Iw&;}=S2CYZ~-mNCMvylnVptLfe{|@fOnUDX^H^2E!{WFNdD%(d24f`w9lgE&vsU3uAuckz?fRG{ph|^f1sr2m}IV(Nb z8F_55ZH3{4^N(MIvB6A!3lWZd8Do;M18rIk5k;SpbkQHOmb}G@Shf`;mLZU!JQVk+ zu7R7WyNk5YHatjnEX$(dd^M%p(ZnG*E^aqx%E*d`$@qAdbNj7RGAc8kiM`Y8ZzkaStPZ zf@Qn-M4c?-WF3k@v}_G_*AmxMXDvN|m%!S>!V>{V))dViv~f|##!7LTKO!sM&>MFy z;^mxjN;wp_K_6g)${BngC#PTY9;Ly<>4)hItcL7|RJUKF&Z~#V&Kt|i%d|<*3B#cV6!SW)(BKX&*f1wv7OzW(i zBileC!Vj2P5bFTw@}~sQHppNZa39Cz9#PH^+PIn8pU3yi{O&;vl=bi75%!T(i>kVF zOhYnqSXS8{o15dXM1X=or+*Q(cc1G6$mz~CkfC=_U-hBZo5FmA&zLmh`{36e#f7U?71kv=9rJsfDiRAsSAw^6{1x7nBT z78fCG)>h^&gP#iCl3f_4`XORrHqws@6k7DxkOY=uW}d{MfWcS6ZWb2-$a{s*Xbt#< zb_bRSACW|{21Z0d)W3p8ON0ym_-spTeg!WrOT%dRzEexnM)MA0U^p%qY8-J3sR5ze z9qa{d(X9YqDWrF)$0cHLw4E4{7r#qVZ{HT`QlOpr_H9yVq1dC5`48-hIp9-N&DyQX zcCIfUmfBRzC_LUvkA%AKAlA{xZ{PM;$_;!ITM?_UL4v453C1^~T~v-j>=-90WVzAI ziY_bkCc#&^#D#j>%?T2k&ceagYIouIxwBHoKbPy){nTC1zly%? z?8HDDqy_fl`+E9u`cw5|TlH;S;cx^RL|r5OXQ{o}R7r`ycv{?xT3n8B)@E^zM1b@$=tpFyw)nhMR=eousW4GY_{^3V2TZ zJ!5@C_`S}Z_-w}n7+di+U@~!Xrvw;~06Ec`K+yjH0Spr$MEW1`UDVF&h<%bdOHv9w zwQ=sJI4;U`Nei}6FiI+%pAuWTt$<%sJQ7htbBJO8T3vGws6cCRB8;$-ghKy1^Y`9E zw8Fvd3n~J>RAJZe8Jjd@hQ?8a_x%YAF5oaJr&$N%cG5}5pk>FpAyVS{H;~(zD-MFc zN&NhG5G=wyfa-yMI)G(MAH`f@`&-QNGu?O)*X9i>1DyE|;r){2%6qrm`l*(YHXJHt z%TTx=ZKStgt>KoBr1iDXx}Iyn#&Ks3(gs!4Sn(hhQ7>0Cc0}kO+=SyxN01Qv6%`Qd z!kN7b&}Ed+Yh|*98JIRAay!Qj(?@;x3D++{XVc}ne@4FX_?Wm{?BH>d1tASyRAi2{ z43VshoO)w+>Uv=o8=$iBYZ5ymnN&PI#==E3eA0M2^+@=CLd)A5c_M0L!}I@qt@Ly+ z*XeWn^P`4kR_gT?_BHAzd4p&UhVxzqydQd8c90)>LYfoZY!&9jc^C|o68i}@z_GcF z90Hy&rU)2GdTjf&e6!tjn=8*PL0qVMkct)5A!vWgtB`ymIfawF0G-(EtSr>wX?Bkg zIWv|qs^Ab-F1EH{V}|*TGPI`3&^6VF$z1<^rinxuHxgxnlL=1>KEf0_yqicl(3Ukt z>G&C97z`tV4TN2JuM7{B4xzU>PYQe}ZL3+YoyesGc5bLFEQk7@O5M z1yC<|X48}XI@y-=MTg|fP^y9k4ogE1ch9*mcyOD54sDc7DG-$re$Se){K;k$r-bko zsf^}e7z8Wzjz^7W_OII?ZqF@0*J+B99-A-@htSp)Y>v^=F%Ac7#^ktGgjfjtS*g|6 zx{IW{I%ro$V-b!*%Om8%bi1uc?bE-E)E(l7rrPu`IUll7*+&~1bb6+i@RL8}b|KFl zG3q}wn!%L-G0pE0V3sUO$I1DjNU8`u-R}9u|5H29AHIjo0;Y#=pWP~Y?Tae_6LK@ds>-RKdo{g^J%kL!dNS_JhX)k z3-oEP>U-YW%(k-iZv?~3`&wD_{u`~V%AB|0AwGz{jiAN;VE>kN$Wob$P+Dzlx!gH- zQ`&6BOiS2=Nn=X0#h(DM1fy=yV^J2YthZ6wG8Ti@Z6;9HybYHeqXQ{OGv%64L05Du z;?8aO-(09vq%~FnjRU=-_bQwNTv|I7^ekG%upqkH3|()`Ix=RThNt0<#$7CFK$@db z2bMJG3U@sPbuB_taq`jL;%cR+4VSBW)p?jU%!YTdwtPaq zFoeR@7gikN1>6Nq^MFn?xRdn;wn))F>4h4@fk)D`RCS(sB!T2tQgj!I2Py#lwLIUn~QQaMnJ8 zP4Z0aP|S5Y8!fc6yZ8xZaloS5l!XjQHa093=;`_aPQ-~pkVLxyhN!8kyF*>9-} zsyPU%IowM%Wiv=5F>vWW7u6Ib2jLV7_U#i*X^xcl|6`*0|A1;XW4Xm9x9Aw^GYAv< z47|wsvMw1#9oo8iaq!dn9fbn3Pm+CNhjrdUn@DCP^ibReMPBDGv#5SpwB8b>w zh7l1xJ|l*IYny(q{~K~4_WTn(!ldC+I|EtKMa(DAV~U{=&2U~p(Z^~=(}_d>2Ly&oJZQKC_b4?9dpLM8f4X~kU^X1M zmG6B`R_cq3@ViQ_6*YZ#!W2HuFAJkFY$XE)JmSPM@ZH#n{(gQ8{yNzI4fnvQE}*|! zAp*@;nAsmCvh^_ivbQ1L**edz{w@RZApLs`ejfqE$)F62`2S==m(lch8I5FxF?3k} z0So;v2LGJ_P3&}MED2-L|AT2e_{q~qJHqLC9TD=Aqu?XtCD9N1O&UKs3c-QQ877y( ze)XUjQ@~%a?>G!=1Ne+{06rgs_JQbaM11TI*y$KFrPu>bDb5ezFA@EO_xu)Kx_hg4 zr-l9i{=dP1c%ZHagY6yS+AWy(e-_?}dnnuLpACkBy{ySN&HELcsoVtBZ^gl}K;c<` zdB2grYe$0v%Li4T^u-}>2o9-C%Ql{m;%?GE)7&FcmeHyw!25x=I7k8m=EoRxbGSEm z{p2DG^zo?Ag!n0e#lzMaX1YF2%{UyT9&6?!%r<9kI@kfFeyvui7Zs#Baqu|~-JHH? zu+E<(z7tL0*9ZrQHeG^DdEHtd2ML$O)PpG`U#T;M*0s~DP4ldPR|cbb0Dm3A`yz9mW|+4Ae_Ru7z5bK zPF#5g6&Hvr*7ETbH2rn{0JIR;`pRuka;3` z2b?(GoDg;g8w_TJl$*!$Fj;1^#TU{It(*tPj4=I)?cPJaeKhaW=l~<^AdP!myT(CG zR;ZZNsX@01cnlxdG2~DB&Mv~du-?$;zOPNg<5u$#vtDq(OnO#8#hzV;P8BTm57|C6 zVV2m@cDQesRz7Hd#Y*TQPGmwCVb3ek6OVs{*?ss4@yMYt(32iiS=cY*5Oo+ogm?-T zmJ=i_n|)M|H#6`U0@0AS#3m01KqYQvR_x9GR)5y2&p^GjSNfoW;+O&2xE%<=fvDLB z&oVg+5~P})`W)|(-XL^jOvFl%kMY~F+)^q zXV6L(tvEW3`p48jy9CK^?I>~wC3ggB#zSgPfUj<~33AjvP;038lUP+oHpP-Oc3{`_ zm+EWL@x(LYz6#fuar!5?(=(T^(mnwBKqL?l8f<6sU?Z%Z*ssKiB^pVkMHheOj3XZK z5yQzE*S!kuH?m2yy-QOUZ@hryOFi43vXf~L*@bEkk)cpu!J%I6+tR@1pV_&&N=JBz zD{Y&p6hikvEZXWf`%*0NFcFW4VJ{a(X`G4>J0ga2Dz~i%w3gG{M~he0E5b(cg*VzA zT7@TlP>2p2+|!dNT{eMnn6J#QbvAn8Qi{4A*ubY9#sqvFR2W1S4$>W9=C09Ew(TD= z(;U7YITW>tAJ|R;{=5Qk`pV;ghrIGYX-p2ZpeN0TM3$m_h_Rp}#!kXdb=wK;Ovn?8 zIO80LCEU|=$7{NikdJv5nI}(pL_nBmx7HbP8EuZEm=NP*$NgjO0^GB}Z^fu2E#fn< zhf+MPAq?Y`CYuj$tFu&8?rvq1W<$LB;It8I&Ecanur2khgwFvC$8nsu12;JQP;S-# z6*N(fL`wn%*f>`%&xy~kE`|wNcHv$~uu}^QaQ20F=M@@%g~%FqzQrcuG<|?^HsC4j z;aFn55oWqy3llO;VRClv($yPtVH^i1rZg^|Fruoae5?ETx{t9D#CTw#h=bZSo_Xe` zbVL89e8|UK$nG9sH;{a&Er!I*0(=>T^j-uI82aW{%N4~V;ycC*rHTiR3!VG}P*shy z7y6<>PiS?4S_`>3PJxQ+m7?41{7c9iX-=h-^pI9I~A#=G){t0a;tBv+r>r9R!RXB-Gd% zq`8ONL(LT+RO3W%p+_-qi+>d23V6Y8eBAdc3pl7mIP9FAbi0WM+8?m&=H7cg&>0X{ z38!2ja0!u(6C04u#Gr_sF-S!`ypFvO{xfwMd(^Wq{YTEbJaUbr?fj?jOmqsvnK2Ij zaoAUh?C0^Bux|#YRzoiaW^s^tn$Ak(hY(XQpumoy;64Y-`V2?GeML)_J5WX}tvw@Z z&-%6zaa1xQ?(Cq~=&|u&VMliVTu8{FM}@+PZv{EYof%89D9y%&LYTpsa=AVL@oWLN zdlV~CPO4CVt-VmtlN=hyqF-RpRsSU>He~?Nx{qI_Hb8AZ9ZUBStlLouC9L!K$!VB2 zDtT~4=bFVuDRD1hyyXy2nj?H6AWcDtD1@DW-4{OfG3xXMfQpkVpbGozx(wPW)p^>x zRPpsI+eg68<6;cn@nFiG;vmG%0E*Q-yzSe$o^rcS7Dvy?GF!4Zpf2B|i#xbF2>I?4 zr>~(?Pj}|bX&%`A*>-JAoTk66o@Ve80_-zXioS0)!u3_Aq(SQer(i=`-F32Xagdd3 zk2CFLle|jE>Wqju&3(fXe*Sp`k%KFbxxw2T$_V_usR>f8Xb!b=Nk3o{j>;e(xj-gv zPCLzCziwOzi^ia^9)P;laJWlTLWVy8j+Sq~;$uSOGlmdNMEn!kv}ebZ4tqQd9c?DV z-`UKdd%`?rfuD#ryj(yO@SncgcIW_Ytr-FBN_l?5Uv1EVZ=y|lc;YVF=$^bLzPI8Y zXyjR5TakhoB)d2_0Ut2)=#6lcX~1&B?J``q(v8ki^T za2}j%ZI?u$_MaRk9es4k!%o|yV{LhyWITrji1ju_$}wtc()~*gzVpC?sgpq^sWta) zKwiW_;1HqF1H~>G`Ya&w62V9CSbd)gVy<*+)}v3uwp(V}s)QcK=l+DRZoi%e%k|Yx z590dPZWDJNo%3A;Z4$VvGLLpB*HdYH@|U#-mrq=Mqh&+TfB53eM0L1Hq~n- z?3Mzz!~>5nwEaMdltYq&Gwlh)fhJ60gd`9~G^kV&UQ1lt^cwc469Pex#J( zOx{fmQ`g(_fgmY5Xl`ak<%FV?ru2_wry`r*-|$m=)9B zo!w4S=yS-uLtqGf#=ZpPoLDAa0zBl8Pkw(AKe-Kuf+)qC4`9%X4r4wDdEST5`!@Jh8-|##Yc>>wk4J)q0zl3hf_#!9}d=W(8tly*2q+ot#lUwYX&_0}9<{Y7({IO4* zKW^vr@O1F==zf$fX94K*Rm_+X#;~gqH~Z(DDeR5J&f;{OiZ5`loy#}TRVmmzeqff3 z6DP|U^c#cin8EAlXV1bTCc^!e2tk5&?knvfVdL+RS6i+2 zXcnD9;U3L{snCq8kP@*r!uS-5jwNBAK|}h#pi$a^;ccQfBo0VcVO^oQ9`m2^c^4iI zFY`V(ioXi>9W;O&g`$Rc^e~Jw`+fG!pxzO=zC+(3(76csN4W4eiJyN9ft*ZE!EXfov)5iiUoHdr4Jf0@4;IT|NA>b?tC<=~Y@`Me}k0hbnIgwifP%Jv2nQk_O zOp1;u7oU*gcW(xAd6gO1fiaguVQHV>u6Y66jO?_2VxQ@Zm`jf%7Ul97B3K7Ui1b1ehm}=J?z)K(4q~%~SMhbO5;Pma z_WBOEYigc9g-^6K&oOf^UH7WCXhfX@3*D^*XJ&@ywY9nC`|- z$mYROVIROn(9Tii)PR4$O!&u%ryf`e-Jwzy%gasKJsa+gD*WS{-uZWSB6wP2wmn z%IFq@O$NfUI(#b}!1+&ZoSRSmG-pWE@Dz`^#-W7sb`$+wsM+CUq>!E2p;fGHa3UWA zMZ|tF&k)mBlJpTj9C%w!E+pVHX<>gEzDx8hGR!@#zXNTDY4qK!ICd8XXK*R(#ghE` zy48{W3xtBOE?BxUu>-KV=`Rxk_{kriL}FQ=)T+(;BH6tkxX#q9viADz+!y(qozBJd_w)|E&59>60>6oX40joW zUj~x%qClXzc>}fQ!ThgUi@4jNWz{bRG5p|~i>u4*<&-H+j=|eI^j)OEWmcsZW0Kp~ zxt=UWr#Nt$emFK@M~nY&+hSeGHb1(i;ioAVJ5kEwwm5b?410iGsJwvvZrSkx&xmfU zGkVx$M?bmN{kx`r1cNmbE_xLEh%2%>*{ThRQ2C^|7&kuCQ3ruX}*=vzg z{qTqxdqH*+K<3)Vc&q+m*pDOn?al8UYdai;CdD~nduBcL&IHbq6(Voif6X;^2z{|q z;y06^_a?k&fY!!9uRrAA9DSbsy?_8t3*K4F8CxU#9hNVHFGkmPAcF4>OQN>4E}gu3uq-Q?A2f6P==6IWeFPCU(igS769%8$(%qYC;gABN;!eo@p69oDQ13FIVqYUn6z|$=HK?W{^ z&oDT~;2{M0!@bbirmX3QyZIe>V3B(jKZi|$6@47};ep*o2Bq#1WllOg8Ju7+&fp}29D@l2;l4{#moMD7GFP~G zK8xAJoy6P$uzaF3_W|*byHxM}&pO#y7V;QnGG0S+G=2!GHTDm2DM`|P5;u+EKW3cM zN#eNoNEr_MlQABhietlp|48E{CXl;%pW6@&rw(@?8H=Se=|Nl@luYkQ4`j0Gbb2J6 zMZ7Pa9PC4EC^Lu>!|4IU`_ldCtZ~W0{^c|2M^P@7$)&F#mVuSK=RdO!X@B3)z~CO# XOAU==hSSM(Dt$CPgf`;%O7i~#<1nK2 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/models.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/models.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..daa9740d8f836b2f3701efa3d9e83cee2d10fb3a GIT binary patch literal 1945 zcmbtU&2G~`5Z<+&pQcIwDlEyvbiNu)#TF;7IG#ZrWhIXZ6Bx{i6w^(1cRE?L@gC+hH8W`))4*8R^O|w89zz z@yW9AWfw_*LMB<0<1H3&vIzDWYdYXS0c8P-P(oRRGR&YXK?P<}mZ1tYlrt~~^C&B@ z0E;MRVF{K|R$&E^t)?q)RCF~`=zOUrl@Fa|f&)=!!I0S?nWS>JFCb1j%eZMvF z!*qP(hT3h>&n}+&?tvUsTwH;Tm}!wDNA{5P0 zvp-170?$Gt#4Pzn^}u+M461 zGB5x=b> z-3SBi+yTb^-*{XJgCcS77BI-pU0~c0jb((eb{iOXi-tV>cT!dm!ul;>kexe3BfcRT zR2L6#0fX#Z8fNERLr!4N;yA;uwe*6)zM-+!wMV>bPrArSD>yl6xWs`}G$hiwMq*y~ z`jPBO94(NyxSh8+m2q0^Nz+MSx}2%@A0g=?GRCXiv92376R_W qDm!KS;-g5T?x_1H#*Lh`x-u}?!3A@f^?c4f%VEEuU$Z%jX6--64W&!~ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d028906b2c3ac805b869b75a277c97c28347ce0 GIT binary patch literal 3981 zcmZu!&u<&Y72erhlFJoEQIcg#w&QG^D2574ikqY@j5LU0OR*D2aV@2e7j3sI&QMx% ze=svcNfaoc0CVWYNdABxdTjrI0zLH9OYc2yk3|nI`WNKX?+qo{4zk4j*qM26X5ahf zdynrG=j zYhewolX_V_tY?1c8#yuW1q=Cgbb?c3bmwpQk!<9n?YR?ft`sz?V~L`l{!q~2Pw zOD`?jy-t#fa=PE!i=X#^4furDk*Ywrys@bUc4tZlbj1lb59;@-TVB>HoC3$ zzG(NNeysPS;xNawUHT$d11Tb&$Z}y%=qSmRj?+}|=!Md`&z?Sd8r{9Ware{c@fTZL z54JvrsBnfOjx~#x(T9i%GkfV&HOS@2|OExdv zZjt1rTl58L5-Q!ahZDD5&*zZ(XOiI=e>){5|#4=>7KYuy^a- z&hcT^eh1H9zP_{GPx`B;2v~hD6UST~DH=2d*w8}eak@UxNvhV1f#%qRul0we7hyKh zQS>@FWDb>OS6S6@S&P}M!2)){IllC&GuO^!+T=}oDkxV_j934T4m@TlpKPw#sYfv~ zh8I;}Mk}w5GRt_@toh~`Z-fGmw2YbT>-wbkP3y$bes^l*jM<6%!t=SCSSRkt?l$!F z7%1ZG5BA8_&F;(x)DI^{5n5}!`pjiO%?tdT^$b=#y1afGD;*iQl#Twd zpPb#Uk{#}R$8LVdZevwl;jTwL0XXm)hsT69#vVx z_08i<$T|&?HB0Xy=wg%TqAHFOrIlQuIZ&-7FPQ~O%Z^SmQO<2|Jlvez?t6E3HloeX zcH|>7JQB?7m*D@n*hBtbMP^M4}+vq#g z?^U-g(1X==K@C5fPy=_iK^)u#HB^rOV(3Z*hx?fE~!9WQfhZ~Pe2l_W*eMu%OTND;> zBrTI&Tzt@0V?S0=CUlJJAD449fA$uoNiI}*;oeK@w+g*k4028}1I7TNXflBANoCM- z0VaAW`0NfN9O84VQ4Lg9%?3(*;HJgo&+&d92xxX1#rW?NcvT}`fbZ;)ty&aSHGD`^ zf8uca#Ql~HE$zUUE_a@>lZvi%E8XhYI;nDZRO!}wRe8)SXFW6P(HnP{KmlX>q&BLK zYKvCaA6tB`XUStTTUjFFaJk*{gLBp<0DhQc2~Z2DcBJ@fAoBJwC^~`RIz?zM^0o;2xCnEne;X8gx;SZUj78I*;;}5(8@QdB6@pXql)L?n>RFw-zl#0U$b%Z^oNJXpw{%I`-xPLs_FTlHH4Pz!Rn(hzv zKCay=Zf4Ry{{7Qp5X2H!TqXIQIpb-{6)dZp!G3Wl@E*JvBcsI!agxTnsaW$#Tr01#t~d zBw99>FFgX42}IR_Zs*0Ji6*57j_8{RvqqYxb%DGzQUc$~m8_EZ9h#`0JEUxhBQ0Z` z=gdR$9#(`i#(iykYC>D7&?Cm$#TOy<(o#~^Vd6*G*o6bnPHK2Y5*o^CTI_*9%i3Wq zb9_u$-#BUuoDO7I;bM2Nx6+Usw6a#1QB}^K6Y`n9atcN}dofU(gw1zodxBqCrGsJ{ zBzLE0Et^tg1^x$|qM)pij&{bsPoJ|d>7L{nzkx>e2$kh|%w?|aqqwYL`}PG^Wge^A zE#^C(ZDY29B+X@>-Nd+yQLJ)^ZGA-TDx_RyJ58)d%jB=2bL9pFS=u#Ogtl@id#2%BXOrp#JKHzK^BJ?K)3MRg}Pjd5S!C4Br zW}Iwb5MF+D#w4d}05>+CxbNBzEuaj25+_YIRWAO}qAUSzn54?U`3HB>Nat`;N+L=R z?l<@@tEa;hpCkpS^5Ux-aQp?M^j|h~=+4Pc96FK4brv x{2$PmiJ{&HlMLxYgh5OF2vx&I#xwcBdkwn*Pd5-l8}O+|t>Zer)4Ju&{2%U|OIQE^ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd0546dcc444948f1b633a7391cc7789d9b61e20 GIT binary patch literal 2615 zcma)8&2Aev5MJ)Cq}6I=EB;YpCn>gRgFrwmC5?mR5Ck=xKck6a*iMrOE!OK@N?vLI zLQ;+;$T?K$y^qjqpP;v1`wqMoJ>(U7>X0kBvfD!?a5x;2BXZ`OkGfMXn}7cN`***Z zit>jt^HD+n8XEl#gs=E0R3g+uNa$*)wp7_`Ee(1t)T3N0C+GAq9~D{!spmo?Dz=J| z*)rugAC@AkWl6mdmZQ1WoYakQKB}}TNWm5I6Zk8J7ovsMf}AtM#b~LuB=u6b993IY zSf_R`;!9)HTJbHv{84GG`g8s~^q2jLe*yX{{(`><{Z(JxRccG0;0{U+@p<=vCSjjp zCy3I7uqN2dCm8$NE}@vfsGRmX4#70(6A#mx%1xSLFK7ptP+m9!86>gTg^xX)G8j-8 zS$;s%&>c9b%MM|@@Z#`W{#=y#$~l8` z8g)LGCBm7w_(dTr@N<8WMoNMsm*K{dOB(GY^Z~35uh(GV?e@X(k-tvwId{E-LGSjR z_V9h=-GWaiZtOMEAYBV$%G@wqTaWP2r^i$nWrGtkOky`|06s&oyI#-j1aYUH4*0Ss zpak`D1|k>XI28CqQA&oYBU7^xxeTK-*w(=yvE2rR0lFFLs$-R08!3Qjz^>GEp`D=k zrnCa4$$ijtA2hI5S+1M+HC6zd0eDw|C3L8X;#d*L@0ugnjTF#IV@1?JlN&D{?`=HV z*xMKy+uuB0+iE^}IlS0R>hk|zR3TyFyn@thYX6ayf1U=+rU zQ;#Jv4fG;tO6EHgtFV=P4&o*>x&%T|Eo36u)CHugc^JtRr_mR;xByK?|05_O`XZhq z)I~Dh>fkB>L#(-OV72=y4slYS9G0b4at_duC$}?@P3j2RRua$URS6HcQ^-S^s zDJL3IhE-PX&iT2_!$=$Jg2{KGooFAlH%hF&k>gsvIh@~_;Am}IlG1SfI<=?RvNM}~ z<2t=z16OAJ(T_zyr*i>?tdTNYiOhi*-rJU7#bC7|KeN?*?x$>EATki^)^=jn%B z6LVjHsOjVeblD>$n8EP_kCCddA$%_Fd^IaR0hIF<_yBg$Dk&bI!MvJ6sUmS zQpqitKShOj??scS_zD!r7`!-8arI+SlM)$^l<$`$PSmkNs(=^hca?Y5*YKYJ>Pu_# z;#PBaZ{zv%$2;UIIH_sGhK?`H7K9T9F{V5xUcI!YW_Q+w@%$CbV%vn8FnI}{GG0+l zRDnBLh};!F@)%?gkF{lrhGWT#2H&%a%4RUsFxM_>VHkMK`KsG6er7127)emIXh;Q{WTyZ zu(ejsoND&Z39-bUB82F9#xI5=@dqK0h!T`5aV!%pBQ+CW@n#S~AKZ8lC4N7|55->( bDz;jxA)*URQh^3vU~$=Nre-V~6=U&l?uF8h literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09840a6e86107e8f144afcded6e44bb408af8b6f GIT binary patch literal 391 zcmYjN!Ab)$5KZf)2*sP{y~u80+gMuhuvWYX7Ssw`FH#8GWVVE6HzCQ^cE84(_$B^B zui{U5GFvD*@ZMu)9y81gyWQjOx6k=$3!yLcFMN(}JZ#4kM=yxCQiR*}yC}3WF0kM# z?Ua%>4xCy+DQZY4&4mO?$7d$V$4hXTb0#{p;~-QT$}kQZ!O_8u6Q($f^S*(MN7##& z8G|UCn|b37J>w+rGpQ^@IDrkYh^a#RU0ylF!C{m)H{B59N8H+-q_?x@r`dFRpVIVh z^6-I7+h4P%pDocwtTP8>of(oV$-!8{R>a9czSyk!$X?P5w%D!)!@Pbi*tw5oNoGU~ z-4msCnUuXz0X4T9+Z6YpqI6)&Op?k8Y02N8=%Nym_w{zyxhfQ|BwQag5B5O6C4GB* literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88d60b0618a601979e9606e2b940fb68d63c0256 GIT binary patch literal 4918 zcmcgw-E!N;72XBFUs06oI<=A}4&ufWaVkr8>^P~%b?e$5+Z~tAM4HOwxWz!gQUV16 z^e$*iH0jAy>7+M#hhC<=>J#*~?|@!*dXZPiRllO{Vd%73YUsNeCG3zb$N?(x;H|jW$4jtnR>KZmL3bOq8>}F5=JvD zcPp(5XTs`K#ljJ9)gCb4@(W)vzaSQm%vK%GMZbjSlBnZ($u~Axqx>CYvIb9=+#MB% z{X{rHw-?K#iFZZWO{5SWO&R}4S^BBpfC$#&K7)cB$}NA*+FXmQKt(O8Rq)Gx!HM3Z&3PsMOi(8`GyBA2|C9ynoKQbA6D8inQwimie*~y-p z*zwCq*>2?Hop5p6@7b=MU|}p>d1(9NT%;HNVp(-ANJ|?7)8Nrk+XCdv3Bfd7u}M zV=rTv#Mq9oJt^D-`pjWV>NMj>OxF7%6v_0F*lq6#aFLqTWaqZpi~FHZd(D>k_RBpH z+2SBbf@pWbj~J}#FK?J6w@4$i;cp=%_K$5V(|WZr!|JZy3fXnuX2@d-ZWYQ75~U4e z2a#6%4I{Z@ORi4@XlM6(Cq&-U7NNiprwbKhaTB&SjIS-L*~5m>=|Qn}%6=%Sa^J;~ z=7U%f686pfnuiv)y=DjP%t2aPd#VO_Y{|Y@vk_pqb7-RGHjd5XK{E9)R_3nFOw>#* zGP*a;O&ZPoQlH@_VF@3yBco#+G0uj_+5NJ-I7DHg(dQ#$i0_U$G(fGP30m+OveIa7 zHHv9L^^t~>*rsL238ElzoYW%ErNvB>)Y=aszhR}85@B1GF;!NGR6$TmDvqPG*m3^G zzJI>alfer_{>BSeZnWdj7gB9_`x{AkwY_uj!oRLQbw2TS4)?EKYY$#_y({?bMjKlj zy`XnFh*aW+;pOXHG4R!aqL=!DV(>xah8z7P2-ODJ#DUe;dxx?FH9o?nY9Nf)jb+m^ zioD1NKi)cCcGkz+^Ege!k47@)U0much|fE0$U3|OV|C0Us-i}7P`UMLWWV}Aj&8#U z#da*aZX!t-SuAq9!f~`!8eA^mtz4XtdOnG2j^kXzlQKZq9M!TZGpdn#S~Zddg_!m* z`Ht%no`vZtQsEUHw~liItCfx)Ugm@ICvB3?nu)N9WHJg#mUS`<$=9(1`G$^xw3O#> z!_s?CO>y9*g%@tv7pal#%&`UKgX7$sDmBkh*`yh3&#r~9n zpNT_zN4KH&ouKES%1qiw69K3z)4PzJ77;%xQPRZ2{QQtWYU~LvRRm$?3a|3PTPLk44K@>9p2OL?-AzWEQwF(@ukiK=t@3=P>V6kp6_Ch@z|Mkld7v>9sY z8IRQlVX|?bU(@)}MKjXj*zSk38WBs9e@d)QWoP|!W;g#ITsK&{{CfQtm#$p>_}cYP zZhZRL&zl~l0{v(lU+N+rrT_w87NMw9z7FO+ zSGpd;8&Et$;KXDSe=o6;GB7`Hxl-6@)PZkPe^7@CvTbj|V$H^p$EHb9oJ@FR3wo}% zkAs!1b+lKJaQ03N=AR$pJQ3+4jiv@9+a^GX{zrS8@W@v;rit<$0gmta>y$MKlS((* z6{#7DD6It8P7=qVO5gM1?heX>=I796oZJdsWNy0n`2L-HkD3phyASVtv6)((IEWgB z)by~_B1Kakq!k<${lJIW({dzUYV0K^@h8+)IULzDdgnOj1e&VK@a^Cv8!WlXJqOb1w<@B>Bu^) zlo-B2ikw5gFat+dTd9a$tFpPW~8~R}Y zb4F65&QMH2^}-;Lx>^uel~+L00`N*8)6$d8`%=chI5?(6aaz28|LLR6E%_czyg=lA zA_RRjvXSr5-A_Oo#SD^KGL94ZF}=P{gkVByh=UV;*Zuh~_@+oR2G1_TzXq;lqsGq} zbzU^^M^Nb9`Tov&34!yf1`6^6@R3wwGwwf literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/typing.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/typing.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b79a9a7ad4d3137d8bb6dcfadde266192d210cb9 GIT binary patch literal 1326 zcmZWp!EV$r5Zx9ePy`pQT;_%(T~xkYXk4k@c3I8)aZDmHjX#c z=7-VNHSq$$2iB2c5t@N?+cn&>3EIrb2NATSFm&-t8|rjdWZ6kObi)bd6l%T{!z7Go z2CqE@Ya3cJ^_~%i5x)?7vO+qc)~deYF)eE?>#TEjp%r4Jbxc)nWY88+It=kkiO5GZ zK&6=Zp1+6zE$}&H!%j5KF#eliY5PXejAKF81y&>ixgK@3k*A8JR4ggfn5cxWk&^OE z2NE)P61d6O+;;yjR2EE)4OELogc>4jo^b7gUCjb{hYa=TxdFT9o&XwpXFS#}!4sKN3&LyRkQwdJ?R&<2f~bNjRk@ZMB_Oh zGTW_M73TquQc}Lk**3~zqHq2a9=M!K+s3AXG`Ipdb|V9Z;}#+&vlvE$P<8r!_E~4i&<-s&_Hfy1`KWC@QkD8Hla@6+O6SPV-*4WB{~TO9qC4&yaC#1#giU z)I}zNZF`^z4I65BEwOeiWKA{0vWYm_9@~K2uhT{uM={siBVUW@xIs^mHi_!V*MDr9 z=wJrEt88k*UX~HABxT%pQ)Fj{ZBg_=H@^6{KW{(1`!wBu^>Y8s^!>-ltGH%0Cd*8D!cOGm%$_^%5o98#C zQ)T6JdVc3>%5Nig4Tnz}e%Z2fdI2TMg>WV6RqT8zPs`A3SF^K)+Vzj859Mq)-QKCb zEL(XW*W8pxC4|Ve!MW5l`EJW!lt1(FXL>FaDw9Ixs;;6N&Tl?hS>fs3cnWS}xW4%t DdyT`w literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/ui.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/ui.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1093062d8831ba4a63a4b3e137ceccd0fcc118c0 GIT binary patch literal 11777 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 QKQudEJY38duNBYyFQWckEdT%j literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/appdirs.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/appdirs.py new file mode 100644 index 0000000..fb26111 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/appdirs.py @@ -0,0 +1,268 @@ +""" +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 List + + +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/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/compat.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/compat.py new file mode 100644 index 0000000..845436e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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 + +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/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/deprecation.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/deprecation.py new file mode 100644 index 0000000..8c896f8 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/deprecation.py @@ -0,0 +1,93 @@ +""" +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 + + +DEPRECATION_MSG_PREFIX = "DEPRECATION: " + + +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_MSG_PREFIX + 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/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/encoding.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/encoding.py new file mode 100644 index 0000000..30139f2 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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 + +BOMS = [ + (codecs.BOM_UTF8, 'utf-8'), + (codecs.BOM_UTF16, 'utf-16'), + (codecs.BOM_UTF16_BE, 'utf-16-be'), + (codecs.BOM_UTF16_LE, 'utf-16-le'), + (codecs.BOM_UTF32, 'utf-32'), + (codecs.BOM_UTF32_BE, 'utf-32-be'), + (codecs.BOM_UTF32_LE, 'utf-32-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/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/filesystem.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/filesystem.py new file mode 100644 index 0000000..1e6b033 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/glibc.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/glibc.py new file mode 100644 index 0000000..5bea655 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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 + + +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/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/hashes.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/hashes.py new file mode 100644 index 0000000..a714206 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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 ( + Dict, List, BinaryIO, NoReturn, Iterator + ) + from pip._vendor.six import PY3 + if PY3: + from hashlib import _Hash + else: + from hashlib import _hash as _Hash + + +# 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/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/logging.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/logging.py new file mode 100644 index 0000000..a28e88c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/logging.py @@ -0,0 +1,371 @@ +from __future__ import absolute_import + +import contextlib +import errno +import logging +import logging.handlers +import os +import sys +from logging import Filter + +from pip._vendor.six import PY2 + +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.deprecation import DEPRECATION_MSG_PREFIX +from pip._internal.utils.misc import ensure_dir, subprocess_logger + +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 that obeys the indent_log() context manager. + + :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 get_message_start(self, formatted, levelno): + """ + Return the start of the formatted log message (not counting the + prefix to add to each line). + """ + if levelno < logging.WARNING: + return '' + if formatted.startswith(DEPRECATION_MSG_PREFIX): + # Then the message already has a prefix. We don't want it to + # look like "WARNING: DEPRECATION: ...." + return '' + if levelno < logging.ERROR: + return 'WARNING: ' + + return 'ERROR: ' + + 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) + message_start = self.get_message_start(formatted, record.levelno) + formatted = message_start + formatted + + 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(Filter): + + def __init__(self, level): + self.level = level + + def filter(self, record): + return record.levelno < self.level + + +class ExcludeLoggerFilter(Filter): + + """ + A logging Filter that excludes records from a logger (or its children). + """ + + def filter(self, record): + # The base Filter class allows only records from a logger (or its + # children). + return not super(ExcludeLoggerFilter, self).filter(record) + + +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", + } + handlers = ["console", "console_errors", "console_subprocess"] + ( + ["user_log"] if include_user_log else [] + ) + + logging.config.dictConfig({ + "version": 1, + "disable_existing_loggers": False, + "filters": { + "exclude_warnings": { + "()": "pip._internal.utils.logging.MaxLevelFilter", + "level": logging.WARNING, + }, + "restrict_to_subprocess": { + "()": "logging.Filter", + "name": subprocess_logger.name, + }, + "exclude_subprocess": { + "()": "pip._internal.utils.logging.ExcludeLoggerFilter", + "name": subprocess_logger.name, + }, + }, + "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_subprocess", "exclude_warnings"], + "formatter": "indent", + }, + "console_errors": { + "level": "WARNING", + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stderr"], + "filters": ["exclude_subprocess"], + "formatter": "indent", + }, + # A handler responsible for logging to the console messages + # from the "subprocessor" logger. + "console_subprocess": { + "level": level, + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stderr"], + "filters": ["restrict_to_subprocess"], + "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": handlers, + }, + "loggers": { + "pip._vendor": { + "level": vendored_log_level + } + }, + }) + + return level_number diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/misc.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/misc.py new file mode 100644 index 0000000..ca7a529 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/misc.py @@ -0,0 +1,1011 @@ +from __future__ import absolute_import + +import contextlib +import errno +import io +# 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, shlex_quote +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 ( + Optional, Tuple, Iterable, List, Match, Union, Any, Mapping, Text, + AnyStr, Container + ) + from pip._vendor.pkg_resources import Distribution + from pip._internal.models.link import Link + from pip._internal.utils.ui import SpinnerInterface + + +__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__) +subprocess_logger = std_logging.getLogger('pip.subprocessor') + +LOG_DIVIDER = '----------------------------------------' + +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 format_command_args(args): + # type: (List[str]) -> str + """ + Format command arguments for display. + """ + return ' '.join(shlex_quote(arg) for arg in args) + + +def call_subprocess( + cmd, # type: List[str] + show_stdout=False, # 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: + show_stdout: if true, use INFO to log the subprocess's stderr and + stdout streams. Otherwise, use DEBUG. Defaults to False. + 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 = [] + # Most places in pip use show_stdout=False. What this means is-- + # + # - We connect the child's output (combined stderr and stdout) to a + # single pipe, which we read. + # - We log this output to stderr at DEBUG level as it is received. + # - If DEBUG logging isn't enabled (e.g. if --verbose logging wasn't + # requested), then we show a spinner so the user can still see the + # subprocess is in progress. + # - If the subprocess exits with an error, we log the output to stderr + # at ERROR level if it hasn't already been displayed to the console + # (e.g. if --verbose logging wasn't enabled). This way we don't log + # the output to the console twice. + # + # If show_stdout=True, then the above is still done, but with DEBUG + # replaced by INFO. + if show_stdout: + # Then log the subprocess output at INFO level. + log_subprocess = subprocess_logger.info + used_level = std_logging.INFO + else: + # Then log the subprocess output using DEBUG. This also ensures + # it will be logged to the log file (aka user_log), if enabled. + log_subprocess = subprocess_logger.debug + used_level = std_logging.DEBUG + + # Whether the subprocess will be visible in the console. + showing_subprocess = subprocess_logger.getEffectiveLevel() <= used_level + + # Only use the spinner if we're not showing the subprocess output + # and we have a spinner. + use_spinner = not showing_subprocess and spinner is not None + + if command_desc is None: + command_desc = format_command_args(cmd) + + log_subprocess("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=subprocess.PIPE, cwd=cwd, env=env, + ) + proc.stdin.close() + except Exception as exc: + subprocess_logger.critical( + "Error %s while executing command %s", exc, command_desc, + ) + raise + all_output = [] + while True: + line = console_to_str(proc.stdout.readline()) + if not line: + break + line = line.rstrip() + all_output.append(line + '\n') + + # Show the line immediately. + log_subprocess(line) + # Update the spinner. + if use_spinner: + spinner.spin() + try: + proc.wait() + finally: + if proc.stdout: + proc.stdout.close() + proc_had_error = ( + proc.returncode and proc.returncode not in extra_ok_returncodes + ) + if use_spinner: + if proc_had_error: + spinner.finish("error") + else: + spinner.finish("done") + if proc_had_error: + if on_returncode == 'raise': + if not showing_subprocess: + # Then the subprocess streams haven't been logged to the + # console yet. + subprocess_logger.error( + 'Complete output from command %s:', command_desc, + ) + # The all_output value already ends in a newline. + subprocess_logger.error(''.join(all_output) + LOG_DIVIDER) + raise InstallationError( + 'Command "%s" failed with error code %s in %s' + % (command_desc, proc.returncode, cwd)) + elif on_returncode == 'warn': + subprocess_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)) + return ''.join(all_output) + + +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 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/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/models.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/models.py new file mode 100644 index 0000000..d5cb80a --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/outdated.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/outdated.py new file mode 100644 index 0000000..3b58cd5 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/outdated.py @@ -0,0 +1,162 @@ +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 + from typing import Any, Dict + from pip._internal.download import PipSession + + +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, + ) + candidate = finder.find_candidates("pip").get_best() + if candidate is None: + return + pypi_version = str(candidate.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/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/packaging.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/packaging.py new file mode 100644 index 0000000..449f3fd --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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 + from email.message import Message + from pip._vendor.pkg_resources import Distribution + + +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/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/setuptools_build.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/setuptools_build.py new file mode 100644 index 0000000..03973e9 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/setuptools_build.py @@ -0,0 +1,8 @@ +# Shim to wrap setup.py invocation with setuptools +SETUPTOOLS_SHIM = ( + "import setuptools, tokenize;__file__=%r;" + "f=getattr(tokenize, 'open', open)(__file__);" + "code=f.read().replace('\\r\\n', '\\n');" + "f.close();" + "exec(compile(code, __file__, 'exec'))" +) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/temp_dir.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/temp_dir.py new file mode 100644 index 0000000..2c81ad5 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/typing.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/typing.py new file mode 100644 index 0000000..10170ce --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/typing.py @@ -0,0 +1,29 @@ +"""For neatly implementing static typing in pip. + +`mypy` - the static type analysis tool we use - uses the `typing` module, which +provides core functionality fundamental to mypy's functioning. + +Generally, `typing` would be imported at runtime and used in that fashion - +it acts as a no-op at runtime and does not have any run-time overhead by +design. + +As it turns out, `typing` is not vendorable - it uses separate sources for +Python 2/Python 3. Thus, this codebase can not expect it to be present. +To work around this, mypy allows the typing import to be behind a False-y +optional to prevent it from running at runtime and type-comments can be used +to remove the need for the types to be accessible directly during runtime. + +This module provides the False-y guard in a nicely named fashion so that a +curious maintainer can reach here to read this. + +In pip, all static-typing related imports should be guarded as follows: + + from pip._internal.utils.typing import MYPY_CHECK_RUNNING + + if MYPY_CHECK_RUNNING: + from typing import ... + +Ref: https://github.com/python/mypy/issues/3216 +""" + +MYPY_CHECK_RUNNING = False diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/ui.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/ui.py new file mode 100644 index 0000000..0902ce7 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/utils/ui.py @@ -0,0 +1,424 @@ +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 import HIDE_CURSOR, SHOW_CURSOR +from pip._vendor.progress.bar import Bar, FillingCirclesBar, IncrementalBar +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 + +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 needs 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 DownloadFillingCirclesBar(BaseDownloadProgressBar, # type: ignore + FillingCirclesBar): + pass + + +class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar, # type: ignore + BlueEmojiBar): + pass + + +class DownloadProgressSpinner(WindowsMixin, InterruptibleMixin, + DownloadProgressMixin, 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/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/__init__.py new file mode 100644 index 0000000..6fca079 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/__init__.py @@ -0,0 +1,604 @@ +"""Handles all VCS (version control) support""" +from __future__ import absolute_import + +import errno +import logging +import os +import shutil +import sys + +from pip._vendor import pkg_resources +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.exceptions import BadCommand +from pip._internal.utils.misc import ( + ask_path_exists, backup_dir, call_subprocess, display_path, rmtree, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Dict, Iterable, List, Mapping, Optional, Text, Tuple, Type + ) + from pip._internal.utils.ui import SpinnerInterface + + AuthInfo = Tuple[Optional[str], Optional[str]] + +__all__ = ['vcs'] + + +logger = logging.getLogger(__name__) + + +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 + + +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, + vc_class, # type: Type[VersionControl] + rev=None, # type: Optional[str] + extra_args=None, # type: Optional[List[str]] + ): + # type: (...) -> None + """ + Args: + vc_class: a VersionControl subclass. + 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.vc_class = vc_class + + def __repr__(self): + return '<RevOptions {}: rev={!r}>'.format(self.vc_class.name, self.rev) + + @property + def arg_rev(self): + # type: () -> Optional[str] + if self.rev is None: + return self.vc_class.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.vc_class.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.vc_class.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] + + @classmethod + def should_add_vcs_url_prefix(cls, remote_url): + """ + Return whether the vcs prefix (e.g. "git+") should be added to a + repository's remote url when used in a requirement. + """ + return not remote_url.lower().startswith('{}:'.format(cls.name)) + + @classmethod + def get_subdirectory(cls, repo_dir): + """ + Return the path to setup.py, relative to the repo root. + """ + return None + + @classmethod + def get_requirement_revision(cls, repo_dir): + """ + Return the revision string that should be used in a requirement. + """ + return cls.get_revision(repo_dir) + + @classmethod + def get_src_requirement(cls, repo_dir, project_name): + """ + Return the requirement string to use to redownload the files + currently at the given repository directory. + + Args: + project_name: the (unescaped) project name. + + The return value has a form similar to the following: + + {repository_url}@{revision}#egg={project_name} + """ + repo_url = cls.get_remote_url(repo_dir) + if repo_url is None: + return None + + if cls.should_add_vcs_url_prefix(repo_url): + repo_url = '{}+{}'.format(cls.name, repo_url) + + revision = cls.get_requirement_revision(repo_dir) + subdir = cls.get_subdirectory(repo_dir) + req = make_vcs_requirement_url(repo_url, revision, project_name, + subdir=subdir) + + return req + + def __init__(self, url=None, *args, **kwargs): + self.url = url + super(VersionControl, self).__init__(*args, **kwargs) + + @staticmethod + def get_base_rev_args(rev): + """ + Return the base revision arguments for a vcs command. + + Args: + rev: the name of a revision to install. Cannot be None. + """ + raise NotImplementedError + + @classmethod + def make_rev_options(cls, 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(cls, 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 + + @classmethod + def get_netloc_and_auth(cls, 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) + + @classmethod + def get_url_rev_and_auth(cls, 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 = cls.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 + + @staticmethod + def make_rev_args(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 + + @staticmethod + def normalize_url(url): + # type: (str) -> str + """ + Normalize a URL for comparison by unquoting it and removing any + trailing slash. + """ + return urllib_parse.unquote(url).rstrip('/') + + @classmethod + def compare_urls(cls, url1, url2): + # type: (str, str) -> bool + """ + Compare two repo URLs for identity, ignoring incidental differences. + """ + return (cls.normalize_url(url1) == cls.normalize_url(url2)) + + @classmethod + def fetch_new(cls, 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 + + @classmethod + def is_commit_id_equal(cls, 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_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/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e6778d4562ed491e75e423144270ceedd9e391e GIT binary patch literal 17061 zcmc&*NpKridTw-MBM4H|VoH=`yCqvTVM(Mto-K;TV_ROviOq2&&4zdaHPH>SNdOJK zZcrjjrly8YCYc&fWt*8y_N`KJB~{szN)E{}l^k+Na_ZcY%3*Ff`;vU$|GFCukd~cO zK;ohMZT;T={^fiB|N7avx!QmI)<3*e`ccF9Pb2p!;`(`f!%r6s!!??QTX4;8p=UPD z0<W#E)wJZd*euF#sacZWa<eSIm1YIM#cs7X)0~kurEaY^+pNoVxjWaJZ_dkgrF*Qm z&|K&pZyxWRXrAbuY@Y0$YMzp^YWJbuVso)zc#G=a(BDk=bni^_OmC^V)H~Ze+dJ1h z*E`=l-+Q?EaPN`kBfUqPkM``QEp2Pv3%!fYi)j0(_ptZalA+U%xnwjScV{;W%}ZW! z>k044gF<uJU3Ba2+&hJ4<5k0*caObexW~Mw4y@*7+%LGtaev&qg8QquKjEIl{YklB z@m3Cu<|=Yexep=tA<2E(wQd=W)1$`coW9%jLfh$f?JwTAWiRh|D)fWC-46PZ3c3wD z91aG7ihe-qHwy7FXFUwM!^ms-J?5_=Z*H)?(NbO*3{~3;kx?2rD)ewsd(m-k1ic=f z(kP*AxZN5!(PqoL?}t$s*Vdi(_HfX0eH9;TV+^fuxIRz;dI{sY>xYA`vnws)vg$?3 zW1lD9_{y7KY2EnT%Qt?sb@K~rYp<=n+L(#07y7$#@g=_<#nsm$PdV#dFD|~0$HbL4 zoWa2FZ^YHl4<gLX>Bhy|-u);p-5w5D>-O$|9WUHMt-hyT>!W?gX?wA?(+=C@HGazY z^7;n8;R=$-*edLq2Zeob*p|6x>=pKk2iAUR&r(nAm0S~f)<NM@269TEwl(_OnvKs* zFB+=89c_B{7jC|8cLHTQLVM-i9s0`adHramCRJZh8{sv%vTfxJg4R%VuSrW(3nEXN zA@7QP&yO~3r@w3WJ<s)ADHtfP<KMTJy_Jm>`{ITlUB1{@NqPg3x4d@L>N`D8_qaUl zdtuudcy7Z^N^O?v7Nh#x`_I3<|CqP2@tL>xM+;A2p|EP`B2c@?X;{hvN#fZkXm$Lq z$Chy!bL%-#qa0V$(Z`nZcH(;e@o`!A6)&Lk)<g*^-+j+ekD}-IgVllZcbv#u-Eq`v zC+NE1)YbO(YSewEvwnZa{doAP)+gHQyW7t^+Zo;KwV%dkqrZB4b>I)K`u#8he_j1} z&l|bn{g9dRZTVbn@Wd+CdbNdHKWepB2D|Z@p0n+>kPFt%7KSTufecVXVpMB|`9iTU zZz|@snU#K^m$Zhe<H9qV1!yVLEr1Wq_~cDly|o~EB^dVImz4_CTEmK~Em@CNE3UO# zy}%uIJzUpYt-C{~ONzEyLW^8tqjz-?$uszdCX#AF?k5JrrFoteUO_S*3{>PX*K&(c zD@C{Dmfta&C9mvO-0C|9lupH+acjt{y0dN_zccQfJCEO*YhoG;aqXtJqa`XF{f_X} z%Y86VIP7ATpi;<$SHpqV_B(zX{JZ0eW{CnjS&b`DJ3)VA%)DqI{UqgfAo3a}((oGB zun*l}2OS83AKLA%6NYxU84SCwz3$o25O}m}JE84&Y`@nVM$`kEh1W7krWBJ@H%Jl^ zZx6O&yQ=CN#=f;@?HMg&5Axh9K%$LSvTCFE649~kyjW7AciJr($u-Vd>(3ineL{P# zOHnF!tPV<Ok>ir;xp+sBC*KC@N;xfu`T!5<Lani(<c_Jt&iNrP)y6H<SxhmmrlV{W z<6`J_J8Bu(Ql_5d6{SokHm=BwS{9zeoo4sBYN2SB3+2KH9GouwN?NZ?mgk4R7QRB> z6S#nSH1?n@sU)|o19FeKHd?wq?!<n3{~Af~nYS;f{pT7*bq393fN_yjl3_Lqs=@5T z1BG@`t=3HxiU=6f1Jvac1I*T+Pr|T(BESJB^e}Hp4u)9(DK&{mtoWGgb(~>0;zB?x z?0mq8DoODdI3Su0!>Sdk=IF$D!YfIYY)m9rMzp7K16~C8Z5jLK9yoA&MqMN~3K3y* zU{!=Ww=8`{l8&xt9GbH+6GGV5w%EqghqN;gEzL4ynxdjr(^Nmc;YF==C-gW?;X7dx zP=iYl7tuke2{W}C6&L^(eihY1>OP}X1jkeh3x(Pw1(J#x1;{qpsx0D$vkz<3nXsio ziv#LUYb`cL$L(e45sXdi6d0g}smH_h{D5_-;gJcb*g`G6G+^kWIeI9!G~-%rj)x!q zX11R!&9Pxj92HjQU190bcQRtW0n=eS08xY8RKVLqr9g45`=G_H*z3b6QGKx5_c)nE z(Q!#$$eDiLqx1nvgCK%{g8c;RwCv-B1u-b!SUTb11u<*ru9aw4U21CCqN+F~VA29z z-$kJou<C>cNXsGBYmHg;82fmf$t5IlrPXqSHcZ!3%(}v?Dy;m#Q_-&GINC1tER#<# z8FQ3e+01(a2@AsoB-Ki>WE5%(RjXdD&Q&W?+D1Y45uw9f_>)LdgXbHvCopO9Xzn)3 z&EhwVPC*P_75f8i?#f<88$6i6Dz3%o;d%zw$J_-mjWzeUdjh6#);%k@y3nixp`S+1 zoO{My!teYyz%b2Y;Ma3;?ThX3mWI)>6^5I!1uzzyn;WsUK2p%eooIl9o&JO@kl&~g z!fQx~H52t&C>T*O;x5NHz?!0@lq)Gml|AFY+^QZx54#5S!dg5x485?`QO*X19%#7^ z7}NFF0j+`4<5?;0dr>!N$7L7}ukXf{u)PT^8pai<0w;=;`Ygr~m#`o3l=?KTWkC~B z1ALxoX)Bn56g#c*HC%*MBt~)GtOGHPPL2t3wE3VexWQ(GSz6W(I2Y(+6Ax0}1}vc3 z6(a@s)@mIs@#=GE{!R8Hf_&(~(sY98nF5+etB8*V*$;q*^uw*VNZYGkMQL2#ak@k9 zcaAno+}nVV;k()Mt%-@J<wrlCe2yhH-;wFRq(@+_WtBNla>p(9PK~sIieIhKDr^}) zZ{985(t?DAsQ{?ch=O$H%F}Trd2mk7Y_xyBcAZm$g%~{d9d^nml#S7oxwT3<3RkX! zQ=D%294^u}AOm*kAEbJ#Y13awyEZ1Nk(Or@<mC7jHlQ}4LA-yK%<z)&)diTv0=HjS z9SFqT`j@c%O4dlmp<YB2#m0%vl54fb+_8eOaU0Ld##3|q_mH7^)hZV1Fj}L<-28JD zCrm>&PU35DO~EZ3nBn;dyyJ45z&u(Qab3g=O4}9nq8N`7bFLexS#~X6r!^bJHFX)i zjTUb>{eBR^0FdWBC0n~o;pptmBqQ1FC98VPz7#epab?p9DYS998*FTNDz4mfR3DpQ zt)1DkX5y0Ttq(U~JjJeC?QS?t9_-!plYf)65tDA}eNP<}nqcX)=31K+;fKGOOkKwf zf%TTLT~?>~yJvpJ=szx$fTSHTe?{^^Ih52QYYUreu5hBtMo%Z?81~bL0r<BaXfV4U zBpU)4LxI*C{*Kpglw_jnNAPf=sG`WI+elK*_+nNx#Tm8nQ~m&TGz!M#IsH07Lyk4Z zH8alO+)Mc0VAD?`x&Jih#(9E+FA~^6abtF>uIC9lm|LX-s{p#(5}uZwmNoib1}t*G zE`rx01s79Z8#`eJ?t(hpV%kn*3pKKiD8O`vT(QMHu+t7#G~^Sd)nez%Pp;Bgvl<1m zH-><;w}WByWFzZj^vFvdShDB$vG>}<GcJWTZ3%gljJVb)kBJ{2Pkc&YD}A_L3c_Sr znG{`C)AG22O$&!I&65k$WBpUoSa`Dxpb5YUz+D)f%Pr7!i)@+5o*9eUxPcfN2PwWT zfF;jk*`QaKplpQ=#R`?W!95s4T7pD+G<Qw0&}{Cxe}}qSxtLW9ur{e&auo$gEldF^ zO-VA7MpCqG>QhXpch#FrevHYNn0%SZTTFfeNj#Sr=e7qYTh5CBtxcV!Y$i17d-#S# z-`MLF7R-7LAghGGYIUYIQ=OAKZ4_r8G3>Yt*I=|$sO1(2wdi_nmO4hWjBmv?0jFlf z-$3s|4cFpx!1XMyQ?ElE*8;?lKj;3C05tj^W}5Tfu?&nYpw=~kW00Tbaoh<Y!}SUG zq<abg>?HCYau)@zox=5L_l#UWgkF~1vvR%Yo^#Km?rG#b>^>rSXHfT1*Ou!gTwic6 z%Jo_IG52xQJ?CC>pTO^Vls)M#OWDJ2!+i>QkGPlJEBJjBWmnx5DYJ3C>OL*k7jXT< z?z8U4-{Gh);_egfC#B>uTz|^_v|K+f(D4$i+4XpS(x0F{21>6@ur9TXXc%sMH0y4` z{-lubpimbOIQn)bwTTY7x9MTap!W?Be>nXPy9;x^700Dt5t}Y2>xfRh(5DCR$q@EQ zJdyyGHhS(;54hOu*bYiE_t|(?GP1Dc$Ci`(#JC2>j*3D$G4;-$_6br&#oVmvp6Pj; zRs&1g_0z)G#8HPTa3FFT|B99x^p!`;lQdlUz(x~v%^)aoxOUu)UdyJQ)5Fw}q)Q0D z?f{O%E0{1mV6Z*R<*tl$vQ-e|Hf3uvm1K&EdlV38dV-?o@~+l@&*oJcJvucnDv*5L ziRok-E=ANdJOoUmn@3Fw`$N662G|8^(As_MX#0@G1?a4EG-)r%JQWqk^c2tNiW!S! zjs7Dy)hCabYL2b4HW}`ypfNXrA{k^OjVj=*hl5X?eT!UEQS5Nis}*tA!#f3+y@@&o za2g1-FKA7!N>LfE!6NWW$+g}s?w9w<AYakB0Y*8Rg4vYpl!yVPf?T0IH@MgD1`Z?& z3__22n01nP3c9<r+AJ2!EnK9f%?77v&-()$26;#Nhk5w3N8c81mH32gZfw9vNHG2Q zcIfx~t^<9cnHnB=SU~W`H65#fk3v3gkF^3t7Eyzg3zFzTeqj6Alh;P2xA!l@k5f?R zv0Q+#^O`ZJRYdmJkv-N9s>55C$pxt|%0hG4Ip!`Qp<rn~mQK|pESNITCq-;j8$6UP z7=vBmDI~@maYT`LS72Y2ZoG>}Fk?8`K_+_XCjJ<E<iv<|TfqAfa4@#%7Wm2fb|JyH z02amAqM~~lRn;9PPa%Px6wl`tGw2+Q%iF;78{B(}`Ib4^EM@f~STf|34f<+NPYw4- ze{H7iXwD<!>#!i;ZgcegY=LqbkA6Y0W1=B24(&@!LRqvWiJ$QS?1|=+{w!zQBRDLH z0Ib+{g7@LwUkmz)E1!(Uz~f1TP+sdHhDW!CrvoV<$q`O0wTgLFNf#<YqdJ;$)F<FK z=kLr^iG}(Zj8EMHgzE77F^X!Aetnuq4uX8Ce?0TYWtBeEwRbcrvi7$2`+wAE00<)f zzk;~QfU&6#HI0}*B@gQ3$UBh{s&>fAOuG*!SUs~cPoS5?X9YF-mbp)*ijA=36%Pu7 z$D<Nsr(%J2b5pYkDel{8l-Z_rMTm#^Ks!r=aD{m*p*OgaZwFQM?8j`d$V6=yF+<N@ z?)vb@wy(XV!-nGx3__D;5XMFJ2oy5t`jNCy4#p3coHvMz>jA>xMWI?;q;iW(QYS7( zj(-S}oND=cf769RN#W5Wq^AgE1s;XRrUmkd78zAZQMA^EY)Uxa&F25|ea7N5u#uRF z#C$-Xq)OZM!pQH-#?MYSSy?AO&I*8luses1la4TB_lIB?f@^&p*~R{GY_=efs*91P zyP+nor<jY*MGka1<F67n(GwA~6<uRO`Y3^7$T@#FSIiFm?UvI7akA0BNmu4H1rT5d zG}WF>L>sXYR^#Y9o#ncS<bh?*`pSnThd_6^`946U>Atj93zWYBLU;34o6&w<XAFaF zTf13xt1-v$XaGj83x)AXdxC*6RL>3NHlv~V?>Ro#FAWFW8m{l8=Q$))ig^aeQND}# zLr6mo9&s?mZ0fnG+HI%Ls45Kh4jQ=jj_=42u3iPP#HA=Cy?S+kFzmfRxoIde*Be|` z067w{Rl#rrNEvg$<e=GKfuAP8t;(XLkX@0~SA8w)m~+-uIBfHTL-GhL=G4O2y&;04 zP!zk|b)-)jV-sz^5I$W_*<m@I#T957J%L7cK!OGa;S6EmL}$ij-4X{D#927a+=3)@ zl@?g7#SyM%oPPXB+%Q!=6Z;u(dWK)$!3`BBap+qms?z=9erX>Enf6S05}%6TWdxEy z=|SP^^dZTSrvn5!mKZ*SzY)mQJTRe#t^JBy+^@Q&y&@bNoxLLbj=-~0hI~AwLPP?b zi@kZL1O&_=S9Pz_p{c7Raemt050bY;mJUf9)|@*d4I0Lpn=+X#Wzsgs*yB}$7L)c@ z><?MD_Y0RtJGTO*uoGiAnR4MkGP=}RiL(@)t=PB0iCT}b%5@0VbC<7!*`uHxbf3Gn zx_TYeo=Y5Lh|XNzjG_Uud%Kj=RphL`vHQYcActb)>Ic-+Yws7HmwkGps-DMvTtzox zS`Y|g#6Zq_2$DrKg(gSsvRYXsl~8@ym+QuiHr9gs?xT{r$E45drMp895s)III`Iry z8PS~Z=%DN=VqA2~eNx7nFOoIsG%#jP0pyy1xm9ZcF7Kj5Yfl|ER7draaqNVlqOIGY z-=Q#iBa`49g3Q6Ai~0~lh9WN}Oh73P)?s4%%Q>Oc@@Rsli3UO}F_GPAah%JL3X$@U zXM$K7ou4u}6BV-w(b#YvVtE*YOSh13S^EXSGZq92f+(9v2n;rkWn9Cpy9d#H*W9l_ zbSh%2%+a@wA_FY~1t3Qb9lbq*22#=QXWfJW4v(~f#6!SAF{%y799bQ1h%PV>)>{N7 zjq~QHm_kBJ{S@Y<eufEgA2@cr&kz(%)uVoz$v2n~FvhdwqBMAX)NU%}w4}~DNnb-t z1HRcRVg~a^@1dreWsx8XRR$~>7ZY6wA0k8V0wK+jpV4KFXU@9*$O9!vU)n+jwH)P# zIM=woYY+Q(hXG*Fh7B{LF+mR&4)-`fm-U15Hh!0xAuQ+S*kZq5ScN@!9>a($x+ffT zQ{3SXKvt2|DVogn(;-m?gNzX?hZu39;?WR@yV8^q<rg4&n{cQw`eHWr8!}&@p?h>S z!1)A1ghC0}@qXk-P>ucuo+d=-w<Q-~#q~QK52qAx#%era%<9{CXlewDn8PzM(~nI{ zTwT*yw(H^jY@TKK;U_U(zFwO$#t(nF)FN+FNcX?9slDPw!~vNlu{$d0$$bj8F*R-f zDI6N%$YC+)c%Xu;qmGY7vpdqA^g+ll24FcGG`(LVh}L*5^TSYHbyt(UAb(6qImD3) z4v%pi68mx83{0mR4?a|L*Uy4R)0Cf)hqr)ezm}1`Haas!_N>xJqWRc2a|@1H5Ivn5 z-BNe%a6otNaN>giXDE4b=MMPn&YcI4E~hy@Isrr_F>d_9^DonP+}`|FHu=h-eTA;^ zk!JqQj7h#QaB-jzdI2XDakkLiy(%Y{DK;Wkm^7)P9dvi@<fixkLx!P@_d5?DgRU{5 zTRuqW{wO0uV!87X13v-vutCYeCJ1#83Kd>7oD9g3g`wC7u*6uJ#=@6(a1v|k4?7~) zB;HirZ(5iMOyb`VevvTulr}zr-L@WT%XeEc+TY0NH8Z*}B{PR>X8>UWqyIDd5Pi(} zZsPEWfXcNWIb>8Dv3_D}#&^Z{Y;BbhW~7H1Kmk7Jf5BB%`<ihzvquMsss1dgZO!5o zfw5KJnmaI}dDcJ)oP5YThCZ#W1)MhcJ=8nyT1h!-<1o6eb7K5lMATUe4j4TK+?~W; zz}R9mzMix#9h6YIxL@v{k@8uzPinA7_so7-^5-Pi<b0xs+<AbWV@t-Of!~EC_%;E5 zD(>-Z^XCfc@n~`Dw7bNoB5y|WzASy5(9h(lhv*DvCbOERRK=}Hn_r2Rgg#Yidomes zRYq`j>m0^eWltE_;T|f|!#|<raW_9(6Li9S(dPV^PU8JMJNl<g0_5y5-jM*9&=N!= z<GH?^FSc=3Te}_xIP>Fdh#kTE5aN_1;-LM>x|(FL4|fkfSU@<Adz(JhbLKT2k1}Ua zMvY5!+%QD1-@ed0G&=a(*eoHQAaH3J$45pBqW7rfQ2SDd(<YDK+V<roitMySq7Xrj zt5I;3YI0@th*Y0=igwx&h+PWbzqA}SL{VcC=QjvI;D%Vf*YF4YU2n+SAa+~`<ANU- z?!|@m(bF%bu?~(UeQ16Lu<JY@<LI%jynpTiU5_r`hPuXEC4FxBaulN$NB=n$gh?O! z65S)H<p!U%QLLyb)!Rtof-{<Z$?JLoBT@C_ix@izHXN`Yv_a-+Z8$SJ>g-G5dqwrj z?CJYVeuc@eB7xtGr;pTcAbHO^T=;7&{7oc3_#b>4536r7LjY%wSF$UFgAJ#ILiLNx zc@{~08X9aoExu}_Lq}?ZReqkyEhapL5znxuyo3;!028~OqLNeJWy1YHTonHh&xgqg z8hzw}jtV$Sci~9I<0D0^uPV$ehnvI5$NM$_*q-_&WMNBtggw`LisWo=T$f3JY{biP z8C&w+0I&5xq6Tm{dU2H^!I@0Mpt9aDzDIrjH9X9i!3hSwqLG}psAF$yVhe&Z>?U8_ zFmZ*`$>surJ4KWCMcyL^krTORPSrB9(z3b8KoGv%%CKh%5MfIr&#};t^ipQuJRvj* zeD(M;3&LGZwzIj28*z{8GeM^!@#u(Vl31kH*a$b=%~Z*at_MyA%cV9r_36sCX2OdL zO6Isb>tUJupVXxrHXyoS-L#ji)*22`Wjv;S8w1sA{KvR@pu2b2r$z)hlf%~KI;eJt zD!SGLRVZmU@Rj2-xp>rfvoYno37i}J0WN`QHuiBv$LA*bh<9#yJSqjXX=F7(RjQLs z2XO-jBxC$B>x)mqDW;CUF+>PAr(MUsZ;7rnNuo*MA@a6BN^r#yfqHm~HzvcKABh@A zhVD~dNbuMgs7aK0GNznT>;E<r592?Z&7^c_d#7ijJ$<+15;oGI*QO%jhsxnNzOuRz zE?{|$4R{$(<H*%6&P-}6Ob_H<c@Kw~;ZUi<oicL^JH*J^uBm>(*vBiIqo?*}wu(^^ zrzuVKR#X;@B)xUaMR*6kUg(=&H@;+i#lV>(Yk%e^XTEIo%`f8)yXE5O53@zRIpir7 z99a`Tw0=V(D@;A>h<*<kk+<(DyiEw7wF7rHWM}HFMeq|n>aMF1aQZ?MQ7YGi(nj2> zZLgfDV?|mS7$6P-X35!s=Yj7nWrIMNYA)zQjWaUe2H1#C>DPOL?OY~anM|J1f`V+v zbGnY#-|<z@$02a&&Zw2%Rzm%@<LE{bVeR;wPBO?#%DxJ-XYU3>Eegm;VzQJo)C813 zp|an6;r8b~yVj^^Q^0+@`YR-H<@2}1(HWNzZ|Dbc`Q^3Gzr1!^F_hY<>2R9W?z!<S zj+NYNg^>$ye{8kyx$4i@$)7X%3nqWb<gby$g+m7cXVtJTa2`XtK$c{P-#Af+`lU-# z|A|A>VxDQ9Fh^&n1TWXcgw$n0U%s<I%?y9Lyzl{@w1|Ysds}5m>FNWg9_Wy!IeI-? zyQ#gCGv3=sY*Txu#|C;_JeJAP!#8;Lk~l&GIQq1JGKkeyR#xD(%PhEh9b?r?F{!ZQ z;uf~)=|LP~g=zitJIH&LB&0bv%4HtZe`1PMAAlt$$c8Soa8uGL+=T3OP&uE3R?p}n zQ=$gO>ukwcRMH|jBiaR*32>Hx*O(Nq;RPCmxnTALm?1iq#IxYn5<Hil2C%~(LdK9& z7bjHPJn5P}x#zVvoxUITv`Z{|LlI^$w@($pX9NsV&;wAVm=ZM}38t1C@+u?ZrxMlj z?mHaEILblkW>6~)zS()vX92~&9bxB89h1ucc-k;8T%L6KjxsM_LHUny`AC0b_Rs-` zLx*qWWeU8oQ@OpS{uE8t@M%0TedtuS(85%|i#qxcJ>^?nMH0`-%Z)u8Bn(`&&TN-S zhl$VRDI{?nQMt%(C)IcoL%hvu$g3SD41nZ((ck1PosJrx{vxjk9+d#k@A8V!L;VR8 z!Lc++>hGD5PKv}(Ehd=}1_@tbhRx&-l7GZEd=m*zy5i3y0xX*KYQ2KLbMwV|%`DVs zaRRndKUrU@SE_UM8I;zmGu4^;Z1t<vTD?}Um_>Lkv%mWJdQEyKb)Qk6ME87|w=;z1 z=Igs$9Q8NMt?*zzL|Ox@KVbgvGk+FuCa<(`aNWhO%tB7{d@g4Nha*-9ro$Cr5xl~q z=r+~v=rd9;eV-YD^tPwppB0@OPZblFhbuilY%2=9;B_VHo0eMeU3_-3N8JSHu{rEn z)QZc=O`T2Vn9MUd#$<sBExkIy<Rp_*NaDq#dc~XX53$gKcc)o>0in~^aL9l!kMX68 zRy+ex@w&XqpgB}D-UYUpc{!b^y2yKM0{8-)oOaRgDJ>#f7G=y0`pRbg>UI69^>f6W p@?t;U{J@4G`2(=8<9pt!gFUVwJ!O`ynpIm^C@#FZ@FQjGe*u_qA)5dI literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32457da8d2dadd98a3b90d8126941cb557a9ff68 GIT binary patch literal 3486 zcmZWsOLN=E5e5bz2vQ{Vux!iw<YwdSGKtCfk!;G@q&Dka=e4DaH`x@*DHMbmQlJ5X zo*7Cqi#pL&drA)Z0ZFd;CHW6?P3^&dL6_v~0V&BcR5NJK^k90vue+ypzuj(r_pkpv z{b$Q@{_9+Ne8``nsRcUja5r}fH*#H)S<WJ6-(KY5?d5(^ivm06=k+3tLMzwuM$wF# z#YVJYe+PN1Xh-d$6Lnliu<@qYTDsBpZya9d;Y){yqP_H@9nl$I6FW=Vi#>6AjaRV1 z>A7YzIZ$Oj(<07_X({zS#%j|<Dgj|*n&`t=m+?&IJ!V=wQ`0<o5!0{<WTB-H81MW^ zNR^e7N99DzGB@5)s#5y?`l+u3^>+xuiCpgBtS-*UBA<IvjlUlSy!)*)bomBvy=+8v z5%M<gymWAu2H)gcFP*3<HuyH*v12WMjqhTt&9Cztcz48xU44`9y$rEt6S}wfTUK`q z^4t6!D{n)7m%nG_oo^lAiLL>S4@~fRGEWj|yo0%%`+f8#IFQLCJv<BX<41>DPtO`_ zNuAY6RBAP=hM2WOBm^{<Pxn){IyTWxZ4*uX44rngyKt6l%ogs@U9f+!h4(j5qdo0& zfV1@EJ?)Qc<AAe~Ye{oprnhg}GbL0!l*y<N6Kz;N?bS_9&89-i2EJ^<IL;=Sj$>0F z37u#yO$+Sh*#TGst8$050&$|ng!g>oE0GV42NmNda->Y~?3mtQzY)i2o+uT^|8~xb z!Bl2Pi57#SL=J{!&cXR0eKyef-QmH>5r3dQiGP|Nym)r^{&0R=q(8wknhd@kOta~o zY@&3M=XV|yV$RixqCwkWtQK;T<OBH3;J}j5pT3aSVdWm03eY+3p4W2cn-xd>^$Am# z=J3#)uzrN5LUbJHj>yf~{+!*B@;!{<K%NvwR<64DF>1DfQhbmo5o0o@lhd%W)Uo;A zYRfm2-r&~m{RNh4XY3NMOIPk{kKV4caK=7bZRtK`r|i^&9Kc2}Kk^pdxW065A}qQ0 zSBCKPVRvo*$7Xl+e0f4~+0}=lTUpbUVp^(9m-0n7sU|>QSC>|Y3#GG3q7jeXyiBcd z{w*S&zV?`cTOF3ivC_PpA?icJN@e^ivc*ZJw338<bdAoA?^}GzDScPTw+OloIh(|3 zSro~Hn>w<D^&4N_qRDW*_gWX|u2&Ns7Zk|v;pc~F3hB~uYArWpTdwbJx%2i4{>tc- zVu&8Hi<-s!a|poDSvse_2J*m_E&K}krBCUOdn3fx*e8@R=Z@G-=d?zAEWijQQ6TQ` z&u>0D6zQ{UGU@`6?rn8j5vI45+`ty_qvyTAG;z#T7BoR#jz&TnKbs6oS%Z@Nn7WV9 zLDfrh07`UN2;>hj49tMT`U7EFa0}X1r)&&`P7mXWIKGQTY73piLSVw|Uz6>*^Q{#& z=c?!MtkaE!=LVMIs1y<mFu0sqCtIbHKpkh;iDDx?<~_Hvy`oSKu=K+8D>lmenEfSM z6)G28RbM<ehF~FstTDti@*5dq83PX#7w*D`VU_n+T)+`$d2TUx<pZqhu}j$2tczW> zkD$6@qzPtIj-2%wrj+%b%U)H@y%xzH6sf6u=q_hzM6P%0+Sql+9;fL3m;+9nz{c^y z8+tZF&jZ{F4+n#}Pq#qNm%I2<m6~@iM-pNtPG-19o5+k(6KaRh?vpk}m+Yc54WxUC z#I2Bz<-0U&V~0|d`~=+>Xg1?H-VL|uhVK0BOBrh&wd=jkk4nKq#8^^t2$hG7K#e8B zJ7p(dFWA^!Vu!!{775E6GX$7-@{rdtau2k5V{hRDhCYQBNj$i9DXipE9Z+~ZaTc{F z&h!2^&hvM^sX{H>mv^w|V{rN*-j?69-IRil0<Ro)tDE;>_iPh)7Vf$8fmf93vF;(Q z`vu8$>#{&`nrAxCCPLvl)H0jOpJN&_jho##Q!!;EN@MHfDaj*xL4|pbw0$6kn5EAc z_r&<5d)1{n#G({MiINHGUtyi1AamG`+W`X%tqF<Pz@>Hl5+4_<&Y2)*J7<EpeUpib z2VT2Hp%Ltx8dAuld<{MMDOSGvA0A*s=|@sz_Pk3+3$ZGrBJJvVTGe@~$q37;E0_6h zht03OW__iTlFjtcoA`KyW}}OP?H-%|;Me(a@<MgtwX;IlOX;X85LK6#laF+_NRV_M zTT9kPQnE4rBq_vI19w0j-7+X@G9HWPvm{SwM|(wk^IIzu-_(L{G@&TzT9Iw)I@D1W zCMl)LZFD_%zqd<O6K##EsTs#b$!9sqtvIILsu}rvXq!6EP^}cgG{`sXB2!oJ-9ji^ zw3rs+S!Zb>^kK>62ec2RJ+onJsnsy07n?yPm4h~v<(DM=j=DdfGwoINm5Mx%;|oyM ziNNLnD*0?xNv=Z|1pb)g`d+8r^21K66?&n+6}CF9y3Ij2Dh@cD>6yd<B|&KFbdBNG zli$a$=p9sM{rCvQVJZ76JLwnYkx+ejI!Z`Ml*^m6>W0-@S8sh@9#8Tz;Wnns-s_Vy zo#m=uWGbz0NlHIv`*j_Zf0F)9kW{~!2AuLMd%H>sF!^KZs`^%n5sDL(yBAf&c}_Ip crxkg>BEM8r>b7uihOEU}$oyNZ>23Y_|M}Nkv;Y7A literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/git.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/git.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e15cedc95f5b4436e7efca4ff8b1952d0b19aec GIT binary patch literal 9121 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ead9631aee79baaa5256effb973c4bd62a9ead27 GIT binary patch literal 3719 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 P!^OlCeqEz!cE9>R!;-o7 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b732bacf82fc1d8c650d18dbeb959e1eacbafbd GIT binary patch literal 6752 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 VRnvow6xQSdT%c|)eOLR&zW}g)u!#Tw literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/bazaar.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/bazaar.py new file mode 100644 index 0000000..3587b3d --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/bazaar.py @@ -0,0 +1,103 @@ +from __future__ import absolute_import + +import logging +import os + +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.download import path_to_url +from pip._internal.utils.misc import display_path, rmtree +from pip._internal.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']) + + @staticmethod + def get_base_rev_args(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) + + url, rev_options = self.get_url_rev_options(self.url) + self.run_command( + ['export', location, url] + rev_options.to_args(), + show_stdout=False, + ) + + @classmethod + def fetch_new(cls, 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] + cls.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) + + @classmethod + def get_url_rev_and_auth(cls, url): + # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it + url, rev, user_pass = super(Bazaar, cls).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 is_commit_id_equal(cls, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Bazaar) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/git.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/git.py new file mode 100644 index 0000000..35ea930 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/git.py @@ -0,0 +1,362 @@ +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, 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) + + @staticmethod + def get_base_rev_args(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 because + # 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) + + @classmethod + def get_current_branch(cls, 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 = cls.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 + ) + + @classmethod + def get_revision_sha(cls, 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 = cls.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) + + @classmethod + def resolve_revision(cls, 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 = cls.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. + cls.run_command( + ['fetch', '-q', url] + rev_options.to_args(), + cwd=dest, + ) + # Change the revision to the SHA of the ref we fetched + sha = cls.get_revision(dest, rev='FETCH_HEAD') + rev_options = rev_options.make_new(sha) + + return rev_options + + @classmethod + def is_commit_id_equal(cls, 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 cls.get_revision(dest) == name + + @classmethod + def fetch_new(cls, 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), + ) + cls.run_command(['clone', '-q', url, dest]) + + if rev_options.rev: + # Then a specific revision was requested. + rev_options = cls.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 cls.is_commit_id_equal(dest, rev_options.rev): + cmd_args = ['checkout', '-q'] + rev_options.to_args() + cls.run_command(cmd_args, cwd=dest) + elif cls.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, + ] + cls.run_command(cmd_args, cwd=dest) + + #: repo may contain submodules + cls.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): + # 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_url_rev_and_auth(cls, 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, cls).get_url_rev_and_auth(url) + url = url.replace('ssh://', '') + else: + url, rev, user_pass = super(Git, cls).get_url_rev_and_auth(url) + + return url, rev, user_pass + + @classmethod + def update_submodules(cls, location): + if not os.path.exists(os.path.join(location, '.gitmodules')): + return + cls.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/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/mercurial.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/mercurial.py new file mode 100644 index 0000000..81edc4a --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/mercurial.py @@ -0,0 +1,105 @@ +from __future__ import absolute_import + +import logging +import os + +from pip._vendor.six.moves import configparser + +from pip._internal.download import path_to_url +from pip._internal.utils.misc import display_path +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.vcs import VersionControl, vcs + +logger = logging.getLogger(__name__) + + +class Mercurial(VersionControl): + name = 'hg' + dirname = '.hg' + repo_name = 'clone' + schemes = ('hg', 'hg+http', 'hg+https', 'hg+ssh', 'hg+static-http') + + @staticmethod + def get_base_rev_args(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 + ) + + @classmethod + def fetch_new(cls, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Cloning hg %s%s to %s', + url, + rev_display, + display_path(dest), + ) + cls.run_command(['clone', '--noupdate', '-q', url, dest]) + cmd_args = ['update', '-q'] + rev_options.to_args() + cls.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): + """ + Return the repository-local changeset revision number, as an integer. + """ + current_revision = cls.run_command( + ['parents', '--template={rev}'], + show_stdout=False, cwd=location).strip() + return current_revision + + @classmethod + def get_requirement_revision(cls, location): + """ + Return the changeset identification hash, as a 40-character + hexadecimal string + """ + current_rev_hash = cls.run_command( + ['parents', '--template={node}'], + show_stdout=False, cwd=location).strip() + return current_rev_hash + + @classmethod + def is_commit_id_equal(cls, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Mercurial) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/subversion.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/subversion.py new file mode 100644 index 0000000..01bb161 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/vcs/subversion.py @@ -0,0 +1,234 @@ +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, rmtree, split_auth_from_netloc, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +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>') + + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple + +logger = logging.getLogger(__name__) + + +class Subversion(VersionControl): + name = 'svn' + dirname = '.svn' + repo_name = 'checkout' + schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn') + + @classmethod + def should_add_vcs_url_prefix(cls, remote_url): + return True + + @staticmethod + def get_base_rev_args(rev): + return ['-r', rev] + + def get_vcs_version(self): + # type: () -> Optional[Tuple[int, ...]] + """Return the version of the currently installed Subversion client. + + :return: A tuple containing the parts of the version information or + ``None`` if the version returned from ``svn`` could not be parsed. + :raises: BadCommand: If ``svn`` is not installed. + """ + # Example versions: + # svn, version 1.10.3 (r1842928) + # compiled Feb 25 2019, 14:20:39 on x86_64-apple-darwin17.0.0 + # svn, version 1.7.14 (r1542130) + # compiled Mar 28 2018, 08:49:13 on x86_64-pc-linux-gnu + version_prefix = 'svn, version ' + version = self.run_command(['--version'], show_stdout=False) + if not version.startswith(version_prefix): + return None + + version = version[len(version_prefix):].split()[0] + version_list = version.split('.') + try: + parsed_version = tuple(map(int, version_list)) + except ValueError: + return None + + if not parsed_version: + return None + + return parsed_version + + 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) + + @classmethod + def fetch_new(cls, 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] + cls.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 + + @classmethod + def get_netloc_and_auth(cls, 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, cls).get_netloc_and_auth(netloc, scheme) + + return split_auth_from_netloc(netloc) + + @classmethod + def get_url_rev_and_auth(cls, url): + # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it + url, rev, user_pass = super(Subversion, cls).get_url_rev_and_auth(url) + if url.startswith('ssh://'): + url = 'svn+' + url + return url, rev, user_pass + + @staticmethod + def make_rev_args(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 is_commit_id_equal(cls, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Subversion) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_internal/wheel.py b/mongo_mac/lib/python3.6/site-packages/pip/_internal/wheel.py new file mode 100644 index 0000000..1bdbe93 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_internal/wheel.py @@ -0,0 +1,1098 @@ +""" +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 ( + LOG_DIVIDER, call_subprocess, captured_stdout, ensure_dir, + format_command_args, read_chunks, +) +from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import open_spinner + +if MYPY_CHECK_RUNNING: + from typing import ( + Dict, List, Optional, Sequence, Mapping, Tuple, IO, Text, Any, Iterable + ) + from pip._vendor.packaging.requirements import Requirement + from pip._internal.req.req_install import InstallRequirement + from pip._internal.download import PipSession + from pip._internal.index import FormatControl, PackageFinder + from pip._internal.operations.prepare import ( + RequirementPreparer + ) + from pip._internal.cache import WheelCache + from pip._internal.pep425tags import Pep425Tag + + 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(): + sorted_scripts = sorted(scripts) # type: List[str] + if len(sorted_scripts) == 1: + start_text = "script {} is".format(sorted_scripts[0]) + else: + start_text = "scripts {} are".format( + ", ".join(sorted_scripts[:-1]) + " and " + sorted_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_result( + command_args, # type: List[str] + command_output, # type: str +): + # type: (...) -> str + """ + Format command information for logging. + """ + command_desc = format_command_args(command_args) + text = 'Command arguments: {}\n'.format(command_desc) + + 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, LOG_DIVIDER) + + 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_result(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_result(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 + if self.build_options: + # PEP 517 does not support --build-options + logger.error('Cannot build wheel for %s using PEP 517 when ' + '--build-options is present' % (req.name,)) + return 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, + 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) + 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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/__init__.py new file mode 100644 index 0000000..c1d9508 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/__init__.py @@ -0,0 +1,109 @@ +""" +pip._vendor is for vendoring dependencies of pip to prevent needing pip to +depend on something external. + +Files inside of pip._vendor should be considered immutable and should only be +updated to versions from upstream. +""" +from __future__ import absolute_import + +import glob +import os.path +import sys + +# Downstream redistributors which have debundled our dependencies should also +# patch this value to be true. This will trigger the additional patching +# to cause things like "six" to be available as pip. +DEBUNDLED = False + +# By default, look in this directory for a bunch of .whl files which we will +# add to the beginning of sys.path before attempting to import anything. This +# is done to support downstream re-distributors like Debian and Fedora who +# wish to create their own Wheels for our dependencies to aid in debundling. +WHEEL_DIR = os.path.abspath(os.path.dirname(__file__)) + + +# Define a small helper function to alias our vendored modules to the real ones +# if the vendored ones do not exist. This idea of this was taken from +# https://github.com/kennethreitz/requests/pull/2567. +def vendored(modulename): + vendored_name = "{0}.{1}".format(__name__, modulename) + + try: + __import__(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.exceptions") + 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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4cc8429610b1f227ba39699bffde1cb4f46a8cc4 GIT binary patch literal 2863 zcmbuAOK;pZ5P+%2Y9H|?PU1YAHm&lGlSUiYaT63lQM7i@06`9YAnhW6pcT2hT2rD* zaviT?pSC>~=uhaizoh?x=&k4>*B*N4sY8k08V$S-S_$Gu4M!t#W;k4Hw_Cse^vm<$ z6hgnD1D6Z^kKqx2S_om(McBeNwNkrlTe|O1r|Xn-yS0*D*TZhNPHLmZs9Clxa%^f% zt?mM@VedQCZIk+s7XO1dBc~icP8M)|YELcVjT+~WZn1-%@9l?(v~go<S(;75mLb?I z<qL*w!{df03>OVg8lEydZMbB3#_+7+Im7dY%Z3*W-!gpL@S@>6hVL5shL;R48(uNI zYIx1?y5SAOn}#cfw+wF^zGryHFfi;G-Zfk`eBW@*@Sfqi;RlBIHL>#rT6s|X+RBqW z2)9Xw8TS+6_W{*gk_~)Jau^|5oDku&z7NX2WPZ*G=tw^!1Z%ZQ+^V#FmidCEL=N>3 z*^z{25e-_cM+pThNhT6ZjIr6D#gL6D_It#SS*gGY_LDRn%cw_*A7$7#DlDTD&})rz z97#}u>1-1&68OyTbC&w!Tu4r$G-$oj>AqsA6H!kvI+i3%(wuSm^id2sUtW3_wBh*_ z9<dD#wnj)=yJ%|fS(Ee9-bK=xBI!;Mwz2brYoTW-TXK=CZMFCV3+ekClzsR$lHRDk zi<T=|57Dj#+3w=n)P8R7*?W#`mKydl+I9AIrw&8{K_tAVMg8U7z2N2Q9@le&S=T5y znJO!IRSH_lgV>~zRE;pqqLhT8YK3M+(60|D>qS&3kFr?v*yD1so18PQ95E59o-#a! z7$}d6oF-D$1(A`Ie8p9*YD^ne?J5BXF8`z4UL=Teha|#3BfbQ)`zz_>JlO{SceW$m z=`)HU1f6)RBk5|tx3i7!iTmMt+?#BzuJwx-X?z#1LDu=Q1F3QcQb0zO-no~O0*f7? zh2>-Numj7=5*da;K2eSR$z0SST7(8!3$|^Yw~jYGd(m37_*sw@wOhf9Ayo@;6b}g` zk>rf3M$9PVQ5vZ_PK2aMPkFk-nQ9DWO4qfd0S?>hLvn(blAWRnO^~u}B8tUXHyCpY zy2aUlOM*P&;GJe3#aqz;GQK!D>jow<i=}@=A}4XuPrzMWFDLo>>V4JDw+106f{l3$ z!D-~24d4~Rlusl}VHKQ6J^|ah_wASnDT>qky@2e*B$qn>i<2{9^+Q;~@@pcql(pje zp+i9kexoF=tX@4_5B!`}YQ@br(aIU4#ihBLl7pLX9jOvzl0trix!XtU<`V{WObA-c zS<3-G`iGl@&`~Uk%kwlS$(fMzbY|h{9ByY{Ctw_Q7i>nH#ByHHW*_J*UVj6_;E)gs zN<0jQFkij(i_QP^S)j`hB`KT<k<OXo+8i?wvoy-00pas9!5En5MA#!aWIZX~Is9*9 znb2Zo{&;X8i|6bKZ7SHG){P@f&gM2J;fz7p+QpS4%;`wY3w>!yCMjX#xp`OWK`B%9 zs-CT_oKW>J#4N5(lm1waIh-uqhLWmWeWa*56Hw&jP}xlI1ubuGY<}|9(~T#a8_F$5 z>TtkT9h|^n4@U@`QM#gn)#kI$HaDMy8;?IP>$Gx5EXm4K<Un&qn{7O-&Y+L#@FqAk eE>!x41$WK$mb}IV&$;T9?^^c%?#k|KHvR^Y!iPQp literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/appdirs.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/appdirs.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..813b322ab48fe20b1179853caf4d441aa185603f GIT binary patch literal 20663 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/distro.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/distro.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a8666530bb9025faf39f02fb9872419bdc514c3 GIT binary patch literal 36361 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a40b54a9ed9077edf4bdc90721f1606c63973f7 GIT binary patch literal 66571 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 K7<%8}WB(tUFFFPQ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7594dc2a3174192303f4574a31a6da6d4d56f798 GIT binary patch literal 222413 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∨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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/retrying.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/retrying.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2cbdb3a56e587e10f8ac77f08787599225a0c298 GIT binary patch literal 8096 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 ax)I|`R^)FG&EscTrhV7kSG5y!cmEdyAgJa5 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/six.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/__pycache__/six.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f9180e764fb28e58fc43c348cbd4cc47b33e1e2 GIT binary patch literal 26514 zcmc(H378zmb>2+RxwEs2C9t?i5FFlE5Eu{_L4p8?lK@Cyxx|75IUqHho$B44-PxH% zbq}yRUXYX)5+RAAAyJZbS&|jmkrG*o6FYX|BXOieaU{!e?zHX1u`MN394F4<B#aZ~ z|6g_Y9J>HTD&Loxue)DW*YWDrt5>gHz3QEPeVOlm{+rKz<Hbni4<l{A#{nP2<@{NH zB%&gPh>9w!8lABUR+Mn88Y{%)885`;nJ6UWnJgsbnJT1IypUFjLXVxC%Bbl2h)Pad zh2AifLMUrOD*0Y(edJnHy*iyJ^x0Ycal3y!T3BHZ;C_?668BYhe__yGU08!0YYXdY zSM2pBg?;n5#WZ$m>J~t&><viQFX?Wb+NgRKqxw7c0Lp%CF^YVrjz?5h^<9amKKr)C zSRpsxZ{Kd`79)$%Xyja^mWxO1JEk+&qB<Lm@Gp6<G4HdHTJ{+e{s_b8b83YexDqMc zscup$@w^LVuTq03dr->08{ySz4Z>^eyHVFY2(MM^5MBpt??uce#H?30Bj#pFF@*3f zY6HR>q=e1(X8S(WwFU9Fs*Q->Xm3Kkt@e<*4gZ|FeK8LB4t1xxOWm#RSWF;v4?=gU zd(}M>+N6f?ZnN4Xq5BZpvKT|Et&%6Nwo3dqbwB>w)iw$3kkB@@Lqa>%F11_oJRoK5 zQ4dJ`gKEg`yJqQo)I&8(?Ntv8F8h#Xzob5(9#IF?A&I?R-L7&HdsrP-M+7>mj{49s zb<BtMbky*u;CNg;D)pU^cAZow5V{9#8d|jQd`vwq&r|BOJcrd2Y6Ruqqn=b})RO{@ zs<Y}Tfu2_9)H4D-s|xD8K+mb?)w={LsuxsApfOceN+4T}s|kT7RYgq+G_9&?MxdIi zt670As0&I9<S567T;=*uLp9Vzd3#CC37+$+DbF8M3-Y|IUR0MQ#Y^gCiFvnrk6M(N zE9$-KeFD9ruB!J7^a1rj^{PN0Qm?5W7wDS$u=<EVud9!$j|uc~^%Lq70)0|_N_|?O z�eNpB3nH>hpfdKc&8){({7PQT?>~8G-(y`jTJAm+kx1Us@Yce_7(cg3!+*^i>Ic z4WYlXHe&7)^K<I2s=p@C&#PZhe_fzoRKKMD#$s&ZU?Gn&e5?AK)7G`PuGx9?)Gw=F zS+pjidm@GW++I6>H1hn8!Z!PUd#k-|YP-E{F@|xt!`^1!v&cNIy=7{ry-ocp->!`; zLMB~{UvSSw&Tm6$TZ_1W%dg>0w6IIk?oxk?sW6KEw)%C9qF<L$v>T(~@2Ia!n}*ak zLg?>?(BBK8Z-&s{523Gz&~Jp$KM0|3h0r1OHNTE;htO|^(04-Uw+N}<RKF$M{tv_W z-wvUF6hi+vg#Jkg{nN0<e-=XjJcRy52>nX~O{_0GFt@>e0Ms57YVU4Q`�{9|%1k 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 ME&=KZKgX^A3s7<qa{vGU literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/appdirs.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/appdirs.py new file mode 100644 index 0000000..2bd3911 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/appdirs.py @@ -0,0 +1,604 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2005-2010 ActiveState Software Inc. +# Copyright (c) 2013 Eddy Petrișor + +"""Utilities for determining application-specific dirs. + +See <http://github.com/ActiveState/appdirs> for details and usage. +""" +# Dev Notes: +# - MSDN on where to store app data files: +# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 +# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html +# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + +__version_info__ = (1, 4, 3) +__version__ = '.'.join(map(str, __version_info__)) + + +import sys +import os + +PY3 = sys.version_info[0] == 3 + +if PY3: + unicode = str + +if sys.platform.startswith('java'): + import platform + os_name = platform.java_ver()[3][0] + if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. + system = 'win32' + elif os_name.startswith('Mac'): # "Mac OS X", etc. + system = 'darwin' + else: # "Linux", "SunOS", "FreeBSD", etc. + # Setting this to "linux2" is not ideal, but only Windows or Mac + # are actually checked for and the rest of the module expects + # *sys.platform* style strings. + system = 'linux2' +else: + system = sys.platform + + + +def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user data directories are: + Mac OS X: ~/Library/Application Support/<AppName> + Unix: ~/.local/share/<AppName> # or in $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName> + Win XP (roaming): C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName> + Win 7 (not roaming): C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName> + Win 7 (roaming): C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName> + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/<AppName>". + """ + if system == "win32": + if appauthor is None: + appauthor = appname + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.normpath(_get_win_folder(const)) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('~/Library/Application Support/') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): + r"""Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of data dirs should be + returned. By default, the first item from XDG_DATA_DIRS is + returned, or '/usr/local/share/<AppName>', + if XDG_DATA_DIRS is not set + + Typical site data directories are: + Mac OS X: /Library/Application Support/<AppName> + Unix: /usr/local/share/<AppName> or /usr/share/<AppName> + Win XP: C:\Documents and Settings\All Users\Application Data\<AppAuthor>\<AppName> + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + Win 7: C:\ProgramData\<AppAuthor>\<AppName> # Hidden, but writeable on Win 7. + + For Unix, this is using the $XDG_DATA_DIRS[0] default. + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('/Library/Application Support') + if appname: + path = os.path.join(path, appname) + else: + # XDG default for $XDG_DATA_DIRS + # only first, if multipath is False + path = os.getenv('XDG_DATA_DIRS', + os.pathsep.join(['/usr/local/share', '/usr/share'])) + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + if appname and version: + path = os.path.join(path, version) + return path + + +def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific config dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user config directories are: + Mac OS X: same as user_data_dir + Unix: ~/.config/<AppName> # or in $XDG_CONFIG_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by default "~/.config/<AppName>". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): + r"""Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of config dirs should be + returned. By default, the first item from XDG_CONFIG_DIRS is + returned, or '/etc/xdg/<AppName>', if XDG_CONFIG_DIRS is not set + + Typical site config directories are: + Mac OS X: same as site_data_dir + Unix: /etc/xdg/<AppName> or $XDG_CONFIG_DIRS[i]/<AppName> for each value in + $XDG_CONFIG_DIRS + Win *: same as site_data_dir + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + + For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system in ["win32", "darwin"]: + path = site_data_dir(appname, appauthor) + if appname and version: + path = os.path.join(path, version) + else: + # XDG default for $XDG_CONFIG_DIRS + # only first, if multipath is False + path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + +def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific cache dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Cache" to the base app data dir for Windows. See + discussion below. + + Typical user cache directories are: + Mac OS X: ~/Library/Caches/<AppName> + Unix: ~/.cache/<AppName> (XDG default) + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Cache + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Cache + + On Windows the only suggestion in the MSDN docs is that local settings go in + the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming + app data dir (the default returned by `user_data_dir` above). Apps typically + put cache data somewhere *under* the given dir here. Some examples: + ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache + ...\Acme\SuperApp\Cache\1.0 + OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. + This can be disabled with the `opinion=False` option. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + if opinion: + path = os.path.join(path, "Cache") + elif system == 'darwin': + path = os.path.expanduser('~/Library/Caches') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_state_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific state dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user state directories are: + Mac OS X: same as user_data_dir + Unix: ~/.local/state/<AppName> # or in $XDG_STATE_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow this Debian proposal <https://wiki.debian.org/XDGBaseDirectorySpecification#state> + to extend the XDG spec and support $XDG_STATE_HOME. + + That means, by default "~/.local/state/<AppName>". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific log dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Logs" to the base app data dir for Windows, and "log" to the + base cache dir for Unix. See discussion below. + + Typical user log directories are: + Mac OS X: ~/Library/Logs/<AppName> + Unix: ~/.cache/<AppName>/log # or under $XDG_CACHE_HOME if defined + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Logs + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Logs + + On Windows the only suggestion in the MSDN docs is that local settings + go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in + examples of what some windows apps use for a logs dir.) + + OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` + value for Windows and appends "log" to the user cache dir for Unix. + This can be disabled with the `opinion=False` option. + """ + if system == "darwin": + path = os.path.join( + os.path.expanduser('~/Library/Logs'), + appname) + elif system == "win32": + path = user_data_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "Logs") + else: + path = user_cache_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "log") + if appname and version: + path = os.path.join(path, version) + return path + + +class AppDirs(object): + """Convenience wrapper for getting application dirs.""" + def __init__(self, appname=None, appauthor=None, version=None, + roaming=False, multipath=False): + self.appname = appname + self.appauthor = appauthor + self.version = version + self.roaming = roaming + self.multipath = multipath + + @property + def user_data_dir(self): + return user_data_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_data_dir(self): + return site_data_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_config_dir(self): + return user_config_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_config_dir(self): + return site_config_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_cache_dir(self): + return user_cache_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_state_dir(self): + return user_state_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_log_dir(self): + return user_log_dir(self.appname, self.appauthor, + version=self.version) + + +#---- internal support stuff + +def _get_win_folder_from_registry(csidl_name): + """This is a fallback technique at best. I'm not sure if using the + registry for this guarantees us the correct answer for all CSIDL_* + names. + """ + if PY3: + import winreg as _winreg + else: + import _winreg + + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + }[csidl_name] + + key = _winreg.OpenKey( + _winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + ) + dir, type = _winreg.QueryValueEx(key, shell_folder_name) + return dir + + +def _get_win_folder_with_pywin32(csidl_name): + from win32com.shell import shellcon, shell + dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) + # Try to make this a unicode path because SHGetFolderPath does + # not return unicode strings when there is unicode data in the + # path. + try: + dir = unicode(dir) + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + try: + import win32api + dir = win32api.GetShortPathName(dir) + except ImportError: + pass + except UnicodeError: + pass + return dir + + +def _get_win_folder_with_ctypes(csidl_name): + import ctypes + + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + }[csidl_name] + + buf = ctypes.create_unicode_buffer(1024) + ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in buf: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf2 = ctypes.create_unicode_buffer(1024) + if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + return buf.value + +def _get_win_folder_with_jna(csidl_name): + import array + from com.sun import jna + from com.sun.jna.platform import win32 + + buf_size = win32.WinDef.MAX_PATH * 2 + buf = array.zeros('c', buf_size) + shell = win32.Shell32.INSTANCE + shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf = array.zeros('c', buf_size) + kernel = win32.Kernel32.INSTANCE + if kernel.GetShortPathName(dir, buf, buf_size): + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + return dir + +if system == "win32": + try: + from ctypes import windll + _get_win_folder = _get_win_folder_with_ctypes + except ImportError: + try: + import com.sun.jna + _get_win_folder = _get_win_folder_with_jna + except ImportError: + _get_win_folder = _get_win_folder_from_registry + + +#---- self test code + +if __name__ == "__main__": + appname = "MyApp" + appauthor = "MyCompany" + + props = ("user_data_dir", + "user_config_dir", + "user_cache_dir", + "user_state_dir", + "user_log_dir", + "site_data_dir", + "site_config_dir") + + print("-- app dirs %s --" % __version__) + + print("-- app dirs (with optional 'version')") + dirs = AppDirs(appname, appauthor, version="1.0") + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'version')") + dirs = AppDirs(appname, appauthor) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'appauthor')") + dirs = AppDirs(appname) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (with disabled 'appauthor')") + dirs = AppDirs(appname, appauthor=False) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__init__.py new file mode 100644 index 0000000..8fdee66 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__init__.py @@ -0,0 +1,11 @@ +"""CacheControl import Interface. + +Make it easy to import from cachecontrol without long namespaces. +""" +__author__ = "Eric Larson" +__email__ = "eric@ionrock.org" +__version__ = "0.12.5" + +from .wrapper import CacheControl +from .adapter import CacheControlAdapter +from .controller import CacheController diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4fd390f064287e66f658bdacbb4d79b414868cf9 GIT binary patch literal 554 zcmYjN&5qMB5O(^PHro|Qyg;r!Y`kT61qZZRwBmpST;LQTS+4DLt@<Y#yXiJh!<8rD z9dbn+cm+;O$|7Z~8Gql%GyZ0-&d;-7-+p{85<-5GfsGK~p@-KPBq@nZ%0!OJksOy} zIgwK{vD0#z5X3VxvuT;0aBAjuQ7#bAKa<s>-Q08Wpzghk;7zV=?IGsxT~ttUp^7Z~ z$agB&F;_es^XUISsleM@^tIxt_Mqc~-^bi|x6K{5D%98^6j^)r4z$QWa0uSD&lQq8 z?HzcrD?Du5*=4bQS={`_5y>j)mP19zUkv$M$!pYx>1V^VQSfP%btz-g3&y&PF}_DR zfOx@}vRoU4XN)xp0)CDpJpiw31<<duOZmUfFz#9QG!*uQ2`0W1SmJdGe;QhYZg^C* z;Xo^IB=)3YN26I+o5x08hga-IY>vD2Rn;D>xJ27J`i0iIzR)g2Zp_8CRjmw<p--M1 mr8((=4wp(9(@samiu%~i-&imAM&0&`La%3%oX%*OER(+oJ*#>E literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5fbe299a2d74d7b89cb38b33ddbde23fe03052c8 GIT binary patch literal 1557 zcmZ`(%Z}SN6eabxEPLFf2-2cR-NzzcWYi!D3IsvWbW${nz$iMCjZi>PM2;<wUL|Q~ z#_+71ZT_L#eo6m<+oFs9LRY<)Qm2CeAwcTzlA;dJJy#D#qwufa{`lp<CFD<Xt=WLT zgD%fuV1&_<B>1#ST3Lxj5!<C*If-MiQ@WLxcm}(rUj<2EuvZSMFbM(sEO<+jAses| zo)H_e2%aN0VIwwvOOr7_U<YTGP<*^6u%8~2*++lF*U5ZFbs+e!Yc7=peDf&Fm;9)y zm1xRmENc}P5FR`)a%Gla;+4%}VZ!5QVzI7xt$xac<RZrtu~Fz2^dso<OBfVcQDv>{ zJ*5Pm&YoOi%-s=;Famt&eC7#|is(Rc^^$LRseSxXQ7^Rn{D<#f{isLBO7N_Dk=3l^ zLWdb+JqB9-vJ3xC#0ZZ0N5ritHksn_CKK^#Q!*}OoS((2ynp)oe8V2fZ_`Kl>x;Ad z4^Fpls{9*hi#k4u+oHW!)KX<-dGBGxw@jW(44R&9c+DCS=O|R(2^FV##SYsGJp$_M zHtlIgczq8BLL(YbaRBH_Bh&}ij7CoZD5B^das$~1FT8U=AykZ9(j8qn%m%H%8wNW) zMg?i=?J%G2{A6b9p`n#>l`W(WAtyyv7F*D2u;gn|NLA!pf2maaIF7dg0tsm53mX^+ z2L~jk{bMd=(bU?lnsu#o*xwXopLE~&KQgnlpLJf*j)WIY0=i+0rwtcerMLhm-hhC_ zD4`aeSOG{A!6-g~$dx!~AS7eN`3!&}Xqg?@2n4d2{SKudD{GI|apu}yi*kGWWXY$m zettPs%~XktDfnS(xPm*JB`@2VEl_eDfpOBT_pT0GbT7`a0z5Ml?_VLnE8vzpa6q3_ zkB+JM9OgOl#fB<kH@r^(bi6UKCXE(wh9bDM6qJBTrn~ZX*2;$-^yzh11B~pcc%ec@ zu|Vnokablm_I&Ffq5aqw+tIvH-6h%d@!i?b@G)X)8z_rUfrK%hxCKa$jUK7svTbU~ zwcppiwng@)UuCdtehAuy3aS;@%E6n9+jxS5@4l~&Q)NZ{H7v^s41{{rvm@KHZ`flR zTH-Fg7^ErgN>eQLi3l(@gsM91E6NxznO=(=8nV654ts|grzUqkxXrv{oSc01;Z0rL zf}8ta4&1NHJNl#33k}(+`5*l{t9Y7TyF318gmHNAq-xl@<WJEF5~U8T$O3DFxg$I9 Lf++C9j|2KIid>8# literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b9ba77505cee851a3a0f476dd4bf2f6c7bd1ab3 GIT binary patch literal 3045 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 OeE@+rYeU7-cK!=~x)AXI literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f2c287cf1d0b37b5727db27b08f6e49ffecc7b0 GIT binary patch literal 1770 zcma)7OK;Oa5Z<*N$8j54T2X`q$Ok}*L=&nOaY3k15UPYC9+f~5lI40gtrNf4bwU&6 zM0)RE;L0!IKlq9`@E15Svu+-ZP+_f|eR}4bnQ!dvYSsSv_4~)WIw3#ETr*(43tjGj zV5CJDWm-rht))@&k}#bar-T_?AL}gx)+J`b+T;eTORW5k)U4s5eQ?Yj-}6BxhaK)` z&ePZXPCF4!5TzlHc$@|CQE@}o9lXtW+v|my6G+E%vSYzLW=pTlogm(fc$A2N!va4G zlGqc2y8R2#ks8g7SBc;CaWQEcOm?Bm`ye=JQE);-Cr(LAFW|R~0yY9>7VMj>0>JIO z^30Qb4{`gb1{;nP`W|#?gUHC3d;z8K0&N0<^=6XoPrTyng%F9TX}KYJ*v|DXAABRC z4DbDxjZ_4EFXN5ACmQV}WL(IG-)&^!R{QXz&vxV^_o06{=x%Mdho2+=0kosIanMME zbTf!$=7r(rPQ-^yo`A9-Ro(6Lm?fg2!tEz<CX%pN)YCz(AMp%POXUw8R;M1;;l$VB z2pf)<c`1+<HC>co5GIJc)c3+3SDqEZ!d+eRtO}FAn1hr54r*aeo0(g*V=^A{jIYj_ zTAg`T9Qx=GHXNtUp(E$XQ%Y;Ju!1R?bEM>liRA0BIdNrWreB>kYvtT>-Pnt`>*luW zMhWYMIA3<%PdzUzPDBM2FQHgQfzg@sMw!LX2}}V_BnnHjbbQpV4;#~l*LI=HI*2K~ zZKg5(lmfwl+CXT7nXC+BiCL_o2u^{oOL^rv)Q}>0^FlI^9eb#C0|YXBL|i(e>6HLy z+Jx=8z>B#NLeb?0^D?hiBq^^1age!Kp>xhDN<fU%nR^5EWB3WR=x}X{q&~TD0TKGC z5M6=Eh;&E?@Gvsgin`MT=0*kg9D<_df^l_z3ocHQSe;p2q(4@PGI;OY;MoR6!?dG~ z=tv9bm{Rf{xbud*B_Adnf|^)EAc!V6dnv?(&)11SwTq~b4G#2KH0E$E)(P@Q;ll43 z2IA}{;G&4EYl_<wg#SjTr%8HQtdO2}5Ea%p=E$bQ)mglXqQY-pSzu1Y3JR=1aSg=+ z&u8^Cqxe<0cOCjU#ccy9ZV23M*37)@x-9Xbek#T1AN~*p-OS=2qH00io{Q&Hd2T%} Q3h)V1O!;8YWqoz!4{O|5_y7O^ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6b7f4cfb28404dec319aa67ce6fce1e3f0fff56 GIT binary patch literal 761 zcmZ`#&2H2%5VrHvO}E))#i@rLI3X>lNvmze1yx*-;8Inv5?~=kS;t#KoY>gj?WWJb zLvZB@xN+qjaza8N@d})n{IH}*IP!Qr-%rLf8;yqFKYV%p$wKHG>aF{bKZ31)Kqw~( zN-#$`CK#g^sJP=GW@STlgi-x9sNJHkP+`49r4KcWJH!R{LB}Rrw#8lIcFfw_<~#X- z3~qS8-?DA)wP;V_@ZEe!hBp+Sw+e^vwP>gCm`_H~$v$*4hQ7bHOm>TmT1H|$M^pDF zycJDxHCQSBR;0x_<o=WS{NfqYQWToi_f$tq8Bs1YOQw^`2QE(+fsB=A3dV@4y{EYp z$~;y|sLBJp!KwkhNNL7dwIiF81TvLDv}Q#jRG`?q71Kt85zXRDri0da21xsJWrI06 z=!^cPkb8af|CTG0a^=)^`+dP5yBdZe6e$%6t9A|Bn8=h8((^cH?YnGk)JLSoVA6zN zCX^~&$A*RLScOZ$6Q*=Xv(WJ4<zll=PV|H5lrGBbc(%O0%IOiT%OaeI(86I_XcKdO zc#^a0L~nFmY<4%FkjC^4qoOcM@Q{jJ#wL(u<vq+rvf}IvLnHbw1Pf2_7~i%n?87;B LySw$b?m_)GRMFCr literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb7c660688d6c76768bac84e260ee8f3c728e8c4 GIT binary patch literal 7702 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 Q0E@q);ZML^vvsTXzm~EJFaQ7m literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..504995a3137e0a5589771c953ce8c56e9cb1c98a GIT binary patch literal 2158 zcmZ`)&5qkP5GE<v)@r@mZPTWkAV}GqVjx*JO^RO9Vv{r}df6T}KvSatL5tK{wk)}% zY_ARX<b9A{`y_n_U5gy@3O#j(vb{fWX>dq!hQse0&d^Wy_QLmn{{7qg9YX#gSDFv= zW9XKHP(;y`3~7f_@*`19c^5=^nk~JKr~FgWs(k<}(xPSK<*d;5r=KJIUN;XW$I$Id z5SnzTA|0kE>~)?xzVcP=f^=%Ct{O1bRiJiYY^aaau4-P;PN4SGKCJAh5KcQNZ@rRf z+Lh7ZO_J(gj2w-$krPTt$f2DMLCdGrGM6SFXNpT6k9gkg>!{$<UJ~{AGy$tZYpy5S z%!*!;opGb3;z?HITsl|XaU5&&h)eJ=?dgmcJz4M=PUVT^QJPx~_TUkH>2n>83k^p_ zD|oP8^k9#6&Z0akbXHiN$CaPT`%&n$FTjH=3X^ofhXvT0k4%1^zySaUd~l$lO*%uI z4nf6cwf$|+0g~48v4#CZJ?v^@D+H3OeB1@l&V`L~aQ;w;7EggM`WqP?C+FM(Z|l%x zd4b2uC`uGy20k-xds5|7h{Yw&qly^bFg6?+^jFaBA&7!3$$|*Fpdi_Tf%FuCJESKq z-=JxEM{K!FAs{y8;dWI#D(`RCtmEGDO5f@<E*aPc>(#%A3E{+lXYG+mCbH1&i8Spv zPa&+f9Szz=`Xuh2Pt-H}t@tMD&IV7O#`Ebg`U=`v)_&U_C8NhlW-%O(pAGd~*>j7F zu8WDzRBqaljCvaH+T>{)FKU&EN26I82$5t-A;bYjs1AbAfY#~!-j*O7t&JlL6gG@6 zb{F4IVX`27sLdt)gB28_OP35{%T7!UbS+jM2yv#1O;!m}Hdfy)&oscM^fNisCV;7n zO(k|wv%A?V#AmQz@kt;%A)SA*9qY=o5D^rjYdGG5?%@6alUWl1_u&B;1gFF&1sjBh zQ-Z%=NygrhS>P<ZjrRMiT16ebH;_BX(BUrkU#zR<wK2IV>s48{sAG7O);<K)ig+X{ zt1rQg{R9M|j5gUmtusag9R2x&?L4n;zeaVF`5fFK4RaeMblPW2vV_-DVKsoPD!?<C z0R{tG1`xi9Ovn0vaMvrqUxV!`Z|d}*F~7SNqvLjREp0a79<9Ljp(rtN03Pdm3x@Du z?k|aX2xDytce22Af>N!!aF;$lj}_e7)Fg#2A8fC~t06L&JnMAx<gh4xB@21uUd(N< z`VPrqi4xj`UjP>|KiozTacpOI44VNxgnY%0Dmq|>FPLK0c#8U)jGtd)?45kTa9I?4 z;hKFYtc<nT#K3$GYJ;!bRf^^gF5E?dOfCz`+=I{8(Ct15WO(5DY{l~aHkOy?;T?qd zcwn_c6^B9$b2UzJ-W1~Zu}oK*h7c-`gfLAw!{94(iO|K^!MFm=fy9D0_^@CqI($Ls pv!E6<gO7vVFmO6}u}hZZ)vH~v{(PKbo3}D}ULl0~T}86#{Ra{R7F_@U literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf896a9a068db57157b97b6f76e74dc444c547d4 GIT binary patch literal 4688 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 aW&RBDZQogOmK@KmmV9sNjiswgSN{Xh;#fZb literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64e4d3c6bf4e9496dede682a6db2ce7af320070d GIT binary patch literal 4242 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 H@~r;?)z+gs literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c34e56d45cb95721549c9c4210820615df5a309 GIT binary patch literal 662 zcmYjP&5qMB5VoD){y`BJo&YI_#jJJ_(h4D<oO_|C3Mq19cN^CEk?nSOBlomic?P)h zB)o&Khy$;{iE+A!jy0b?&rBxYOma4v41az5@$oA`=qEa|1o#_p{S<&BjwPz_5@XMa zBvr5sfG0fS@n^gYdGG;c>2D0h8Fr6ntk{TIQybODx16;`C<qVUmxbw5^F@(DskZ^R z=QD8q4#46zHRulQv5niQ!TZ?87F%Ki8`{Vw9Dj-TsYRa%CpNt!81+2($3aLq&muP} zyog*FcB$P^3so{%c0#$qMr>87O<A~UanLA*$_vS~c8~g}*h-4L5@yqI-6b1i+6zj% z)DsOX3se9~6)X+8sA{&g$p$Xe0vbep0~Pvw<RSLp*Xbtgu!_U0l%Luq_p$FtJ%Ib4 zEp1h~V@A*&Q*_-(E|jLl6*cm7y}H@)bNw=ZQLJvSPS4iebyYkEyR7Mgwq<)#*4i*B zPtGgRaebqGu=ji?YThW?i@P71UMtqNLOpA5-FSBN#k_3&1OSbOIK|}Xq-2c8L`@-= uCG*AHTNbGa-1}{)k!SsKd`&;o5j=#LOJ7wD-%9b?|1H{=LC*-`|K~3~&Zi~- literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/_cmd.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/_cmd.py new file mode 100644 index 0000000..f1e0ad9 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/adapter.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/adapter.py new file mode 100644 index 0000000..780eb28 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/cache.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/cache.py new file mode 100644 index 0000000..94e0773 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/cache.py @@ -0,0 +1,39 @@ +""" +The cache object API for implementing caches. The default is a thread +safe in-memory dictionary. +""" +from threading import Lock + + +class BaseCache(object): + + def get(self, key): + raise 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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__init__.py new file mode 100644 index 0000000..0e1658f --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__init__.py @@ -0,0 +1,2 @@ +from .file_cache import FileCache # noqa +from .redis_cache import RedisCache # noqa diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0df17abd7c129209713b820747b1bb156929de29 GIT binary patch literal 298 zcmX|6%}N6?5KeZB*wwy)FR+I?mR7uo2!clsT0E3O*d|#G&Cim=wJrEAUVReZVXxxB zSMcOy6$ie__Y;Ph>1b4ZzP>N-2_YYd|H_bEBEk_iK?K#r&;_N5XF4<aB1fLzk#g`w z@k>d&;kDB8s^X6lMR6;I3cb212VGHP#&`;S8r>cEl>a$7I&Z}9;nTP87ihd{t0<wZ zJk(AL=>zaJL_Mijn^w%i89U{x?Rqk;ch82OU_DrvL!+9pvLRMlk7q{iMA(F6_F%2F l!g=WT;Lb+x^sflOn6fG|cHC^c{d42Qla?3hvXJ&Yq(2t-RW$$r literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce90318491d173c455fd90018f2c28a0b8033d5f GIT binary patch literal 3232 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 Oh5*(^zX>`kFa8UR@$#tv literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..502274f85fcf2a62e85b5321fc36a3a1bfc99e2f GIT binary patch literal 1554 zcmaJ>&2AG(5bmFu@x<7P(IS?;KqKX1Y2zV+6&w((79`-}1MF&%wX4x&x}8iio-y5R z$FYpGlJg*3c@o}Xu870F0w=0^Y~qcgZK=9zx~it?tDnB#Za2St`1IFXPRM7nu{_{^ z1u~CdlSI;-jOc(;<XO%}Y``4Pb3XD09wje`^rU}Iq_4asANVqOL%NNB!J2ew70PUy znXD`vpIBwHkph0}x5TJtNqVGG)Lbu!ruO~>7)1tDk^z%cvU4)vl1mRxPj1UVHqI&d z3gs5u1hOfw!P$^4*@iQeKE$w7HD4>4nc53mxxf?Y8IWnhwxA0V13IvveTd9U%cAJA z$}=h->Hsu85*@<v^`B_0vngPRriqS*WiFLAQF;>De1CW_o5}~~Vf;&aaCWkPe>guK zrT1VR7SZp~I2-R}g|SJV?>!i)xim9_myY78DrBjn)McYAtS<BV!$cYZ#7@#1pH*QT zXGLb?cnhO<km&q}3zWUJJiQWb3*nMua!eO=No&B&L9F<pvR$Sdpi%J?b><M)8~W1M zU_<k@)9nqXVA@ZyZ*bv><nsF%m<2aC)=n2}3EfldF1TgKd`WJR_uR?61-1Ty9|uda zq@cyI$LatZs{oC%8r!1^CN?d~)5?b%HLG}5*s5(yNN#Kt6i=G2=YVJoxbmk-K2cRe z&BmEl<}$E0=<EO)EHR-T?XVV|Z^8pNSEsWB25V$XHzEH?X&_Y&5w5c8g1PMc2K?bB z&^oKvH?mq=rxe7vu%HOv<#iXB+3ni*k~}AWciux6Ltz;fmXdd^KVfnq8a99RQsrZ% z#jw;O%~hha;!r>z3VWmk6xxWa5Q&h9O%7lrd*TnH#A#-anqsxmWMW}}@AkXAE`^6? z8e{(-Y?bf4{RCRZ^#<?Id1nKk6Mu(?Fp(TQ)L(`F)LDp$QAXfksuW`p<Fd>F$j_oE zMWK`wwghw~gpRN-6nlM_@-D3#0&9HH)EFX|+=0uw0PIqLAjCIe3+Jv#Mk<c0W*m=7 zImwZ4#qqmIlGhTAZ;2ZdjV<NUqp`O7N8BzvJI>9N4+0!GgMAvZkcYh4fIZMC>30M4 zHk{ar25%Z0zzx9QHoP3Y)vM8SZvz0vSEK&Wm_GN5tGrg>;~KydOt-=Jtpy$5;@<$M CaaiR5 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py new file mode 100644 index 0000000..1ba0080 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py new file mode 100644 index 0000000..ed705ce --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/compat.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/compat.py new file mode 100644 index 0000000..33b5aed --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/compat.py @@ -0,0 +1,29 @@ +try: + from urllib.parse import urljoin +except ImportError: + from urlparse import urljoin + + +try: + import cPickle as pickle +except ImportError: + import pickle + + +# Handle the case where the requests module has been patched to not have +# urllib3 bundled as part of its source. +try: + from pip._vendor.requests.packages.urllib3.response import HTTPResponse +except ImportError: + from pip._vendor.urllib3.response import HTTPResponse + +try: + from pip._vendor.requests.packages.urllib3.util import is_fp_closed +except ImportError: + from pip._vendor.urllib3.util import is_fp_closed + +# Replicate some six behaviour +try: + text_type = unicode +except NameError: + text_type = str diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/controller.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/controller.py new file mode 100644 index 0000000..1b2b943 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/filewrapper.py new file mode 100644 index 0000000..30ed4c5 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/heuristics.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/heuristics.py new file mode 100644 index 0000000..6c0e979 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/serialize.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/serialize.py new file mode 100644 index 0000000..ec43ff2 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/wrapper.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/cachecontrol/wrapper.py new file mode 100644 index 0000000..265bfc8 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/__init__.py new file mode 100644 index 0000000..632db8e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/__init__.py @@ -0,0 +1,3 @@ +from .core import where + +__version__ = "2019.03.09" diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/__main__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/__main__.py new file mode 100644 index 0000000..ae2aff5 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/__main__.py @@ -0,0 +1,2 @@ +from pip._vendor.certifi import where +print(where()) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..520e7a16e602e8553096c604a7ac42d7fd9e256d GIT binary patch literal 261 zcmX|5K~BRk5VX@)LWSP=L=KG;lB%kN5HH{Yr>c^bdL6Lp*kNtbHm~8zOZY>shy!2f zsZI}!G^5q*YIgG3Z2J58y(tJGKY{;<!t@yEZi4^;s!2`PloE*65saQmJpQ9$71MsQ zf0HP?>0O$wk~B}!)l)p`$HJn-A*R3Pyp`ybHJpDDoCNP8r+3z%YD+I!TOzBhhH%Ej zj(MF`+d~V5Tk?h29(P$@b^BVR0k4L=utqg=Wt=ayo)@+3z#ZIRUKqX^u*if&uPVhj ZS4Mfxljhi8-PaaAw0s!KyP@7qbOx_eNXY;I literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37d6217150da1782236039016609c91383768e8a GIT binary patch literal 264 zcmXr!<>h+1;CPHF0|UcjAcg}bAj<)Wi=}`>3PTEG4nr<u6eA-;DpM+BGea|wmBJLv zpvn9aD9@nDc#E|>Bef{iPm}qUa6x8)UVK?<UP^wEUUF(tNoHDR5y-q-tOZ4xc_k|u zidca>F!8HUA1GFqSdyw=mRO{pmY<W7T2!o`oULDyW0;myQI=v-Y#wi#oK%@@Xq;A6 zo||j{1nGJDA^JdDbTjjcOA>Q(bWL(ot5S+9ia~;447FY#YQ27Zd~RZ9UVOY>LFFwD Vo80`A(wtN~MxZN-K@Q_#1OQYOO4|Sc literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5700aa0671ddcae991c97b75a3df36cb593013ac GIT binary patch literal 473 zcmYjOyH3L}6t$C74N<!zrmPuSQ?-Z%Atd%Ll%+zlQrjVJlQ^>7^dVp=AHvF)@DE-Q z1HZt8lU9Wzo#U%(>G<61VYeH6y?s0w0Kli^5ss~HEY+zM3Z{TU>SS;VsY|_AFm<SN z2cp*YJ|IkLp74IT30{r}f=S9%m<zhhSSXoZ%0h)YWg#z=j<YP*Tohp@$i5IsNaEV5 zU$VR(eA`FCnABPWTDq3Emg>xk26H%fw7Y}P``UZ50e5vIXS@ymtfH22gfd<k>(sO< zmqna2<71rgjA3lNx!^?v4NTsF^sVzxj!Ma^STj_`5+x#|Oe#bcNN0m&wyx+%UE&Ke z+bjmdWV_1Axy56FCaC0P?=W3&l(Q{WYgIQJ;))eiNOag1B0@5|GSgb6OtMZrm}dpR njw1tmMy_dNOa;MM)_>77n}q-5#9kQxYQN>{I(}o~LErrasg{Aw literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/cacert.pem b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/cacert.pem new file mode 100644 index 0000000..84636dd --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/cacert.pem @@ -0,0 +1,4658 @@ + +# 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----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu +IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow +RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY +U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv +Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br +YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF +nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH +6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt +eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ +c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ +MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH +HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf +jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 +5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB +rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c +wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB +AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp +WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 +xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ +2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ +IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 +aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X +em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR +dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ +OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ +hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy +tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----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----- + +# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign Root CA - G1" +# Serial: 235931866688319308814040 +# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac +# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c +# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD +VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU +ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH +MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO +MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv +Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz +f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO +8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq +d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM +tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt +Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB +o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x +PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM +wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d +GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH +6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby +RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign ECC Root CA - G3" +# Serial: 287880440101571086945156 +# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 +# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 +# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG +EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo +bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ +TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s +b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 +WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS +fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB +zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq +hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB +CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD ++JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Label: "emSign Root CA - C1" +# Serial: 825510296613316004955058 +# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 +# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 +# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG +A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg +SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v +dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ +BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ +HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH +3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH +GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c +xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 +aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq +TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 +/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 +kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG +YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT ++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo +WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Label: "emSign ECC Root CA - C3" +# Serial: 582948710642506000014504 +# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 +# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 +# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG +EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx +IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND +IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci +MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti +sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O +BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c +3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J +0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Label: "Hongkong Post Root CA 3" +# Serial: 46170865288971385588281144162979347873371282084 +# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 +# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 +# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 +-----BEGIN CERTIFICATE----- +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 +mpv0 +-----END CERTIFICATE----- diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/core.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/core.py new file mode 100644 index 0000000..7271acf --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/certifi/core.py @@ -0,0 +1,15 @@ +# -*- 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') diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__init__.py new file mode 100644 index 0000000..0f9f820 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__init__.py @@ -0,0 +1,39 @@ +######################## BEGIN LICENSE BLOCK ######################## +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +from .compat import PY2, PY3 +from .universaldetector import UniversalDetector +from .version import __version__, VERSION + + +def detect(byte_str): + """ + Detect the encoding of the given byte string. + + :param byte_str: The byte sequence to examine. + :type byte_str: ``bytes`` or ``bytearray`` + """ + if not isinstance(byte_str, bytearray): + if not isinstance(byte_str, bytes): + raise TypeError('Expected object of type bytes or bytearray, got: ' + '{0}'.format(type(byte_str))) + else: + byte_str = bytearray(byte_str) + detector = UniversalDetector() + detector.feed(byte_str) + return detector.close() diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43dfe69b27e1f6cd9c6b8079875176194933d3a1 GIT binary patch literal 848 zcmYjQQE$^Q5Vq4a$pS+yJiwzLsl=9z7J(*&kYEzL48#f&6;hhUPM0o;Guta|>0T&5 z1c@hp3ID;bhzI@xPn_KqcF~>g?EB82eV6X`cKGY-j}Ny!gnptc;(-4YR6YVj5yb^6 z@c@_3z`-VVibm-UT<bTAX6X&Q(jWK`yR`WQ4Fc*NqmKU@1H9wt#_RX@jp=r<ZojSa zDHAd&o-@T##RVi>i(|8v^D2(D|L*Y3@yl07sX-etY+TT1pz;M6g_cO+l_U48=YV%t zH7K6As<}ifY`)L93KTZc1ybG$UEn32_$I~(ykLcZp|kiF5|A|&qD~lLRmy2zjS0_e zJO;KE8O;?VQVH1D4K3uLPDE1LjTkl#Oc~OL0_#+Eb`F&oQJk<@Qsx!gUBlG8Ug!Kr zk>SvQ<Zwv1xC{~@lKF6GF^k^etcIszl<?669LsG}M;eg9TgW{!=IVfa+Pmm%=`fdh zB~=1M^wz%=-L$9atv-}E6oL!wWn7er(yn1A%v)<WV~px%T5!prLxI5<$~vHzefy3? z8#4c#MYYJMiDJ<-5mCkq3ayON(?}Kj*=RPUJ^3(xkdEf3``v8uu}t?s##Pjh>b%~u z1dC#)SF#0_GiesB!bDV*izq!w1RNQ~abD#rj(6+1_SPKkn1N`4L4Jrs?BN?u05-(p z7OWk?3wS9n>qH4NLZSgix6e28x4FmqzW(I^il#}09|GAT_KH``O;aOyTylC|uqWmi MX>wcmI&L-o0)MFRr~m)} literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c0fb017978f60416e5865f0356ad99cb6800ba9 GIT binary patch literal 54735 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e634607090170e49d284f83ec3476f901b196975 GIT binary patch literal 1124 zcmah|%Wl&^6rJ%aZj`jpipPQ#tRm5xs;$@{1Wi$eL<&+^Sx6(tGfCZ!9WyftP1Ic~ z^*7k^CH#XWR)__^z>0gvEe#u(Xl9P@jql^!<DGW9`Q!7~58nbpzLTZp0e%5nAHcy0 zr;_9}rWCOwo!pIGi(TpEe(YQ9$sljU4N49P_jzzZcp&J)jYHn(lTP@PLZ}X{?)E0q zWcxECy2pv?3-eBm2SR~oy*uVvG3uMdh+dK&XN3Uk{rzmTcaUkLvcbe;<KktJ$eGSG z_}crg5BFHV$9iuMUcE^n!Jp+`A-xMgkeG53JC|fgIpxkp7`wvbF840Tg2p~zTQT6^ zl6WM>iW^lEQ`hCCSUoPhF*a`f7!E@WJtqt2#94sTxW-$+GxJTbAaFO%$w`PFP9P>d z>a0}0o|Hl<;G9$;V_A_I#uNrrKH64N%LCK7!Z}oT_)_;Q!S?4uRlX8h7+}HELJr|x zVJwx2){K22zjRcpYzj<9(?mtXvE)MOC_Rmg+#U|jrhHdFWqavhcDlVYoPWyGC$L6E z^gb%Hax*KmNu=D|&BdJSGYFQIcC)D{_*g|L%#I5a4S=E24sffSsSwJ21Y08@bd@$~ zNaq_jG;UqD`xl?cX%}C^b~y!}oTJLax6~?FI#jjbvba9h;IV394Zr{^l3aAaq8&Jh zGrzZ#Z}~s}&)Mjr=(PA(+E6CNXp)S?=2FV#7O(xC5T}d9F;+Dh%g1~o5w{roI7wvf zv7A*Qa0r?(Gj$uHstq`*_SHC3AtmSonYga2jTlL=B6<iwqnbk63R<4Eq0ZLw!BzY9 zgcR~qt=H;;`5KYeUzycjb<56lNouwF0*InPiYQGR`lgZ^*<pmw>h_*Lz+!OxEoy)6 EZy5I#i2wiq literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ec91726ae41d2bfd5b3788f592628dbabfa3ae8 GIT binary patch literal 6320 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 SH)J$_R%SLcsD8tlvHt?7<q&oN literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1087538578fe8fb006f1ad53b1517d0fff32125e GIT binary patch literal 2231 zcmb_d&2Jk;6rb6hU9TNGEg@|KR3b%1;EKjX4Jt^`7PU0ufQy=xN><Ux@r)Nc>yON= zL*i~EBuDCr8wZYDx%A)Qz<;neggErXofE$|n<k}%8*9I}Z{Ez#ypP{|bFEgZ{PEK- zkA9tJ?05FUBOu=b+4sN{Q#@e<-r}5OFYyL`%jayJDPM_0riAuqeoLregVn=l9G}#A zUj5RHwtB;OBW<S|<J#?S+Gaziq}HZ`MaK`FMvuJ@rdf+C*7DT+6V~O*Q~qJO<vSTC z97Zjn0~M;$A)E152su(^Czn)3%^k8<q^hchclikutW|+cXYz%k!`IDdGA=A=c06|| zWAyfq$i539Whu|t%<Fp@SNwZ&+sl~rV+Jl1@jx+b>^I@qT+$xKvfE2iZJyDV^)L_Y zWUP%L$MQ(Z-msTSna{~~C++QOIh+jg(%1#U<_mI5+f>FAZLKVnbuSlICtVZJc04aj z*-6@%mOrz<9yi9Ow~L@QcH5@W9VJQ|+vsdJ(qy%}wYRI*>~;A;XKR0Z^;&oO?V$5M zo_N^UY>a#3tG%I3+evbDZJ?*h?pabglDm4SMyAn0nv_o6+v+r?h!s|?jQ33hgD!zA z35+lB5Wndg{|@iUbFVvu2YM*X6c7rvZGxSIdBzZ8gk1W2D;evHJM8Pr2R!5EV#fQP zn?)*QkYR(qul(!SO!_+)9|Di~Ds;&ZO%r0*P2&JqG9?U(3<O5Q6H_Kd1uPGXJeWBQ z>Yk}O-BIYdsnI%A1T$xdodtUbWJzFr9u8Nz;1S*ne7bas>+ZN?zsVe;+aS9P1`nBC z0_WseF(MC0>U)3{Z`OThTRtD_RCY$gZcpi9N9R?_4t$Zr_5elYEH6wwv3C(itkPNJ zD)T~Tso>K$PqFmH?fwsg&8s*vkEkLh?fAbeJcmUefnK)oG#EYK>bP17LPRc{-$B^h zqrd?&!vin#?7~izd3|nQcW=OE#t;0=w^uOsQ@<~^J##CgdIp^OA;M1D60{K@=t;m3 zAd8guA%QHynn?NE+(fhrUzLlmcA|%rFnnJZ&ASeB4u18DgP3^*mgS<WwK4?!Ji2@D zLGzCMe6vVwfGSLN9yaf7$}c{1(9A>Wlyy-6GTPctHB`ndU<0#6%w_o`)#su66l5=h zF$YTzu=IEZ03}Y<NqinW0!=TR0s=DfIQi6ZsEk~Ae}n)h8P#HnN<@$r6-UTu<YV-f z0$!DW;JG>!dylX>Kq~ILkl)x@%lv+5zk;@eFba&yGmkT;ugutiIGPD)1~iw6nLtf= znb>A#EfYwokD!a4H5YDSe^5Torz#1X@zeF+ri)Miycs`UB=PWO41?V>t-WoRhof}4 zsPySM4DmlHrR7gBu2+k&QijY0Vy_XSw(vq0!(<f4+T?-KTa(yOeL0*P!f`z)ijdNi zmt7~PLtM^s;l!7cMkVq9WUqiRmmq=E2>go9LMc3p^hNwUh~`4@>7`Rr_s{k~jbo1P z8|n_YZz@s_Mrx9fT$OTX(oTvQ*T!9A%OkWsTvh3Q;TO4N2v$WU*N!fpj!qIOPvD2v z<GQ44kW`J!AWMBT;`3p(QjMxnwCK8TvmWGu#*Jr-LZ}_}oTA+tx((dAlg$f>w$7uE Q3kPmor2XljDzEx~18%YF3IG5A literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c11830bdd1d6740f61d54496a1a73ff3586f3905 GIT binary patch literal 3457 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93f096ef1371a20ceb2ee56ae52c2d3b118f2848 GIT binary patch literal 2888 zcma)8%Z?jG6s_*|Ydjtk5)g^Pqu8KWBzB?%MT!t4B!LYX(9DR1h14o{mF=FiyPc}C z=fPw(`3BZ(`4ax2w}?f4ffeUgyT{`hgD9)2tLt&@sdMkG_WiA`=3l@4@pG-s*q`iN zsi6ND)!afOne-CYXVRBJ;!XU%@3HTgtjOvcCaWqq4f+-7?XphoEmpJbw;tM#m$zPs zXdI_%*9xm5nkq|x&SO;b42@!aPqMx*y?#I@-Y~#9@P1X+WF7A{*^nD})@4&};@MCe zvL(0Puv4$!lx>)PC%^hMlW{t7#ukRfuQ*4Oqdeh;NbpI)h}(?Mm5zr;T=2mWCX9MD zQ)#65Fw+>D3T@+PmI%!;>VUia+e|w!1(0Hw9V;#s4rj4Tt4PIjWp4A>@`E@@_)say z?O52w>WnK`h0Vxfp~G6GCFUYd#2`_(d6ueT7j_G7<B96>J(yeF5RFATQU(^yIk<r^ zFr1|{%%@t-<7{RYJ4H&A7T6$KvUccNae;b&i3R8s_E)XCBhkWah-s^|GL|G2SUR)W zol=rVO$W5Q_he_UfOv#6#K1I;LxGBo=xEZ+j&X3(KT#u*ta`>lkuT56t+)$O1fPo} zmK<JEe42qz$2k$wXb7z|9}B|=N<j{(QX3CrCA$T)7tc#t3tp*=Bg6^OgYKl$>dBV~ zu)7jC7wI_woYPEI1d|czLwH2XC`&PdS*c7sO5rRQcFr}zUWS6gv^vdr1`Lg38WST- z&VrL4jAI041P?@6Y6YBTNob;Y5v~k%@;H{bNCmk>2}Fi-Vmz5B8B@N%P)xB3*O~(u z2F;6bbg0td3t6A<?EJ7(DqA@GoUs3;DSVVHeSgsuUrkdd@iIM^r&)KD%UCI5?84a! z(Uy?U%G`D$slzClA;?JC%W&l`KGfNSykHP48Wxa;ZU~M;#-v@hHS%%uQK2W*r>N#G zniKDYg}8Cidam^)LqD*U{i>~<(s=!Z?Ke)DhnpE!pTDi$g}ag0!U>Wf$=hKx(>f&Q zhwxzePN5ejD$O^Gc^BGwJ;_ERT%7sFNZIevS2}NmVJapn4D%YzVx)>3SGMEl6{C`2 z?wiT)OkV-rzklgXbv#F~^yWhMhFOABn_l#?XOnxw!Qos!Fb~5oqQTM2d-sRO2b1V7 z$|&va^``OkPMm^8lH7SPQOD988X9ypoU2r3x<{lDUcKTHc9a*Fcz1e4MB_BJVfc{b zYoTFYZSiY)$2Tv36T0P&h(x18&od7Ygk}4rGIWQ!-gYO@0Y>wxyT^0`{f?*c#ViDH zD(H9VbqmecsKz<hJHEcgywmZ_`}Cb9aOeFoI`Axfe*;l)gT40g=2?F~c<JlA5^rI} z%?FtGQCV1}6>h9@gT05*57_I#y;m_$>kvgJtitvyvi1<ibO`jVu5ag?Q6h{9Eq!oY z2<7cEM2f+@Rje4|9?f*V>C|7Wrz3W1x{8OB#A&3j(QA#GI?Y#{Ot}~3O&5#~E^oT% zbYO*e6h}_MyqT&)8@j1)Fler#VL{t#!KYXJHnm>cJN{^mu*;n*o+a-(b%_-zQ~1;? z2(I;Gehr!6QUsrikR(CU{D|$PUq4%8e$AE@9%m8OT<{<-yX?&?lxqkn(sF%d<<}j& z`yW!M6E2cq_Z+Ry|Bcp~egBtRBf%exnHc>yKm7@4{B%aeUz>O((spN4Z(?oU4C%g_ zC3MfU!tm8hB#T?89)>cD!cdd{U0Ugz)ccT{k7;jXs<Wxm_Q;t&7e;5Xq$#&PMKzSF zjrS{FqtOT&ZPdWcb*g%UpsFgJO-zyFwQR7De{*hr9cbS8vY`AGQ88qq;kSZ+0O_R; Avj6}9 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..261b00c11a4520a1dffadacf60d837c78851e62d GIT binary patch literal 364 zcmYj~u};G<5Qd#NY167*5aJo=P)unN3qnjC5fWX9kfJ2MKxkq|wi}v04J%K=J9tG5 zeFY}YW#LZu-Rb|O|K{WI@caGqNd$y^k$*+;zQxfFoN%uqF#+=G@o-JlDW|c|gP1}9 zVd2L;2;;suM#V>mLIlA<4dOoc9>}D(#}sn6cd4u8#8*BZ%0o;Bmg-L1Q430!QY57) zq^0+d7Y=hYjk5iXD09idMp>#ManiuR)+DBDz=m08Kz|T5a-j}Ck~OMqQv<9`6)R-L zF`eaWW~y0{ZCk$3SIK3bb?e!@*uB;HIo7jaE7p|Fv=rK;RW)7Iu;Y5Gop_j}1;M3a n`Ae!e7?#VrNzGZ)+332Kd{e>A3BK1yh=>lo06X$}{@?xuR(E8T literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25f5d71eeb3a840eca3012fbe5bc2dbcca579261 GIT binary patch literal 1131 zcmah|&2AGh5VrR(+mg0WegqOHI7QGdRfA9^#9vx*C@B?z%L>WbtetdQ?<UwzXrkUy zsjtD6C*d9Tia78JoS5;pkY2!%?awponejJYHkXzbe|-7&@p+Aq?__RxfM3AW+puuL zsU$g#DMjo^CwF7lVpn>(ANv-2GRSLjjgr@d`#d-$JP`iOjYD4RkVg2ELZ}8U@9cbN z?Y`U2v{6}iWU@i=vPk4aXBwQVtpU%9e#az6w3GB8D+E|?wMWuquO>#c4ieQ7W?v1u zLV;(wwZGNeVx2Z?zun$>lR}C=!#zj32|$pTauPddq(?dB&S@CC!s9OYPRWeMK44oj z;NXmSB*vO+<rN#hN|)jTaNv%?aq5S#7-HxNnK_5f44lR_-VDynH^Gd+UOOR&A$mB0 zpmeXXQ2Kf_6iNkfxeOW0ip(&kFrf0$wvbvLn9h}h=bL<vFP0!-Q=v*<2`vop;AtUy zurDx{%0z3%zLH-i8mepzOh)5GMZJOKLg^?yij3Uob&toqsh_aNX?Jq8vDuq`&eKOQ z`bG3U8fL?_tk5Qra;=$*Dc8pujdrrJDEL4{DfEI16Qx6F!O(VOeK=7e)O#PMMnLE? zU35b_y)j4R`o)7UF^a6V@E&T9Q((&3D}8%SErY2+RUI~qt7Qd_WgW`^5?GPs;sIDR z5=NZq?fH!JAN@aTuscv9DgKo<lu6MaC4CXirM&dWiw_zhb{MN;tXyO)AMlYxTxaal zD3O)N(pH8*Bk00R)HMjJuESC;owqa<Qi4X1ii^UQ5F-m#NcR9}R8&aoVcoMf)Y?_s zs5$*ql3J}K22D01ul{OQfaOZwJ*TT`s=|hp0a!K25#?z^|E;7#wj1Ho>Uq!ZVlk+I II<-IdH)`k<&j0`b literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..677855bf1809e7afb493fc238ff296d22eefeb49 GIT binary patch literal 2622 zcmbVOS#R4$5T-7QV(c95V+(YF9;kpuYMK-U+@P=y+F>kHhDaBUP=KPjD~T~hD!Zf; z3+PkwL;Bi((0|bXz}KP=`U|~hR+5j{F_Kc4(a!F0cXp0%cz=Ce|NW<5fA~>Vl;4zd zPZ7pjKw=DxDt%=~p*fm=rO-Ufy)5+eAQxy6<f4=dAeX2LvMS{w$YrX5tVy{9a)s(3 z>rz%hzCqVOUXyZ}uG>oW=8Wr&FeLGiBx6R5D4hrxc?t12BdK5%Bp#=uahxVn#UFc| zvV=@M|HvD$nyznpX)=!aCTV*SX@*`TRmf-5i)x1}acea3g0SYtldA5+4NspOjJANp z2f&!p&%xdEG}kZCe7{Hw{SqzqRaydD)l4^|X`0xHm#~?w6L_3)AP57i31?Hz1d9^1 zpAi}ihm3<r1gZ<-ku(a985dqiz<%Z@F(*D)e8@-;)#Pq-FhQB4Me{r`t6I)9*Nwah zbKOjL-APQ-5XWn-`z-as<x1IgY3!rQ{z1=h8+OYyvx;H2R>Mc;&Lg+^#4&zW_!?|1 z*&k7T%7bGtu72$C`Y;YDSXcLt>PdKSc=+O&J`i8KU-^e8NB8azXU`}87x0Xtx>KJ9 z)4M?g7YoC?4<>9z#S4LxlH6k!(U{klfvTf-L~VM)@m?B`K&BOnIsD1l3jx8KZ=u>l zU~djczf9G>M$7#QE3#5k>FZ2qYExll7~h~81gw(X?0C^Ag*4d?!i4eJ)3*&8q>X%! z4CRZ0JZCak-gFwCkR&Fa+-Wd4SOvAcjOk#oh$Sz8`5dciE*V~WejC|`z^v*TFTp>D zGE{gO87gEOtw*M1*oJGHd;1-8+cetQd#gF8*JzuL*|i#-OncneZ=hzT?sj`d!^+B5 z*K%8rce6sH)5*%qm$Cv(odta{TF3Kl0=okwHh^ixML1Sm%gOZ%fq9ooS=;CFVGxZL zwX*ZJZa=M+DZI`u)d$DiICCu2$CXa3v<=5-Ii|IfY1`cctL>UjrdnOc-7~Iq#rv== z0lJu(IQ#z{u;=;XAYuy#Snuor=?OAfZ1OrzyrmyXw$tc2S;^@2y1h&_9s5lVz?7_B zasbX=Z~&(C7OH&??7Grq8dYiemGUyzuPjS(!)DJ?7Wu3b9I-GM$1$CKf4y76Q%&p- z9zjI$e5hjrU=_yCA-^Qn0`MLOaVkh0K|erPe$7F1G~CDh#Rvb9T0jD8ljZ;{^0UoN z&XSZzViRDU5r8dBK{)xG9X`P2DCPkGdJxIO5#DP27HlI^tD4ISekjhR85Uc%F=B}e zn(o;K-{A3>&`M$U$z|u%F27+_^(*sTvy7dFV}563+JV(Eca6@IOkMtK`&}C_1J-W% zp(n(IL9e9zQ#kgVjj}07RQL!Mz626DwE}5Cg*?X<AL#T!A8rAOkAYp64GW+KA8Xm2 z)+&arg(pvDzg(XLXN~mCb>tMDp(C<TKt6D}%V1zbQiQB|k}y0;umpjK@xg#V=RV6I z3||t%#{*_dBRWZ-R!1acLVkTjq}8>YUbjP_yZdn@0%(o!DdK@f0{OS>*8jr2=l>x4 z8`)pT{sd-KD_6#;0#IaZ1HQL2y#s%46M%a+Q|%{v&2A?vwapy>s`B#eE5n0@*8p0C zM_s`+^if=~s@kHBsPW-b_`;CQRRTFjFymOzGLBOFssl3Z;o>9XTkKBqlw#p_<@PNg G;Qs-U7KHo& literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f8a84725fab8bd5eeb60164c7a14e5bf15d25e6 GIT binary patch literal 2613 zcma)7-ESL35Z}E!pU?K$NljZ?pyCJ;k`b-@g+K^FtHf>7Hck`=icX-#xm`PU@6O5Y zB~2_xLUN=^NJxk$9{b8m{{r6mAMOny9{R*PPt5GuPD3ihopx?+XZB-eelv5UTrU3k z?6<GuIYRy*FFh9Uw_vERfN;WTNFwS}io6jTk?EV7H$yAR`MJpU?I`c(^_&$tQNb@n zMZXx8{8HrlE+uyf&vE;Ra9hx^>6dxFMQY9q3ftFcT3+00%a%yi<X}@sn5ZrecrWg@ zl6E3i+QC*Y7Bw@iJZ#6^-F8>p>4k}qsf+qkwbY#`>P0mxE#323YlW?>E;Sye)#cXe z^{dyfFE&rl-CsLB_h5ZC7r-574>|@P^(7ENe9DP$aO#_U?kVX|ZgT6W;9HtUgB?F7 zY@X-N5gAiI4}5_aHSh2ecaMl);ALKcZ}BOyh+hJ?%%}4W6`XL%@YkXT&&F0yc_#$k zt`f>?dkevU3r_`GA`%N;dwW|Bz-?Y<AU!S;5hUOyPsE@FjQT+D_GC*)v3cN$w(5lk zo)p2L8~29o%}{tk1?_F&!E&|L>m;5MJG-zP&yoUE!=B*YAoh}h-m1q%ob);eUa}<= ztezfpMN6B3p`Atue$B~H&wxotLPun5^o<ea^ans#my8HAN2G5hxxRgi$R*&-em-%M z!kCUhWA<O1{iALPbibX++!L}g$VM|+C6jSHX-?C5P0wgr1-;kC1hEXkFq#0zQV76f z9gVu$*)*qiw}q4?xPR&}){A=yV`(9CE>n?oK_U?<0OWhi%|@%iTFWbI50~#OH<nTx z!XsiX(GfC_#6eZ({_VBfs4ENjYd=_BZ`^LmBL2*^A%c4X_GZCgH%`(sEDNjPEP&im zB1x;qQ+Qp>lhkGkQz*?z2uo5kQcH=jqwfc16&MS`wo;7!LjIQZZQ0uc<@#P*);oic z3#sbC<9ZTa>um1t@tf)+_F=Gj@c7z|&hSYTT!p6_*Ej0hz3t1r7!C@<%Qqu2<Z55x zq#kS!OdZHN-V&}{2Vem<A<M69AIJ*W_C5^t77#+K)TS<-hZiXhd-4u1{yQVCO#L2U z4Z-IGwwf?;j4h1j{sP8-iF|Y6kdCPGcFuG7GHXQp2FiENKO#vEb;f{5W@{|uHFYLP z*r*j`88+6Dmlu$O!U>_uqLZ4Th~-(FK8NHykeVScB9D4CD&Ii<O(bZs-r^HrR22xJ z6|mW&hW3IBba?)h)jEzdlhJe>i!hW81g?*ur2txe2l(jY^^vo4Q+I+H7PlkOz{NU2 zjp3zJ2fnQN|IXEBzxrHf3e4q~&O9C3sn)B{LtmktvdC!*+7S%2*=%;7-~D}f_W56* zcR@ox|LuiJS0s>5aR;kcAXZ?Bb|L}STgLG1Q@%K<KPzfEScpSM;TbUdKaVH??Z-o7 z|9iYC@ZTMpBh!UIkIX)GiF|JdIb&pu>7g~U60>hTHslsS(qsTXi}Z8c_!uzF5Ry4= zKBn@g#O~(-nhwkqS_F2$bwyZL1xZOu%)UFuvQ~!OEAXA0>OLYn_9OHgtgKnhI}&m8 z0tWOOjZS$9__P>{{Uj?I5&@Ow8tdz;>lv!i$kcAGZm^Yxd|gYk@?tM<v|uiE?yP>% zTw==`>4nT!*ln`iSd_K#EHyk>oaIMO12lCu4-zPEiA-sbC6zlZr&z$UoH+)t)e(ZX zU=y_fgwP^nP6aZj2(JxXkvi}q#ZfVa=S~F^cfdq(v4mqDKnX8077h4rh`h_#&Tc!L zNb-#FLBN<USvqf12kIEKf#g8Gjn;Tb-a&F1NLrrM)<A?IESn|Zv<T?@#}4u?426Zz z$yr8a-YvP7YdN;AG0j>fEl)BqtC|uMHLXtiIJ#!)SL`NfPQ<&B(yd2gv?ehWDuAvu jYc;yT=*E&&vf1U1OH=B6nt9?gyr{wk<${mT(hJr<iN$u* literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3058bce8e0231e3a44b09ea85b6b49161a8ad62 GIT binary patch literal 7370 zcmeHLOK;Oa5VrGh-ffeXcc~EKK#+plw1^8rloC<;L`hB-lI3PLrQkS`ofhbC;lPz& z!e2mpMI7=MII**~V>_5up^pGfEU$NVX1;lNcf8rfTrU0n)0bBhMM3x`_<y1xJYlr; zH7W=ofT#;CQ4vJ}E-4WrzKOCs29nc5ijUxE$Q@^6VYe&G^})vEV~{`;z{?(WT8IW| z2bb%!e&E@hS0uQsBuIpzNhASDNJ09eq$J^rl0s?jKiUiE`DoX_qn=@L4UYBoZSR?d z{s`-%w4cVPdHjRpA@nc0Au@>V%0-(`lr&sbG9(2Vk|r6*I$6oWH6_O+kIxE!7r(I+ zh{Lfvn2j*HuLu1eS_sXTogFtK_ZiUhdFNX5^N-U(SyzV7jpnK{0oRpDl7mSyK_+1e z@_a5$!3`zPq{Fl3x9RV@J`FzmGU0LajPzxEF}h=j7nsY<yGj9Om1&Y^GpazQp#am| z?-`h>3B{W|w#<d1NVA(-<Mp0FYF({MdRPZ~F>K=4M6h9HK<G)VIZUrArRPse<;8_E zO{}1nMT!#5G<40f)ULLp6PmS&rq<}TO`5R~)?rOFUTdbR6T_inhSnl9scXjWzP3wx zDYTJ!QQIz+=gZ~N%2qFdrjyvDgS@quG`XgAH1xoyvR<XqdfOzLv2|Bq0h$=3i2;nZ z`AggweIou-4{*iUGYprFiHpT1`HLSn&O#g~;+zvvl#Z@@c9Ha^>qwX9=@d!)WE>sz zS#!N&Fw%7XJI49^8#m5(W1NU{PDC*^R7E(=n(4jkKU}Rt)y#ZIX&hC##7(`OcCTC( z`eOsxm_i2MSq(5QF6qsjaqpb#g}uGM*l91OhpL%e_%sXWi5LD*h4Z&X(yLu3cIXcQ z##M31-TuX1x8vHyb`qnU0>}L$FJ7W?V(hmp6VG0$w5q5p8#NlQ)t9Sv8n0BV+w6?< zMZKnOR%o1YYjv7Oq1EN8x>4Cu>&s6!Dl~(fO?7koS!ILf*pVupsIF{rtgJ^e<*Obw zfKl)`zd)_M3_vl`2ZhX_J1!K;4SKa+4L~u{2ZhXVD3o)cJ`3hO+#zD~!;m}X-T^yw zmJc*jZnkwGrX@Gt%3Xb-x%2)2maK>BgT~H>w+oBS!*{L5Jp1h$a$WB1bxL~%JFwRE z(o%~Yg7x0QL4K<T#DKOb;}JHHu1u_k)w<vLK$DMJZP?ez<5_0i>ag!hHp-5kPjJOz qbK)&=PQ1*n+tFAgBDz=dRFDz-mN?7qJ7<E9*l6Kw@aGtI(C?oeHk2O# literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..165bcdc6832204393f58ce136a01035c52dda404 GIT binary patch literal 2417 zcmai0OK%%D5GMEKl`P4Q^Rk1YaDk?PiY7{s^l=D^rnZ^~V%e}16kW7n*Go!Xd3U97 zDc2U1lU(H5pU_JWz4c%8Kk(2?(L*l%0ll;{T*;7&K2|0<GknbO<2-z?S}p(f{m)<i zP$T45vhX=Te*!K48ahrmO-M=unp%NHk+%{%bpprGcH*X9;2GLUmQp|P4echSv>cQT z?Ip`;C8$vHi0~!upAqg0XKDvkUTTwi`85SKbxT+F<lrFAdTkXdp({IKbQovCaCNG$ z?Tiu?e|oCK)?p~yLg8v5VP<V>z~|d$n?SnJe7^N`Z#&MFj1NXC9%K)*FgeZR944=r z$*n=A#EDvv*NmLCci7JEcJo;ThMj-*jLP?b5G0_S1lB9krJQo>%nxis+uQ-#5iWPR zcSfc(@PIbA26~B?c=?P3K40b)7)!5+LxM7(P}R#ucX6u-A;AwvRE#aZ51k^4PRP{i zTT_@+wsNMxGgo<20^^eM%~+a{ei>JA0*BL9eObHtXegvC!6DjbEY4!Zm~?@aKFUgw zfsy5@^pL;G7qDX?f;Wc!OE|Y070{iFwJSv~6hQ0bBI&|dVk}C+JZJ1j@`q{+Wqb_J z+BgnnqdQ2rka;6IYN+IH_u%B1-_Ji}??(rxM|baa$KRyU9r$`#qth71!&`Bdt1wA! z-A~1s=O;M|O=HI*;{(}<z$3U&4Ka%P!=dqu+rv}245r?MmY1O;v_{L+hu^q({Q~LR zb0q#5@;6}PMaThIy8wR<tt0V#1FT#@3gQVcm#f8a2}NtzUB(Vqyaz4EC_|&hmlhuW zwt?}2E$9MU^9`KBb6Tyj2YYTk-81LTR24eT73m710&l{yFco+301G-|jn^0TEiU?B zwc39g4#Nyy`o9$WNtpFUVNamH&Xr!ke7+zu7Qrg?LUcNF&kx|nC%+ri=@fq3<f~s^ zT7bLNw<mOBZ9r7Lv?t*DefP+cEtv88OB}+W??Wq1tSRIsRqiiCKved~i<((mg|!@{ zwF}Y}kb(rxUY(Mc&cxytNPe0?Om9Fy^)GSz0gh|^%g9ZfDda$)t}ODPp;!UdaeJL$ zf1P}bCoHc2m)RG!&k5*rX8J6n?<!b&?a2C$$~)%l>r*nL*D=8R8%GZE^ZS70DtLz5 z8ozZj--N#+3N{a8wFyBxkei{}Jb>g0bFTqtBGIj0{|R6H1_Up>n9z12GFbt+E@zMz z8AP2D5>t<MoBR8_``Swey`GTT<>Fw}lUMMdYuMpKYOl51VLMIj6+5-}q|-*;|7`bp zYnwgkXt&*YxZly2d*GJQNJ^2x2yP0Bb(ulBC|DCg+UW|xW!0!Rrs&dkv(wz_JZU}B zE4_hYA{&f)hm40R)HQSFAnV3lWRcKo?Z><Oovr5`)_J_&1m@Xx-8C_(eFOq*l$yp6 zCbP6>s*aD=FvP(G(s?w=cfgE~pqV60=$f@^vPli{iDM}2F~8L4D$K4^kFL|QRkLce z0utXEuP%liUhO>G5MgY_``-itUX%1G_#^tXWhhG--=A7VI(H02@?BV5AY`ZEN!>2) z2UjwMjltN}m02D)+~2Q-2Ydl7$LJ&G3ga7#hF(M!$_SJWOel=OgRykLM+wpu#$JrV zq?j>@*CaaagC9cGQKt*Of>0XEb#+!FB9SCei_Rg3jApW?Ntjr$-iDT=XZp0VRB`a< zzhyFRt6tNt$VO>ye6aA=mGoei*NQNZm}~V~@zTbX(&C>BQ~scuVf|RBc0~d7`okzw nCq>2c;K&?GBbLe{)t_5i*p0So|3QJs$5=Ov!K?86v!DGJH;PLs literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d662f12446f8c24e67dd7912e427ffe7de6cf0a2 GIT binary patch literal 24121 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 F{s-2QFvkD@ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c281349a4016bef13c324049d64ca6084afdf080 GIT binary patch literal 1132 zcmah|&2AGh5VrR(+mf_Z1qdWgaEe5_R4w9y5Rg_JN(yS=vO=;pYbV{ty9u@vny9x_ z>T7W2Nq7NHdqo_01y0O(TSzb9$m4HkcE>Z{eA#I<R)2i{`r%tZ$ak`|JiyOk>pd`> za4JboV@eS_(#hS}wb+$j?#I5xo(%F@T%+U_;XV(}2@eEaxN*p9UD6DHQb^UL<?YTy zn(XDwi1u-!y289wqn=O@*=&z^Rt&l(F`|>C$5|o3dw2hR``~CV(?(^ziOELAiz1OT zooNWJ*&yq7Sm({&{_7O3__N$gq;~-b5>rlM=YsSpr`$OYV^?_G<=#12(AWoTYX%%# z5Rb%IbFI8#^H&w7*Z?j(F*$Di5R4&)o{@!f;w&I&T;na^nfWGI5IAdR<RruhCy<mL zHdjhtPsTzipq-Q<V_A_I#uO%0KKfQtO9j)p!cmmB_)`BYK?3GNmA(>M7~sLvLiXWY zVJwx2){K22zf3e%*%Zi(riqIBBguu*Q96u_-0t^Ir+imGVUN?^Y`DGCpMT2JN3aG( z^e!4_<5pH^lStXx&BdJSQ;kl$*;EvKq@onY$AyW+Bps@;9pct_rb4Lq0c?$c&^5YB zLpr~?MC8_0!`B!^R@?X;Hq0q7<s8lf_^fqsq}IUKq^b^w#g$oy$Fh!f01K>0a?u2j zcEAv4erNg0<(K|@Z5bSllt_wyT^q`z7)+9ZXf0iNt;?$ynjwxDt7EKOWh@`@i9}py z?BgVnRmAdEhQK2T!_3qMq*a?>%EskPQz0dY1gW?xtbrI=uu8fQK%=BWS`X@;^`Y3- z^WJ6q)sz$xRBl!hgCQG{SN}FEz;eS5c1drQ1Ov#TL64|UoBD4h6|&O^pH}TXyNAV~ J1nSiO+~4LM7fb*E literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c6d03688ba4bd079bb095ae175d9948acd3f8ac GIT binary patch literal 54744 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 I|Mdy{A15z;g#Z8m literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61391eebbfbd519f0b1f22a18d610e9a6697f046 GIT binary patch literal 1132 zcmah|&2AGh5VrR(+mf_Z1qdWAa3T_AsanJZAt0@|kb;z;N-HF5vv$&Ly_;Y=X%qF9 zN_`EkJP8lLZLf#}ufT~JZv*KC9C`fh%<g#Rn=d<!#_EsHUq5~e2>DKymIwGHY`q7D z6HX<`X-p|%M>@G1yB53B%l+85*poqCi))m;A>8M|1>u39b2kootwWmOPYS7;w7lIO zOOw5x8qqpRR7aTiYS<GBBAcxt&x%3EBu2E8^e8I?c<=6iXmt<wGHq1W8=Gucyebko z)tQFinhml}o3-EV?Y~Xoia*P}LV6c~ATi}6b}mVua>|{HFm{E<UG80wIgNe5wr0S= zCGkj%HP^};Hh)!NiVfhx6O-fCkH8pW=sB4?$Icvr#x>p?o|$igIf1iwPL4y2Z~{r` zL35?_^>`$d0@_I#GL{vYVN78{<)d#UwNx;jD;!06i!b%h5+q<IROu_Bg#jKsEo2|g z6~<DTXwBFc^2<acl}&)mXp*R?Ka^Z39i=Cck=y;=*@W-vXY6U(o1Sd%^k=7e`UKXX zh`P}z8*OEUHi?v5ySbQgeWuZAH=Brp4^@=H__#2U7^miRWQX{8G*uzg`vA5^K<FA> zr6HZ&Tq5%EqTy?dBC9R@4jbkam~swg0erUAJydJpYf@E*!{W-U!(&;;I)DXMB)ND9 z9_@f3&g{<emCG;v_u4Y(CfR9H{Oj6KCdFW!3<L^bapkox7cVqJ95GhMSh>nrKICJG zxX#$8aU!dT<*f{XM-YaYstri1Ho=sQtC^-kN)QQBu_&y87+J7Nx(`63q(WK`>YnwX z*w*vjRr}SH6cSW!RuY3D8<AK4HY>n#!wz;yZ<PcC$f7}ys85^vZzUD7(+Hne?Y+2% L#h?W0)c%~`?zR`Y literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..972d6a227c7a3d0dc83b9a8802eebce79ccf7bb2 GIT binary patch literal 38386 zcmeI*g_l*ww;<pqLJ|lGaY76Ygan5GQQX~<Ai>=Wm*DR1?(XjH?(XjHGX1e;)|$WJ zt@oStzByI3YuB!GZ+Du$=bTO*BSy3fqc@ehRxl#sT*UwPzu6x|L}ZL?*Z(w<iV-Cu zDn=<0rS}IF=aqOP(z!(<63>r}sIp_b|6TvHn)oZ7qDFG#jY!759m#L+MN;&`NKP4z ztyxHOvbat$B54;bl1qZGy`Eui<M$&O@opp;%s3rcz?GMdPDP1imbvTRjHHCP#rlp* zTJN1m21bvh9iB`7m-J1IzJcMARx-Cv%t*F6Y9!?8XOXlvtvfcUW%ui83W~1!ypA#( zcuPnj>7OX=vADgeDx`u}xT%@VjL$SHD{|mlkwlg1p>@9$a{c2-HmGW(;EMVZ+g4K{ zQLVPb(N9Lda1QQUJeq-Q;wl+fqKpBr_iLcA8P_c|PreqW6}HP)7Mkwpj4W?B`WrXR zt!^LLBxtYP*wX)KMnQd1<Qr_EL6W|Sv#+ai^s9m0HdssMW2V(K?To%1LVBUM(LsX0 z)vRPRr?^>OkKqd6?5K?j{#8MZk0SY5^Mv4d5@eU)fYB+c->LdX_}5m?8tAGy*||TW zmLq2TX$xho(a=Bw11Y6HAj@3?8_bOp`If&@O!J!6QtCTy@nK4<Vs1?Z9aH#Q_VJ!| zhYQJJjpH(>a&oqzp3w(V#nCKi?qYFy4IGx>nsdL<lCg|7HSn#{7Abs_`Zg;gpV2MK zs9}x4=B5!mUM(N0V7Y0hEi^>)Gbf^(kc=p6+8m@6vR?YF=H?eSN(JdOQ(I%cklOmb z)7Q{yIaK<+>dWh^DlUanGQ<Y+DKfwGvGiTEWHi(MakSY!&PcjaGjhd<E3542fum(c zzjw65Q6X8rag@$J{xz+t;6s?Eg4~wuuUSx$%Y;0!+I};Fff=&AGCJ0b*qT?Bb_qq5 zk@WSp4E!Xnp}C*f$7Q3p>@tCYw}lLp^fxmyi;HO>fp!0I+CPx=u(&2l%PZtBGd^~j zE`Jh9ZNc9<*_Rv@Rn<jnl#q0|kXuIgSiHG1J~8*1Z%|A0&5}8m)AW℞R6BT4<D` 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 V@d$6d@z$FWQU3S;{ZBgs{|D0=jsE}u literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8458f4526f6609e844672dccca1ad507c50556d GIT binary patch literal 1140 zcmah|&2G~`5Z?7)+$w3Is7N3#a3T_|=?~(95Hv--kb)FW7ShV`Zc?{vC+x066ZMu# zeGRTW3Gd)5;=n6#VrJbydV!60_VbKAGyBb#y;f`W$Cqy(tALR2WNCSTU%}RgU^wAa zlAOkrB6g&cyRmDrE4|#0eTzLA<c+vN$r0f`4=xE01f9Ea$QwP<4u4We)uz?mZYfQ6 zFg2oclBk|A@71U;6ht;UBc2t*o=J@8Ch1952=LxNI@sOY**(m(QCYt<*{FD3Byy@V z4bk;F%6eVaeRufgZ3;#HEcY7eeE@>Ql#|%GA_K}PcP_)&6&`oFcS+_n_5s_j0S8ya zBQbW}sG4<wy2%vpfD2E|j$1zgV~C*_WbT|ga|jyOcyoAWz6s_8&c+2f4KczAWTnUL zmCD!USSSU|lPY8^D>B2F!i364-%4uPU^-VgjcSuGF~Aa}U?x=ME1`t}COj?V0L~T0 zQkiJY*jMtajK(UP0H4t$QPE%|xllSv&mtpt2L1C1-`CICv$Q`w+u0k;KIiFESi>Uv z5RJ3(R#s?}NV&D2iy7DF8l85ti75C;MJY^>3lk0dIHIu~<o0-~LTLCAY>j}>HM&Ye zI@?^Pa(i**8=NAq9sCfl%qei?99Kd8omvB5o2n)p7T0DS9;+sH0z9xH$;D&vXa@{& zX7_H?Tz>2SbsHU&pcels9Ll5^mdQ|{2o^<eUUczBJH$C-gN#+HjO8O<O2kdZK9z~A zBbK`=1TH}xW~y#OUUdgd)w&*RDx?IZARCL$T8NPdE2oD5H0mm(&7kR7A1ZD=?_U#8 zPf8(2)kdu|n6wdj{jakstZv!qE{U$zVE|b)h!RC=Q~&LxMs^_Ki~4#mA7C>mgC?~< F=Qkt^7C`_2 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b817bf87aba2f564213806cf3553218fa11b88d GIT binary patch literal 2974 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 Mn^==4jzul!e;Kf=*Z=?k literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1822bf052b1b57eed81e9b41e6e85682d4b99270 GIT binary patch literal 44530 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 CuY|M! literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e39a5081ef3e07c5d9e5f44ac2e634ef11bc07a9 GIT binary patch literal 38669 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0f69d5f01b62c6611d095813a38adf6d49b363a GIT binary patch literal 24884 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35193df77069a01d6218a44102e391537f2901ee GIT binary patch literal 30435 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 E2NZo?FaQ7m literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc3c062e6f9a87891e2dd500ee32df9dd8f1823b GIT binary patch literal 24562 zcmeI4*^^yW6~=Fe4#t>ZB8uP$#({`U6Ox#K2w_SHW&i>SG{L6R_oUOLC-%MR44|ms zJe0m$rLX=A>bw6#zgkwACw<eRobI<0{iQzlKAcN;Cp2_Ye6@yeeS58S_c@m;sJngR z#`S;t^&gJ^d|Rva$JUj9Hnm!NdVXg|586K-X|;bcGSL3%$eOBEt!cl}{%-qw?eDjL z@XPB*uB!$vM}BxYGT8pnk=E9qUHo^i^y0q+{}lW~@RXn}I3@VH;Dn$ObOk2`vx46V z&IpbRo)x?-ct&toFfW)C91%P$NP@G1QNg%iTJU?pV}iYcCj?Il?i0KyctP--;1R(& z!I<En;HcnH!7jleK}YbQ;32`if&+q=1QUW|g42RI!9~G{;Bmp<1b-KNRq$ECoq~OW z{emwGrUb7DW(1!WY!}=i*edvp;CaFA0)2KDhXr2}>=b-n(EGGo7r!F-f?$i_F2S3E z&k1f53<-7%?iM^PxJPhauvzdS!A*h>3SJcq2tFzJu;3$t>jbw7HVSSLtQCAf(7SD| zi|Yl~3qB<n6ue)sPH=<ZeS$TD4T4VyJ}UU4;AX)d!Pf*g3O*+IxS;n>YvNab{_S61 z@BHO~y%*N+KXQ0z_wJqd4DDK2yDwGM>8;l<Y#u)~mPWg?qqC`9rP1lJxrNPhsT!}^ z)y#O+^Sf#C+`>)W^K+BqV^gDZvz^KA<a{-n#=4WU3pbvws=3i>W@2ixb82*|>UOKN zutAcYsyjL}HeD^On;M&$I5Rd;UD$ATa;80dwllQt?w#8Y-QMagEopK6fp&34g}MFf z)mP|4OiKv*h*MwC;Beilq-&IPTaqqM(ltuDUrE<3>GCAq!=zi4baRugVA7RNy3$FP zC+YeoUEib|o^;caE?Ls`O}bi1S1airCSCZXoBI|U(u13B72GD!Gn=*u^yDW!d`S;! z(xaL5949^7NjE&*A<)B|^k^o%CXycTq^CFOu}*qYlimwSkAKobpY;Any99ce%l*}V z`qw@ipT1r|>E7Boinm1Xyz=-_rtgBJH*vaO@PJ^C;6cGdg5W*;KkE@$j|%n*_6Z&n z>=!&P(EBJI5F8X75*!vhA$U^ol;DU!ui5mB;Hco3;90?Qf)T;<g5!c01o|3H`m(!p zUtW|oCO9D&7qkVH;G|$ea7r*Kcu8<tFeR84%m`)$bAp!zNzf5=1!n~Fg0q5ig7bn4 zf>#8u3cexurr<Tfw*=o7d`IxQKs#N13HBDz;B}~7y~QnFeF?q?UV`z0YH%5h()1-r z+3HL1YQ6+F^`7oG^oXy*66_$p+Tu$oAlwEJ-;&0Q&m$)li6CPI4;Lw7VF6SS!>Z51 zTSAMT&5ARK;YO1U5<#I;T(iQ>O`eOPw=7owN3xBuaAT}`V5i25gh>_2#tSI~!UBSf zYgT>M$V=l|_vYGO8o1F_sN|mR5U?|HZgI9Czs+p1Y%z)4N<uG}AZ8SE;niD|*%Bkc zuHvJxShxmMSfZ)RK}{=)12R!gin7Rto4asigJQ0!*g?5%<YHEKbzMd<i&3$R5-!=8 z4Imq_Ty4ZGdv(WO^l8Phn9WvV73?o}|4^~AoXbIr9_y+J<mO;#mSYW3X4i*ASd<}3 zf?9Yh%wm|Z3>bz)#BB1SiV1`ZnG0v~l!evwwH|s_yUZ?)n?)~?U}46K{w#)TSyZr) zU*=JlMV?Wa2#c&)(F;7Y!nGIzBv7#m5`7IFDt%Qf4LN2rDdr7}p^c1-g%q_BgMt+a zCdWbrYcW|=-n&-){;t7Z;vN`88x}LyD7ZEPWl$^@iTH+y<wO>;>D9Z}V7m-smh}?Z zh%u#&Y64X7FNW;JRKjigHCw;LYmjB~INW9<i$#+W3m40>B*H>I$1^gNu%gytxYQC` zW-E>~h$Ag#E?q@}3KGN^I>^QSS%NYXExPnlq%2D!&gB)v9FfRDv;i;NT=&!(#g>B< z53x}iOx}M*1JQa4Lo+It4NZc1p^!BzM~RrJzzb_dK#WS`OiuSuEJgy0l@LQdXBm$( zR*sb$A!0>fHfnQE4+6Q>p+YSdSuCDzVp#RH@RrbGz?>Ba<u(*C+Ql`CPAw6&5etB~ z5-l6SW@Ad@<+f`VBq~A=u(EJ1yK<JuN^DIrk&T)oGd^G7NU;d3MVSQTm1D)4n3rKJ zW^N2fE!(ikgTkE**UFG0Ybs6M5NJwXLLOTSQ3hmd#5gzhLT#~oD7HzHiYyee?_i4! znZ+E8&m0kBVYsGZ72!e-fdEdUVntXn3}Z1q-9sT37W)f}TK0m4ik0D-{EBcH8mqxX zK`E{z5~c##tQC9p>OWt05EgE6b?gOYTOx_r8rhr`<Xj?RB!b7MKo&~Vm>p@#;Tmv; zt;u-iM!PHwm0YJ$3xzUE*cmIrWtbQ+Tt;OZHfn<eD#b+vg%03RYxfii4M8RwvD}@6 zlC!KLN6E!<r?JV%;$k5cF~AbJ0i)AgyFsR+XpxB1aKi$~5`#>Zo-Ia`MhQ2D#$q{~ z0R;hii5PBJaU=pkA!do9yp?fyeZqL*(jT?(tRX6(tXfO(zd7fY7`u-vkh^+R@EKV} zP{>kYR!{)Ss4ZF~tPDMS%1BT_L#9Ups{zH7*<bF7vRJV{64rsabegk_j3{JcMuviw zqvT>#^ktb8n+%o6=D^M{6|y99w<LI$uv!j}gt@#~Ez7x7U{MAS0Xle_R&k=Dp0$zV zEk+c1c2GPcD0W(|4AGoaUomc7?pZY{>m}DluKQ4dY$|pJE)~R(DrO-!pg>01VmX%) z*k6OwVma)Y3iRwW)(P1tE74^bEH)Vvkthxrlm@(_fF)RVeFwqIkt0S!)}K|FTYsc= zYIn#EDoW8BdJ!`{vN<bvnjLA2K!rr8G}u9|XY|a<=^3Rjm%S9r`s%N!VhNUmd|2jE zMuJ#aY@Fo;8P_VBy164`VH^ns%j9zjixoeG-~p!m4tAqwJ^<!rb&KvE(U9V_qB0d> z;YI~9vyit6D}zTOEZm#`l%myOwy3p>)YoZ{v8*8y^&eyK0%$yE!85X*i;D`eoE3VJ zsP8maOAM8W(JmCM2Cbo2FIAuANc4!+TUKE%wRC_*HY~eqmNmC{5WEHyTXC_X>1WPt zQDO45hSh))WLo14Vn#teXB7qdQpu5v!^DxrEKSx^>a(ciEH0OAEk`C+Pp;24P%!~> zO`w>yy_k#2Vk{01E1<zal*Qq=s1PgmSEN{?=tjb_oJInRELJX?i&0?~mykpVpkgjO zEXc&nYCy4y73<bt!uss;4ZY0g+UIL-Zmgi>AV((FKpAq;if!apl8fb3qKyXRrD-?U zL4AzH7I}TO)?idSC?}tbQC2*oI83nu(Wcg-rRryE+Qzlw+4#7{u}EMoy89)Rie8w* zT8l(6Yvfh;@((L6dJ)BqTY`Il)&Jp9Ysxv5+!;}pOXLJrW6Sg(`BxYFE?n%^wF@^N z=>4Yj%&yV@|3&IsdcPd4AC1nWZipYUKG6G(>4UTFYHDHAC6S0;iflf1shH4jTIm=1 zwL!s~XNTv~<osB-8lE3Z!zX8_dOw5R86H19+@0EX^2E9M_Kwc3(VgQb&Y#}4{p5wS z)8lvb{!GjaKRrA*IX5&p)9H>)O%3gst}e7Y=Q;|;Kcn+i@5ipwu!d<@-C_L-_Jn?O zds=PYId^_x-F-dt%v5#%mR=j3qx!Akfx5qggLT=~z~K7&{JT9nIJjouzkk<VVgCnn Cn}*l` literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e26d66e200c018e719cf3e6df1e6542d411d6a05 GIT binary patch literal 23416 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 BHJAVZ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0dd89ff7fa4c973a368069796fddfd81cf16b658 GIT binary patch literal 24858 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 Qy4uh%aKJPF4t|dPFYV^k5&!@I literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33d1ffcc25e9ec3a7420e49eb7b8e6bfa8111c0a GIT binary patch literal 23395 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 BXoUa( literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24eb4eba165fd617644d591878e7443bc4158464 GIT binary patch literal 23413 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61487ec5b647d9bcae922eb9c9df3346ca99f21d GIT binary patch literal 2945 zcmc&$TW=dh6rP#Ac)eMtZb)ym++I+Pl$xlmTBM4ma&Jhvfm4uHfx+>N9VhFxGdoTb z<GheaeT1LDD=+*AUic6Dh7dye0lf5yb7qs;jzS^gfgR29nRCv}ocYcrxmhUqzyI*d z>dR?Dej}qFC1eiP$ybaJK?IFRn}(Dk&mz{gLJN2+w1piyf`qPc!klnJ4`g|f3w_~* z6Cxi5!Ve45{ohAUo_&mZ?a8x`(ftk}5R9SV!^)SAnW#NE&^iEp02U{8XI<yzaQJZE zaFuc6GIvCe8edL~i~u|uT_Zm(b4T>33BIQd5>ATA@Z1w3CPZ*RL?G$D6&6LIN=oMr zA=yZYriIFSO;x2{R-HAeKoB6;iknqk)AG;;t3#ON5OR_nT1XruE|MG)4@e#6s}GIv zOXh({5>m)j_JTC1pn@HEp(QL~ACS<Nj&Ou~K=x_q0-qC};d3G{e9(KD-(mg*u}SEI z*M&5gujy7in|WKuH{gfAcq`82eIS}>Iw1ROgYAP-kOASAq4t1mIGGI2ql+asb&_6J zDiy%C)Z@Grw>0Nzkw>*e^E#lz>%b;yfj5-g;`L51)>5U8l8Mv+n4QR|0l#^k8FKz3 zdD$y>Rcjj%EN|CTxzUM)R7ttMS=P~PV{K<!+)D27+x4~G&Dooc{_}SIL-?9;d8OQK zb!S>}qH9q!bE_@;BH2k$XeQs5vFNBWx+SD8M+S|qiQSFvu9}2L)DQ#=3ZawKh0(t- z3fhh1Cyt?q(XHUdcY$cc3!>GenoS$*w7uZ~o~9Q8ZfsFu5&(GC(#lhH4)`>9{Mn;V zdF8<hUwpQpiXc*Ws5*~^R81id9q))-I94@*NidlRcpA|D)R?aZ<1t4u)W%WFOhJt^ zegBi{(#+kvw?CShHFunTUm7565Hudw+A@Ou33^Ca|H{~<qgMZTcbYxuZ*KIWTHNf_ znzB1`+juyRE$YS>FhgW<npds?11U=ebf50go#g?2NWOf!#~{7g6|!e(23kwo5GLyq z0f{}Z1>Iz7PCFYegfX{_`@MnffL5?OP$T!i77Jpl_yy|nfT5KIR3W-0KfT&$MUdnC zc}uTz88@R=vd$x^L6)RP5#kj9bEQ);wNcCfG>e6fkWrQs`O5r*YSknJmS*ZMF0Jr| zN2$vpzu_><5~x4qOO8pA)LYxt64WZC_0-2u9F?Dq)psI;QoA9g&~Qp}5eT6^49`pt zei@yjKI@+!i!SbX6;<>Kr@?v^7{prB4F(7nF}pM%wP7Rn11N}1qOJ?J$Kq=!71kBB zhd;-FtTRn6LzJ$PJvLy1f#ot<0`E>68K9h7Y<@HS)01EO2lp}U&8M)38r+XWx8|Cw z-~IgO_0>P_119gG7Clt&07<Q+*EXn?tPCzkcc4=MP@TBZ5;CsKlMqcdA>oJWZ{e6D zumWl`gv(_Yq4qp#TORFS9Rq88Z)pM>Bo+@eNT2g|NAx1(1J1X4wJ6h=CS=M!^`J9B zZ`Hf%GCtu=B-ozS2SA{qW}&UiDB^tRH`LM_Xk>Z>w&ky3Cdha+a6Kom1KXQ44STUP zXFAcpCI;=-6Rf=~DrdLD`Z2*AIpDPOj2(8p%-C?J*`4OW(9WD<OosOkWv{n;b#m!^ zS~%)>+20Y<wo^yOy>^nN-X(A}wVpkEtgy;b>p``Gqza_+Ig%w@B3E5fZ{w@3A$bc4 qhHV(yjKjdD-n}e+K1Q=-9Y{a}W;2_f7*>(~mvJ!<{{f5)+x`nU1y^?f literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..688bc434ccb47fe7641227e47a3c3a8e3de1abee GIT binary patch literal 2236 zcma)7UvC>l5Z}FjIXh=3P5M_rF`$Ah(YRGxA*6zUB(#wlr%GIqPN3EKcI}*VzH|51 zA+g*S9MmViLtlC0Bk;y|*jL0uzXGZRGixVJq(oxvotxd+otd4T-|W3grTq7+KYw^u zA>=P|syV=a1--ZfgcD9v(x)M%$Xlt^w?n({gbpQ-2)DU&M7Sg9#138V?vT3on!>g^ z)s@xVNbU&rROW3V>y{3XOS0~cij>g7W)$xxnJ}XmwwyGykFEF)h#(>5B(yjUZNBi5 zbf~de3LV3{+&l6^S9pAm`$uF#!#Utfyli-%&-37jge6|#Rrr=)5{HEI;N_yex;ac$ z^39<VXZ#%1$~9=`3yr85TgE*?@N3U{@hLEhC^{w+t7nZVr@xwzjR~_k0qSszTU`q{ zmlJToZbFde(<tk*PLe7iU!&T(r`=*W5K_7@(mrEJmMF&b6`mAICheh0@{C1Ulpc<R z)TKD*5K~t4b(y76p;!!IhiE&6NITL)l~k7)i$Pd0_8a-<pfQliKHNcLKa!13o^m0J zM!eTh>D^BIV4vSFK4TB!_Tk>$d!5lw{rC>FZq{fu2Fc)dk`*dS)7$s^V#JGs0w+yp z`y%7HY@mHERHNTUt`KTq5@2O;C`;hYC(sKY2%$^VgWu@=^Mk!|eDoL-3LAb;;{6Z? zZ{s}y;h6Mnc@t^RnvET~0%K=7=5Qyc;%_zO9O$Tf61|y*+m!+wmh(7KMiSr(Dgh$+ zsp8ZEl0_t!fZT>&;3`6^aG0{`qjxVjl2L!=Jb0#6)PYVY@-rkm<OapuSZ?NOqd!PR zUt~(~bt!W>^JVJ9i6=Ukg_>niUpzo{CP%H&M;AD9dj0?OM=pWh3+(%t#>1#9K0jsq zqI*4Fdx9g(bWBte2MZ!{@Q1lsI)UFB`SJG`fSR7wv&VF7-2jlku*bG?dhVVjn;`Le za~yEj^P!i<)&xqED);6AX~9$SylU1~U@eE)>Y3REn1vb8y*ME+oG~C2W?lh$!4Aw{ z;`T%QF7=jiG<GK79%!7-fH&N}PLN(Bzu=CU{Cff#oS6p8Xt)fvuYm41X7AMrG2FEY zYQMhc$T!En!T2&{fZH5>aI2`ne+r-4ZlY>X6>?dNRILqV3uGpNC8p5pf1%ZHXjj5T z2yLe#Gg++5nK)1kAPWTs3#)e5x3{;pwU_4IF4PZ~i}tW9mq8>iBSC;^uesG?o9o(} z?$q8!YX`^vw_DGeYiy&X-JRCg+bzA^6;N@8QbLNF%7cax4hBBj=?KB0pqYwaT3c_e zueLUtkMu$}S4?F2u)E86q#|84dh)E3aFNAAFYP?u+HS2rYq8ej?R6MDS*yDShT6x& zgI`k91QLH%{)`15)0&|R1{x>$kRO6aUqCNbfMDTS1f=?aSf4tELpq&VvaZvzRkZ>b zgWMXua{+|#Xy-!*D+gR7>Cwpy%+|D;d<=r~5hPI*LZ1Scj&5CG^=zE5Pz3l$AnxIj zC^Od2`7lL3VC?xYN@tQe#&{kxW@@mhT-t}sf`>*Op1OSul<`GZW=}>e(iFCx1oXHJ znhJ=>#VrL^M&EX<su%cy6FB~Rrl2<AIjfv`1|$|H?TT#JFHEkPtTc<?+L&@^LHiG< P2m10Rn!yYX=%W1}$SNU@ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a5dc12db6775fe6d84f0524772c860caf9e62af9 GIT binary patch literal 1127 zcmZ8f&2G~`5Z<+&Kii=+<-m!1kXq9}(MkxR2B;_^sz@s&3u)zeH^J#TF}qIsqa2V@ zsVClnD^J2ZthgZ#yaFd?Hztj`){MUyuQfB@H{12P`}^CEk3TC2{X$E}0sI0?egQ`j z#T=zL#8_jCTd5t|2HV_8OJT`ihnLezSTVT7t7$E)8C>RW>V=-c74E0?ux@ab-%D4* z6@zR1e!3d2Vswb8OTBAEJ%(p?*r0v~HS2#cw9&+>(fSmL4$BY4Xq+93QI`qGx~C_v z_im%k(VNa9@?M>`j*b_he|WI9y}7lB_2;+mZ^PE{{?7g)bPtmL?jq86Pd?1U82VWp zO_o0L5jciIOi^f2=LYpKwWxhv3+)@^pwNL)N^0fZL94SgKs&a~-w5e<70d>cFTv#~ z$5S-32G$f){1xcW?HS4)uo74qtO8aAtAV*Q)UQqv@uq0t&yXe-Dq3xz$m7wlPkIT@ zfw8(O$#KSn@SujO5|Rv)oDiYw3O$S{X;;<`76S?0l&ERvf>V{uFfUa}Fv;?!r5wq4 zPx$Z=YSjpdc_bwv-_hTTAQQ<X%2_apM9>>?%7hH!vmoc2z3#<??#QQPH|}1ZZEp9j z&eQk_oc=I439=+xPlhs&IA7mM*%g%+QYVd(2^-Rp2x8a=%JLxX#<H)MV&2+Db}8;b zH;=*O18@j8EC(+?u66bBjuIRHnP}oR2nECpqm&V%Ttd<j9dnI+LOzcpKL28hsCqGQ z%s2-c*PxtnO)MH3>jn(hO#srUj7{8buBnC|0a#q>Ug#^z9p}Bh`8Y-y<;p=Ki-cB5 zd2AdHiiwS6%I|medKZ_pfacPfC^A}2<;58+d6Ci5Dz^)JUL>^4=BNC;$Y{+?ySJ0g Wk)BIcpUtUxu9sixd3}86vHt;gIUP6v literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..316c06bc548ff6a9a807117cfb35904fa5ee3a47 GIT binary patch literal 17580 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 Ypnt)~5NESyIcJvOeQ1XgWbR$@FRcw2$p8QV literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c1f2f9ce2f20e99e91ae6cea3a365ae1b085f34 GIT binary patch literal 2989 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b65a87e4b5b7a5dd0729873622954564167fbf98 GIT binary patch literal 1617 zcmaJ>-EP}96ecDA$hKt5j+17^{%(z}b<@;oFN$JFfMrG3Vt@?{AO;AsL_11I*&}5) z3EV3e=u7mX7rWV$>>YSJV8C8sSK}d_H0gj*;D^KS9Em*VeByo()c^YM$1f^C=udQG zl(hYwp7Onh6s4FUjtRzKJIvuOagFV=5-*c7uaF9_k}CIz$7`g<>!fb{CD!0R@p(W3 zvo5nHZ;=)cNodv;*5)13F?N-0@h<5a+hf~&hwK=;#_sT4vWw9%O6zIkElL{{uU+z4 z>JL#b_#5jZ_OR+4oy1~Di(@fc%zqNIF%_D<GtBZSqlXs--S{`Iit7HH<$DhYdq)={ zV=PNv&Qi)${lzSMBCNgjV_anU;C4XxGEQzYjpt+j<lw-*V-|yfS@awgnom4F7L=aZ zfVSOs|0AWtx^}0-1)Ihqi*p;gy*c4+T4&W7Js%!Cd@wqRGrN&a-^LDppkqN_U$MSj zUYDa|_Zcn3Std_RRHDmwJ=~2YKi39D1gD5N@6ZINICb87#C?ZKh?I2QUDX;M9u03) zJAp>P0P$!+A^4d5O+$eSyh3Z|)LA2p3b!b&vBt8&iovQu&tT19-C)C@Z!j>}G}v0> zslP%|ShUyZ4ScPW;+2-g8^_p=vE3Cu-C8*-ckN)bLZ{(rcZFd+b=O+Vn%RaEr3eyw z_5G-~qsnqIr$Th}v6UA^S)LV9Bp?+5d5JPW1)vJx0n`BM01W^i016<Q0BsGbIyZ`x zA_S@hR9n&_;vl+c<5U%TUeG*MWkI#GS5hTO*+c~=rm34SwasSJEQwiko9-?%x%iaT zVyQ(@!eS|-=y&wbd4DdlWn9qyG8X;GjHOh_esb0?*xqD(zDys<$I&1eU!3jjPcC2c z<bfX3yg%yCv-!O&mqpCjy+@p0rt(|@X=b$4$DWCPqW{5^7JWHR<P?5Ho7w&Oh3M*> zztvL$Al!5+_&-m%f_=@GuxETeu4B)+-2Fso_pjR0D?^L&nA0dy^$3c&U|{=E^s6p~ z^_ZPiu&F{q8Pg5@QlG&<4~s9r{t5uP{*9i}(codTe$~6HI*^y{$c>Z)gs7HI)Vge< zMkuPy;(VHHt`*ba|JROc!V6QlBW(1wmQ)8k<Ev}Idaw1R0`M047O)PGn`!}Pm0?*U zHs3OvQ-TOpXkNBAfsF*Enw&qD$68Pv<vrC=y1vh#UJ^>>V;_I*hB$P<(vSNu*>JQh literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d7cfa4e58e851ed77152d0b8d2ede9ab8272fc2 GIT binary patch literal 2443 zcmZuzOK%%D5GJ_~tz=17<ixRyqHur&sDLI)ko0i~il(-cIEWvx6ciO&u<Ioyue`fb zxGUEdl#^WKnxD{X|3t3+54;vA;A@Y)v@={k<Tkq^IV5K}!*5=CSgDl${Pp)A-d73v zgUmcO(BD8ye}YaBK_e2=4y8!5h{aaNGPD)hvD0x3ZAWfg=oAd?L|$C%6b<c0rFgD0 z7neI_N}dr>5Z(z9o}^Q&QxU}$X_QVWh-py0xH*cl@Y~}|uI~G)C9@qh*pmu&>Z=10 zCcReXXL8dI_QOQN>Qd{)Mr$ohGZpTQvT%?*N&M(I4O7@#z`fN$lF6fNX1RjPytT<U zx7XHRHkdA>jPs*)`Rs5bC;+W49_x%scYu(jLj~!ux1>u273{?8ScbNQ4YVyC;RyGH zOlijj+FTjvf+&j83F&xZPLyFRz9ly4lmLQ?E}>%ieFKC89~@CGw)7En8Oi8`Oj(~z zVKcKbdkS;zWbTx}Sjapx7AK@%LJmRTY`WE$(@r`XN~MZ$i1s)SlQ834;lawqwPIiZ z=4q_Z`1*#JftCA+>lnUwaIY5RuwE={N6A!XfV!Q^s0(9}^C0rml=I)n-)VEG!b7lJ z^Uzn#?jRCUrOn`=nMDt}dq;=jQTiqSJlH!vc<``0{y7fr!_!Ne?dC8X-VKv9^P}kQ zqgakbdIX1sL(}-7OvFGn1Mn3gvu4^4)1h&gd&6Tj2b$i2mX@F+v`S0VgLiEFBFFjO zISwBN{A2j;D&PRCl|z3HtgY~P1FM=x3L*&*SG9b&hD&wq7O+E(&!D9UG3qp~U0VH~ z!SISIX#Z8@_n-seq)&5uG9yQq@#+9PPy86-!AQ-;UCO);pWeqa7<7b<Z_Y@Z{rtm% zQBi?H*_QTR_(MMdLmLqv7N@<)PkJN2C(&KcWzJ%Lz8@HUfC*g+UC><gC0zL(Jz@rT zI)!(Q{P@=!2A5}jYeFY%8G`DKH38S}I|oedz>eE52nd6|2dy|^QyW5~)SrWZDDRNh zHN#s0-Y%?GudL3)YR#Noo02#7gb4;K?<Ww_%Lw>2VLisN-d`{?dtxs^Q2m0t_LNcF zyPogmbC8yEgQmi|30zAAC?}`>_nqM~9Kd_I`?~fW0Ug{k9hlMK257%{z}`{y)X2Cw z1*8nUghAh5KCp3qen(ij0d^~Fjc?saSKyb2#>#$}tw10T)QX?2>_Mu9y;FdnDD<{d zw8|-_h0}lFX?z5s4F;9kie#e7u&zr9WK<3@nMs9ysh#!R-R)iNMuT2YD(wilH|i<$ zJGF>i0h!#b?Ka<B*KYo$b~oBBoO@5VUu~`Njkb1L?I*i!z0d=H4n|7J1V-?05Ufia zl1V<zJ>Tw1DOAOXH>&93+Io9^wY{<ROwacQ8JEdm)Z6F6&wO1qXAY8XC}a{yU2i?# z-fgeGYV-E<-F29}Tx&QcdbEd-fR0Mj5aR1BDdJ_dhuUz&!9>?(h<yrbd<8B20y;vk z)0#;(RY*6sp|HpFQ>Ba4rFB*Zo+VmhRaT{C;P%*fekLsOZWrN*w!mh>;}amju#gA9 zUD4&4p;%@@W6JXEU>l4SW||x#EB22XR(?Ualc|Xu#;z`(rFk>^@4fJV@1dm_p2XZ? zygZ}lRaBwKKw-g5#5ov@#{)5nkS=rndgMp>j>*d=5o!-S5^7R*JmV_}rBPg0&MHVC zqX;V11>}%-Ojb1s70cOeXeoN8N6Uq>jjwmhWaO<zRnNzJXIU=ye}xXN>$zc#=fwHn z2~!K9v|%xsDSdf0bo;{~$&T{!=faUG)Jan}9hr>c)cClGhP)J9Xq)Sex@zxnj>y+o OSB%1CFn<2ltbYMlrA<iy literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16920e200f8a4e0eb64aee1f60df7f9659d05bab GIT binary patch literal 5838 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..329485d56dff02087a2c9af61fdcc6ec30e79eca GIT binary patch literal 1974 zcmah~Piq@T6rb6DTFEQh*nzfCN@!_{N^I36Ar6$fiLKZMTME*ef@m3}oslAGcO}oR zTwBN|8FI_1AE4J>@-=$v2bfb!q2N<{?y2w1+KwDrDwwx#-u!v*{pP)&9u$j(KYslA z+g}QV{7&Y67U*BYNcKQ*!f8k%+N2b9BQzqjX+~Dl(sMJkBd6(T-3oJ&+jJ?}CEVuD z1>ugMGqaiJxdth@mlUomQB~Z2*^&*BzL3MVkR?NTsP*D*BW<NZd55jwWiJ+b2HRJ* zhx~f+Y6&kn@}F<A#vwbb?Nkl|xcTO1UTKLBiXctONz>r8X}%&I$_;K_xJ^sz7PmpS zg~J`5yC5^#%z^Imyw+V_;0qT7!uNO)zJ*uBBFzOzWl<H-eU?BsbNB03fcfDMzZe9L z<Z}=yN$Hf#jJ`30#neo#8O)i@2}oy3`Z=_70$0;&$yIhT9tkOPa8$XB_2OR2n6zOk z9kk^G4GBvkRb=rvVo{p~0BWLaDH4$aK2{>a4t(>B1z{^m82gF*os>ticLE@nPg=6v z8HQZQq#O*&X}Hm8pPulC$z%2?XrB!>9&{$(N5L2H>&9ijJnD_sdU2Ar!f@?jBqlsL zh0A&)J=lqe`B0WI1TNC@IPGkX^y99N&SV}Uz6T?5K@hq~3)G>L)wckyUuXF50DcUo zZUYE_nHiKEVYD=GM)eZ!FWD0PXzZki8dNut3%EpOG5ai{X$i$L3fy)dMuOmG5l)up z;?tPk3Jza*8&6=Xa0>5cR3|p%y|$_Ey>gZLxN)RB{YWBZaVruVc-{a(jLCa*-sboG zuTz!f@gM%&uoZX5t*&@9=W8DM>-9j#0h=%%96GrlKsoJC=??j>eQp5iq)(^DjGmiQ zGd23=z>xP-t8ZfwzaYnsw&uY446N=gYaXmv=%inm0bm0gXBO!%aN{vC2wOOIzJX@w zdvLM{dtZaTI77?Qz>=@8@53DcwpqQzfTbpsW&Ogc5R224L4~G5Vg|~t)a$jn#3ocu zwdS+KigL0I%GviDICr1dj;cFs-&c0Se_Hp|Y8PH77)vQ)_(DC0BG$zNJ*n9#zf<um z+x~uaS1szj!?@GqA`XOFY3$YN{`Qg2{JnYwCI>quOP8E-+h?f&-%`;4s^F@7b*#EN z-j;~f5rRK~n3In{5NH+;hD)s*xky(G58B8zCQEZ=gXeC_1<}F8^)s%6!s$7*N+0-p zK;*qC>UzFPo{)3O%_)5!*k=lrteeTIcHiv&Ho5cW&#g;riYt!$YpY~rXcTMJ3fta$ zT4yinwP#?(&Qi`e4toRfPT9-5uyz0=!B!+Xm1PY7gSqf;V_EW$_pnPCQw7GNAs>gR zdyE~ATVb{$KZENuzvvcLE|3oJW_l)9aN!P$Pf^?j0Zf@OVIaZ~*z^W>=pD@mnhKC| zKY@{;2~amY$Fn`lv)olpDb-Rz6|Xupqd19JD_Z~!C%V|O>RZVkSr<)|{h?_BS5DLp ik|feZp0U(TBw0)thjPEnQvT{g3<ep^qsveVp7jqb!NPq2 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e317ba04cae9244318d659c6094eda7066bc3c8a GIT binary patch literal 443 zcmX|7%SyvQ6iwRHN~BxYcWD>Rw6r1=5fNRusbGtXB7{k1(u|$Vgqca&bnB0}b?ry^ z57`QSfJ;|SYxTl8+!x$)&#=?+KVRM-zZ}Q;u=tOL%`PqUu_fZn9pcVi>OM6{<Jp}z zNptFSz0I3HOPPjDl7ds9Yo?6`DR>1&f@WFHSyF+bMlo74u>g}&D5=s+3J^sWQ3W!A zIK_%k<0ndHuwo`<0yH&69^@5ZL0~u7Z-FkN9LGz%pgQpVF)mCh)fld^fGdv0ZVgTd z7D4n^UM@1sco561>u*}apdXBCH<)z2x*di@#$i|=h2dV9En3<tH+B2r=6-s6H+gl` zfwf^r-#N+^E3u)d#0n*n6Z;Q}m&ouz60J)z(r4jm997G~FxjlKxNl=2&<y1)?=hhb p=Dat`=!WRE-Zpoz*9DOZ?Y~5OG1h_l@ch@{i>(OlS@Ig5`vV32j^_XX literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/big5freq.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/big5freq.py new file mode 100644 index 0000000..38f3251 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/big5freq.py @@ -0,0 +1,386 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Big5 frequency table +# by Taiwan's Mandarin Promotion Council +# <http://www.edu.tw:81/mandr/> +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +BIG5_CHAR_TO_FREQ_ORDER = ( + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 +) + diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/big5prober.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/big5prober.py new file mode 100644 index 0000000..98f9970 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/big5prober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import Big5DistributionAnalysis +from .mbcssm import BIG5_SM_MODEL + + +class Big5Prober(MultiByteCharSetProber): + def __init__(self): + super(Big5Prober, self).__init__() + self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) + self.distribution_analyzer = Big5DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "Big5" + + @property + def language(self): + return "Chinese" diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/chardistribution.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/chardistribution.py new file mode 100644 index 0000000..c0395f4 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/chardistribution.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, + EUCTW_TYPICAL_DISTRIBUTION_RATIO) +from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, + EUCKR_TYPICAL_DISTRIBUTION_RATIO) +from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, + GB2312_TYPICAL_DISTRIBUTION_RATIO) +from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, + BIG5_TYPICAL_DISTRIBUTION_RATIO) +from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, + JIS_TYPICAL_DISTRIBUTION_RATIO) + + +class CharDistributionAnalysis(object): + ENOUGH_DATA_THRESHOLD = 1024 + SURE_YES = 0.99 + SURE_NO = 0.01 + MINIMUM_DATA_THRESHOLD = 3 + + def __init__(self): + # Mapping table to get frequency order from char order (get from + # GetOrder()) + self._char_to_freq_order = None + self._table_size = None # Size of above table + # This is a constant value which varies from language to language, + # used in calculating confidence. See + # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html + # for further detail. + self.typical_distribution_ratio = None + self._done = None + self._total_chars = None + self._freq_chars = None + self.reset() + + def reset(self): + """reset analyser, clear any state""" + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + self._total_chars = 0 # Total characters encountered + # The number of characters whose frequency order is less than 512 + self._freq_chars = 0 + + def feed(self, char, char_len): + """feed a character with known length""" + if char_len == 2: + # we only care about 2-bytes character in our distribution analysis + order = self.get_order(char) + else: + order = -1 + if order >= 0: + self._total_chars += 1 + # order is valid + if order < self._table_size: + if 512 > self._char_to_freq_order[order]: + self._freq_chars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, + # return negative answer + if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: + return self.SURE_NO + + if self._total_chars != self._freq_chars: + r = (self._freq_chars / ((self._total_chars - self._freq_chars) + * self.typical_distribution_ratio)) + if r < self.SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return self.SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. + # For charset detection, certain amount of data is enough + return self._total_chars > self.ENOUGH_DATA_THRESHOLD + + def get_order(self, byte_str): + # We do not handle characters based on the original encoding string, + # but convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency + # table. + return -1 + + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCTWDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER + self._table_size = EUCTW_TABLE_SIZE + self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xC4: + return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 + else: + return -1 + + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCKRDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER + self._table_size = EUCKR_TABLE_SIZE + self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xB0: + return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 + else: + return -1 + + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(GB2312DistributionAnalysis, self).__init__() + self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER + self._table_size = GB2312_TABLE_SIZE + self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0xB0) and (second_char >= 0xA1): + return 94 * (first_char - 0xB0) + second_char - 0xA1 + else: + return -1 + + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(Big5DistributionAnalysis, self).__init__() + self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER + self._table_size = BIG5_TABLE_SIZE + self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if first_char >= 0xA4: + if second_char >= 0xA1: + return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 + else: + return 157 * (first_char - 0xA4) + second_char - 0x40 + else: + return -1 + + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(SJISDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0x81) and (first_char <= 0x9F): + order = 188 * (first_char - 0x81) + elif (first_char >= 0xE0) and (first_char <= 0xEF): + order = 188 * (first_char - 0xE0 + 31) + else: + return -1 + order = order + second_char - 0x40 + if second_char > 0x7F: + order = -1 + return order + + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCJPDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + char = byte_str[0] + if char >= 0xA0: + return 94 * (char - 0xA1) + byte_str[1] - 0xa1 + else: + return -1 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/charsetgroupprober.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/charsetgroupprober.py new file mode 100644 index 0000000..8b3738e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/charsetgroupprober.py @@ -0,0 +1,106 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState +from .charsetprober import CharSetProber + + +class CharSetGroupProber(CharSetProber): + def __init__(self, lang_filter=None): + super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) + self._active_num = 0 + self.probers = [] + self._best_guess_prober = None + + def reset(self): + super(CharSetGroupProber, self).reset() + self._active_num = 0 + for prober in self.probers: + if prober: + prober.reset() + prober.active = True + self._active_num += 1 + self._best_guess_prober = None + + @property + def charset_name(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.charset_name + + @property + def language(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.language + + def feed(self, byte_str): + for prober in self.probers: + if not prober: + continue + if not prober.active: + continue + state = prober.feed(byte_str) + if not state: + continue + if state == ProbingState.FOUND_IT: + self._best_guess_prober = prober + return self.state + elif state == ProbingState.NOT_ME: + prober.active = False + self._active_num -= 1 + if self._active_num <= 0: + self._state = ProbingState.NOT_ME + return self.state + return self.state + + def get_confidence(self): + state = self.state + if state == ProbingState.FOUND_IT: + return 0.99 + elif state == ProbingState.NOT_ME: + return 0.01 + best_conf = 0.0 + self._best_guess_prober = None + for prober in self.probers: + if not prober: + continue + if not prober.active: + self.logger.debug('%s not active', prober.charset_name) + continue + conf = prober.get_confidence() + self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf) + if best_conf < conf: + best_conf = conf + self._best_guess_prober = prober + if not self._best_guess_prober: + return 0.0 + return best_conf diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/charsetprober.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/charsetprober.py new file mode 100644 index 0000000..eac4e59 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/charsetprober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging +import re + +from .enums import ProbingState + + +class CharSetProber(object): + + SHORTCUT_THRESHOLD = 0.95 + + def __init__(self, lang_filter=None): + self._state = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + + def reset(self): + self._state = ProbingState.DETECTING + + @property + def charset_name(self): + return None + + def feed(self, buf): + pass + + @property + def state(self): + return self._state + + def get_confidence(self): + return 0.0 + + @staticmethod + def filter_high_byte_only(buf): + buf = re.sub(b'([\x00-\x7F])+', b' ', buf) + return buf + + @staticmethod + def filter_international_words(buf): + """ + We define three types of bytes: + alphabet: english alphabets [a-zA-Z] + international: international characters [\x80-\xFF] + marker: everything else [^a-zA-Z\x80-\xFF] + + The input buffer can be thought to contain a series of words delimited + by markers. This function works to filter all words that contain at + least one international character. All contiguous sequences of markers + are replaced by a single space ascii character. + + This filter applies to all scripts which do not use English characters. + """ + filtered = bytearray() + + # This regex expression filters out only words that have at-least one + # international character. The word may include one marker character at + # the end. + words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', + buf) + + for word in words: + filtered.extend(word[:-1]) + + # If the last character in the word is a marker, replace it with a + # space as markers shouldn't affect our analysis (they are used + # similarly across all languages and may thus have similar + # frequencies). + last_char = word[-1:] + if not last_char.isalpha() and last_char < b'\x80': + last_char = b' ' + filtered.extend(last_char) + + return filtered + + @staticmethod + def filter_with_english_letters(buf): + """ + Returns a copy of ``buf`` that retains only the sequences of English + alphabet and high byte characters that are not between <> characters. + Also retains English alphabet and high byte characters immediately + before occurrences of >. + + This filter can be applied to all scripts which contain both English + characters and extended ASCII characters, but is currently only used by + ``Latin1Prober``. + """ + filtered = bytearray() + in_tag = False + prev = 0 + + for curr in range(len(buf)): + # Slice here to get bytes instead of an int with Python 3 + buf_char = buf[curr:curr + 1] + # Check if we're coming out of or entering an HTML tag + if buf_char == b'>': + in_tag = False + elif buf_char == b'<': + in_tag = True + + # If current character is not extended-ASCII and not alphabetic... + if buf_char < b'\x80' and not buf_char.isalpha(): + # ...and we're not in a tag + if curr > prev and not in_tag: + # Keep everything after last non-extended-ASCII, + # non-alphabetic character + filtered.extend(buf[prev:curr]) + # Output a space to delimit stretch we kept + filtered.extend(b' ') + prev = curr + 1 + + # If we're not in a tag... + if not in_tag: + # Keep everything after last non-extended-ASCII, non-alphabetic + # character + filtered.extend(buf[prev:]) + + return filtered diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/cli/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/cli/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3027065146e107ea8a6893d9a532a83c4769d48b GIT binary patch literal 200 zcmXr!<>h*|;CKup0|UcjAcg~wfCCU0vjB+{hF}IwM!%H|MId1W@vBt7peVB}u_RT$ zEU`#GEk7qEwWwG>Ia|LZ$1p9aqAbOv*gW1eIjJ(+&^WECJU7_@2-5TPL-Y$W3v@H{ zic1o6a&%2{Q>#*nD~dsaU>skTnwOGaq@SFTSd@}lqMw|TsUIJonU`4-AFo$Xd5gm) RH$SB`C)Ez*oMIqm002<mIA#C< literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6aae9d9d4e5029800537c81a91ed4ec93e935314 GIT binary patch literal 2707 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 N#^dKlccQyB_y6(0BFF#$ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/cli/chardetect.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/cli/chardetect.py new file mode 100644 index 0000000..c61136b --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/cli/chardetect.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +""" +Script which takes one or more file paths and reports on their detected +encodings + +Example:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +If no paths are provided, it takes its input from stdin. + +""" + +from __future__ import absolute_import, print_function, unicode_literals + +import argparse +import sys + +from pip._vendor.chardet import __version__ +from pip._vendor.chardet.compat import PY2 +from pip._vendor.chardet.universaldetector import UniversalDetector + + +def description_of(lines, name='stdin'): + """ + Return a string describing the probable encoding of a file or + list of strings. + + :param lines: The lines to get the encoding of. + :type lines: Iterable of bytes + :param name: Name of file or collection of lines + :type name: str + """ + u = UniversalDetector() + for line in lines: + line = bytearray(line) + u.feed(line) + # shortcut out of the loop to save reading further - particularly useful if we read a BOM. + if u.done: + break + u.close() + result = u.result + if PY2: + name = name.decode(sys.getfilesystemencoding(), 'ignore') + if result['encoding']: + return '{0}: {1} with confidence {2}'.format(name, result['encoding'], + result['confidence']) + else: + return '{0}: no result'.format(name) + + +def main(argv=None): + """ + Handles command line arguments and gets things started. + + :param argv: List of arguments, as if specified on the command-line. + If None, ``sys.argv[1:]`` is used instead. + :type argv: list of str + """ + # Get command line arguments + parser = argparse.ArgumentParser( + description="Takes one or more file paths and reports their detected \ + encodings") + parser.add_argument('input', + help='File whose encoding we would like to determine. \ + (default: stdin)', + type=argparse.FileType('rb'), nargs='*', + default=[sys.stdin if PY2 else sys.stdin.buffer]) + parser.add_argument('--version', action='version', + version='%(prog)s {0}'.format(__version__)) + args = parser.parse_args(argv) + + for f in args.input: + if f.isatty(): + print("You are running chardetect interactively. Press " + + "CTRL-D twice at the start of a blank line to signal the " + + "end of your input. If you want help, run chardetect " + + "--help\n", file=sys.stderr) + print(description_of(f, f.name)) + + +if __name__ == '__main__': + main() diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/codingstatemachine.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/codingstatemachine.py new file mode 100644 index 0000000..68fba44 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/codingstatemachine.py @@ -0,0 +1,88 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging + +from .enums import MachineState + + +class CodingStateMachine(object): + """ + A state machine to verify a byte sequence for a particular encoding. For + each byte the detector receives, it will feed that byte to every active + state machine available, one byte at a time. The state machine changes its + state based on its previous state and the byte it receives. There are 3 + states in a state machine that are of interest to an auto-detector: + + START state: This is the state to start with, or a legal byte sequence + (i.e. a valid code point) for character has been identified. + + ME state: This indicates that the state machine identified a byte sequence + that is specific to the charset it is designed for and that + there is no other possible encoding which can contain this byte + sequence. This will to lead to an immediate positive answer for + the detector. + + ERROR state: This indicates the state machine identified an illegal byte + sequence for that encoding. This will lead to an immediate + negative answer for this encoding. Detector will exclude this + encoding from consideration from here on. + """ + def __init__(self, sm): + self._model = sm + self._curr_byte_pos = 0 + self._curr_char_len = 0 + self._curr_state = None + self.logger = logging.getLogger(__name__) + self.reset() + + def reset(self): + self._curr_state = MachineState.START + + def next_state(self, c): + # for each byte we get its class + # if it is first byte, we also get byte length + byte_class = self._model['class_table'][c] + if self._curr_state == MachineState.START: + self._curr_byte_pos = 0 + self._curr_char_len = self._model['char_len_table'][byte_class] + # from byte's class and state_table, we get its next state + curr_state = (self._curr_state * self._model['class_factor'] + + byte_class) + self._curr_state = self._model['state_table'][curr_state] + self._curr_byte_pos += 1 + return self._curr_state + + def get_current_charlen(self): + return self._curr_char_len + + def get_coding_state_machine(self): + return self._model['name'] + + @property + def language(self): + return self._model['language'] diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/compat.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/compat.py new file mode 100644 index 0000000..ddd7468 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/compat.py @@ -0,0 +1,34 @@ +######################## BEGIN LICENSE BLOCK ######################## +# Contributor(s): +# Dan Blanchard +# Ian Cordasco +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys + + +if sys.version_info < (3, 0): + PY2 = True + PY3 = False + base_str = (str, unicode) + text_type = unicode +else: + PY2 = False + PY3 = True + base_str = (bytes, str) + text_type = str diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/cp949prober.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/cp949prober.py new file mode 100644 index 0000000..efd793a --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/cp949prober.py @@ -0,0 +1,49 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .chardistribution import EUCKRDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import CP949_SM_MODEL + + +class CP949Prober(MultiByteCharSetProber): + def __init__(self): + super(CP949Prober, self).__init__() + self.coding_sm = CodingStateMachine(CP949_SM_MODEL) + # NOTE: CP949 is a superset of EUC-KR, so the distribution should be + # not different. + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "CP949" + + @property + def language(self): + return "Korean" diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/enums.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/enums.py new file mode 100644 index 0000000..0451207 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/enums.py @@ -0,0 +1,76 @@ +""" +All of the Enums that are used throughout the chardet package. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + + +class InputState(object): + """ + This enum represents the different states a universal detector can be in. + """ + PURE_ASCII = 0 + ESC_ASCII = 1 + HIGH_BYTE = 2 + + +class LanguageFilter(object): + """ + This enum represents the different language filters we can apply to a + ``UniversalDetector``. + """ + CHINESE_SIMPLIFIED = 0x01 + CHINESE_TRADITIONAL = 0x02 + JAPANESE = 0x04 + KOREAN = 0x08 + NON_CJK = 0x10 + ALL = 0x1F + CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL + CJK = CHINESE | JAPANESE | KOREAN + + +class ProbingState(object): + """ + This enum represents the different states a prober can be in. + """ + DETECTING = 0 + FOUND_IT = 1 + NOT_ME = 2 + + +class MachineState(object): + """ + This enum represents the different states a state machine can be in. + """ + START = 0 + ERROR = 1 + ITS_ME = 2 + + +class SequenceLikelihood(object): + """ + This enum represents the likelihood of a character following the previous one. + """ + NEGATIVE = 0 + UNLIKELY = 1 + LIKELY = 2 + POSITIVE = 3 + + @classmethod + def get_num_categories(cls): + """:returns: The number of likelihood categories in the enum.""" + return 4 + + +class CharacterCategory(object): + """ + This enum represents the different categories language models for + ``SingleByteCharsetProber`` put characters into. + + Anything less than CONTROL is considered a letter. + """ + UNDEFINED = 255 + LINE_BREAK = 254 + SYMBOL = 253 + DIGIT = 252 + CONTROL = 251 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/escprober.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/escprober.py new file mode 100644 index 0000000..c70493f --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/escprober.py @@ -0,0 +1,101 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .enums import LanguageFilter, ProbingState, MachineState +from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL, + ISO2022KR_SM_MODEL) + + +class EscCharSetProber(CharSetProber): + """ + This CharSetProber uses a "code scheme" approach for detecting encodings, + whereby easily recognizable escape or shift sequences are relied on to + identify these encodings. + """ + + def __init__(self, lang_filter=None): + super(EscCharSetProber, self).__init__(lang_filter=lang_filter) + self.coding_sm = [] + if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: + self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) + self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) + if self.lang_filter & LanguageFilter.JAPANESE: + self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) + if self.lang_filter & LanguageFilter.KOREAN: + self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) + self.active_sm_count = None + self._detected_charset = None + self._detected_language = None + self._state = None + self.reset() + + def reset(self): + super(EscCharSetProber, self).reset() + for coding_sm in self.coding_sm: + if not coding_sm: + continue + coding_sm.active = True + coding_sm.reset() + self.active_sm_count = len(self.coding_sm) + self._detected_charset = None + self._detected_language = None + + @property + def charset_name(self): + return self._detected_charset + + @property + def language(self): + return self._detected_language + + def get_confidence(self): + if self._detected_charset: + return 0.99 + else: + return 0.00 + + def feed(self, byte_str): + for c in byte_str: + for coding_sm in self.coding_sm: + if not coding_sm or not coding_sm.active: + continue + coding_state = coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + coding_sm.active = False + self.active_sm_count -= 1 + if self.active_sm_count <= 0: + self._state = ProbingState.NOT_ME + return self.state + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + self._detected_charset = coding_sm.get_coding_state_machine() + self._detected_language = coding_sm.language + return self.state + + return self.state diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/escsm.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/escsm.py new file mode 100644 index 0000000..0069523 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/escsm.py @@ -0,0 +1,246 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +HZ_CLS = ( +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_ST = ( +MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 + 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f + 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 + 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f +) + +HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +HZ_SM_MODEL = {'class_table': HZ_CLS, + 'class_factor': 6, + 'state_table': HZ_ST, + 'char_len_table': HZ_CHAR_LEN_TABLE, + 'name': "HZ-GB-2312", + 'language': 'Chinese'} + +ISO2022CN_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 + 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f +) + +ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, + 'class_factor': 9, + 'state_table': ISO2022CN_ST, + 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, + 'name': "ISO-2022-CN", + 'language': 'Chinese'} + +ISO2022JP_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 +) + +ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, + 'class_factor': 10, + 'state_table': ISO2022JP_ST, + 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, + 'name': "ISO-2022-JP", + 'language': 'Japanese'} + +ISO2022KR_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 +) + +ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, + 'class_factor': 6, + 'state_table': ISO2022KR_ST, + 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, + 'name': "ISO-2022-KR", + 'language': 'Korean'} + + diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/eucjpprober.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/eucjpprober.py new file mode 100644 index 0000000..20ce8f7 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/eucjpprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState, MachineState +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCJPDistributionAnalysis +from .jpcntx import EUCJPContextAnalysis +from .mbcssm import EUCJP_SM_MODEL + + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self): + super(EUCJPProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) + self.distribution_analyzer = EUCJPDistributionAnalysis() + self.context_analyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self): + super(EUCJPProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return "EUC-JP" + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char, char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/euckrfreq.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/euckrfreq.py new file mode 100644 index 0000000..b68078c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/euckrfreq.py @@ -0,0 +1,195 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKR_CHAR_TO_FREQ_ORDER = ( + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +) + diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/euckrprober.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/euckrprober.py new file mode 100644 index 0000000..345a060 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/euckrprober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCKRDistributionAnalysis +from .mbcssm import EUCKR_SM_MODEL + + +class EUCKRProber(MultiByteCharSetProber): + def __init__(self): + super(EUCKRProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-KR" + + @property + def language(self): + return "Korean" diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/euctwfreq.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/euctwfreq.py new file mode 100644 index 0000000..ed7a995 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/euctwfreq.py @@ -0,0 +1,387 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# EUCTW frequency table +# Converted from big5 work +# by Taiwan's Mandarin Promotion Council +# <http:#www.edu.tw:81/mandr/> + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table , +EUCTW_TABLE_SIZE = 5376 + +EUCTW_CHAR_TO_FREQ_ORDER = ( + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +) + diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/euctwprober.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/euctwprober.py new file mode 100644 index 0000000..35669cc --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/euctwprober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCTWDistributionAnalysis +from .mbcssm import EUCTW_SM_MODEL + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + super(EUCTWProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) + self.distribution_analyzer = EUCTWDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-TW" + + @property + def language(self): + return "Taiwan" diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/gb2312freq.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/gb2312freq.py new file mode 100644 index 0000000..697837b --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/gb2312freq.py @@ -0,0 +1,283 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# GB2312 most frequently used character table +# +# Char to FreqOrder table , from hz6763 + +# 512 --> 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +GB2312_CHAR_TO_FREQ_ORDER = ( +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 +) + diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/gb2312prober.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/gb2312prober.py new file mode 100644 index 0000000..8446d2d --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/gb2312prober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import GB2312DistributionAnalysis +from .mbcssm import GB2312_SM_MODEL + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self): + super(GB2312Prober, self).__init__() + self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) + self.distribution_analyzer = GB2312DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "GB2312" + + @property + def language(self): + return "Chinese" diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/hebrewprober.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/hebrewprober.py new file mode 100644 index 0000000..b0e1bf4 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/hebrewprober.py @@ -0,0 +1,292 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +class HebrewProber(CharSetProber): + # windows-1255 / ISO-8859-8 code points of interest + FINAL_KAF = 0xea + NORMAL_KAF = 0xeb + FINAL_MEM = 0xed + NORMAL_MEM = 0xee + FINAL_NUN = 0xef + NORMAL_NUN = 0xf0 + FINAL_PE = 0xf3 + NORMAL_PE = 0xf4 + FINAL_TSADI = 0xf5 + NORMAL_TSADI = 0xf6 + + # Minimum Visual vs Logical final letter score difference. + # If the difference is below this, don't rely solely on the final letter score + # distance. + MIN_FINAL_CHAR_DISTANCE = 5 + + # Minimum Visual vs Logical model score difference. + # If the difference is below this, don't rely at all on the model score + # distance. + MIN_MODEL_DISTANCE = 0.01 + + VISUAL_HEBREW_NAME = "ISO-8859-8" + LOGICAL_HEBREW_NAME = "windows-1255" + + def __init__(self): + super(HebrewProber, self).__init__() + self._final_char_logical_score = None + self._final_char_visual_score = None + self._prev = None + self._before_prev = None + self._logical_prober = None + self._visual_prober = None + self.reset() + + def reset(self): + self._final_char_logical_score = 0 + self._final_char_visual_score = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate + # a word delimiter at the beginning of the data + self._prev = ' ' + self._before_prev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._logical_prober = logicalProber + self._visual_prober = visualProber + + def is_final(self, c): + return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, + self.FINAL_PE, self.FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters + # causing the Non-Final tsadi to appear at an end of a word even + # though this is not the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being + # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' + # for example legally end with a Non-Final Pe or Kaf. However, the + # benefit of these letters as Non-Final letters outweighs the damage + # since these words are quite rare. + return c in [self.NORMAL_KAF, self.NORMAL_MEM, + self.NORMAL_NUN, self.NORMAL_PE] + + def feed(self, byte_str): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew + # or visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is + # an indication that the text is laid out "naturally" since the + # final letter really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In + # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, + # should not end with the Non-Final form of that letter. Exceptions + # to this rule are mentioned above in isNonFinal(). This is an + # indication that the text is laid out backwards. +1 for visual + # score + # 3) A word longer than 1 letter, starting with a final letter. Final + # letters should not appear at the beginning of a word. This is an + # indication that the text is laid out backwards. +1 for visual + # score. + # + # The visual score and logical score are accumulated throughout the + # text and are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since + # that case is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with + # spaces) so the word boundary detection works properly. [MAP] + + if self.state == ProbingState.NOT_ME: + # Both model probers say it's not them. No reason to continue. + return ProbingState.NOT_ME + + byte_str = self.filter_high_byte_only(byte_str) + + for cur in byte_str: + if cur == ' ': + # We stand on a space - a word just ended + if self._before_prev != ' ': + # next-to-last char was not a space so self._prev is not a + # 1 letter word + if self.is_final(self._prev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._final_char_logical_score += 1 + elif self.is_non_final(self._prev): + # case (2) [-2:not space][-1:Non-Final letter][ + # cur:space] + self._final_char_visual_score += 1 + else: + # Not standing on a space + if ((self._before_prev == ' ') and + (self.is_final(self._prev)) and (cur != ' ')): + # case (3) [-2:space][-1:final letter][cur:not space] + self._final_char_visual_score += 1 + self._before_prev = self._prev + self._prev = cur + + # Forever detecting, till the end or until both model probers return + # ProbingState.NOT_ME (handled above) + return ProbingState.DETECTING + + @property + def charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._final_char_logical_score - self._final_char_visual_score + if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = (self._logical_prober.get_confidence() + - self._visual_prober.get_confidence()) + if modelsub > self.MIN_MODEL_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if modelsub < -self.MIN_MODEL_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the + # day. + if finalsub < 0.0: + return self.VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to + # Logical. + return self.LOGICAL_HEBREW_NAME + + @property + def language(self): + return 'Hebrew' + + @property + def state(self): + # Remain active as long as any of the model probers are active. + if (self._logical_prober.state == ProbingState.NOT_ME) and \ + (self._visual_prober.state == ProbingState.NOT_ME): + return ProbingState.NOT_ME + return ProbingState.DETECTING diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/jisfreq.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/jisfreq.py new file mode 100644 index 0000000..83fc082 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/jisfreq.py @@ -0,0 +1,325 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology +# +# Japanese frequency table, applied to both S-JIS and EUC-JP +# They are sorted in order. + +# 128 --> 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JIS_CHAR_TO_FREQ_ORDER = ( + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +) + + diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/jpcntx.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/jpcntx.py new file mode 100644 index 0000000..20044e4 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/jpcntx.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis(object): + NUM_OF_CATEGORY = 6 + DONT_KNOW = -1 + ENOUGH_REL_THRESHOLD = 100 + MAX_REL_THRESHOLD = 1000 + MINIMUM_DATA_THRESHOLD = 4 + + def __init__(self): + self._total_rel = None + self._rel_sample = None + self._need_to_skip_char_num = None + self._last_char_order = None + self._done = None + self.reset() + + def reset(self): + self._total_rel = 0 # total sequence received + # category counters, each integer counts sequence in its category + self._rel_sample = [0] * self.NUM_OF_CATEGORY + # if last byte in current buffer is not the last byte of a character, + # we need to know how many bytes to skip in next buffer + self._need_to_skip_char_num = 0 + self._last_char_order = -1 # The order of previous char + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + + def feed(self, byte_str, num_bytes): + if self._done: + return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not + # complete, we record how many byte needed to complete that character + # and skip these bytes here. We can choose to record those bytes as + # well and analyse the character once it is complete, but since a + # character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._need_to_skip_char_num + while i < num_bytes: + order, char_len = self.get_order(byte_str[i:i + 2]) + i += char_len + if i > num_bytes: + self._need_to_skip_char_num = i - num_bytes + self._last_char_order = -1 + else: + if (order != -1) and (self._last_char_order != -1): + self._total_rel += 1 + if self._total_rel > self.MAX_REL_THRESHOLD: + self._done = True + break + self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 + self._last_char_order = order + + def got_enough_data(self): + return self._total_rel > self.ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._total_rel > self.MINIMUM_DATA_THRESHOLD: + return (self._total_rel - self._rel_sample[0]) / self._total_rel + else: + return self.DONT_KNOW + + def get_order(self, byte_str): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def __init__(self): + super(SJISContextAnalysis, self).__init__() + self._charset_name = "SHIFT_JIS" + + @property + def charset_name(self): + return self._charset_name + + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): + char_len = 2 + if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): + self._charset_name = "CP932" + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, char_len + + return -1, char_len + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + char_len = 2 + elif first_char == 0x8F: + char_len = 3 + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, char_len + + return -1, char_len + + diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langbulgarianmodel.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langbulgarianmodel.py new file mode 100644 index 0000000..2aa4fb2 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langbulgarianmodel.py @@ -0,0 +1,228 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +# this table is modified base on win1251BulgarianCharToOrderMap, so +# only number <64 is sure valid + +Latin5_BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 +210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 + 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 + 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 +) + +win1251BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 +221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 + 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 + 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 96.9392% +# first 1024 sequences:3.0618% +# rest sequences: 0.2992% +# negative sequences: 0.0020% +BulgarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, +3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, +0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, +0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, +0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, +0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, +0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, +2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, +3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, +1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, +3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, +1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, +2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, +2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, +3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, +1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, +2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, +2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, +1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, +2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, +2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, +2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, +1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, +2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, +1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, +3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, +1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, +3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, +1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, +2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, +1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, +2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, +1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, +2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, +1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, +2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, +1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, +1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, +1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, +1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, +0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, +1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, +1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +) + +Latin5BulgarianModel = { + 'char_to_order_map': Latin5_BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Bulgairan', +} + +Win1251BulgarianModel = { + 'char_to_order_map': win1251BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Bulgarian', +} diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langcyrillicmodel.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langcyrillicmodel.py new file mode 100644 index 0000000..e5f9a1f --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langcyrillicmodel.py @@ -0,0 +1,333 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# KOI8-R language model +# Character Mapping Table: +KOI8R_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { + 'char_to_order_map': KOI8R_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "KOI8-R", + 'language': 'Russian', +} + +Win1251CyrillicModel = { + 'char_to_order_map': win1251_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Russian', +} + +Latin5CyrillicModel = { + 'char_to_order_map': latin5_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Russian', +} + +MacCyrillicModel = { + 'char_to_order_map': macCyrillic_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "MacCyrillic", + 'language': 'Russian', +} + +Ibm866Model = { + 'char_to_order_map': IBM866_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM866", + 'language': 'Russian', +} + +Ibm855Model = { + 'char_to_order_map': IBM855_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM855", + 'language': 'Russian', +} diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langgreekmodel.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langgreekmodel.py new file mode 100644 index 0000000..5332221 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langgreekmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { + 'char_to_order_map': Latin7_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-7", + 'language': 'Greek', +} + +Win1253GreekModel = { + 'char_to_order_map': win1253_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "windows-1253", + 'language': 'Greek', +} diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langhebrewmodel.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langhebrewmodel.py new file mode 100644 index 0000000..58f4c87 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langhebrewmodel.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Simon Montagu +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Shoshannah Forbes - original C code (?) +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Windows-1255 language model +# Character Mapping Table: +WIN1255_CHAR_TO_ORDER_MAP = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.4004% +# first 1024 sequences: 1.5981% +# rest sequences: 0.087% +# negative sequences: 0.0015% +HEBREW_LANG_MODEL = ( +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +) + +Win1255HebrewModel = { + 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, + 'precedence_matrix': HEBREW_LANG_MODEL, + 'typical_positive_ratio': 0.984004, + 'keep_english_letter': False, + 'charset_name': "windows-1255", + 'language': 'Hebrew', +} diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langhungarianmodel.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langhungarianmodel.py new file mode 100644 index 0000000..bb7c095 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langhungarianmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin2_HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +win1250HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 94.7368% +# first 1024 sequences:5.2623% +# rest sequences: 0.8894% +# negative sequences: 0.0009% +HungarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +) + +Latin2HungarianModel = { + 'char_to_order_map': Latin2_HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-2", + 'language': 'Hungarian', +} + +Win1250HungarianModel = { + 'char_to_order_map': win1250HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "windows-1250", + 'language': 'Hungarian', +} diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langthaimodel.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langthaimodel.py new file mode 100644 index 0000000..15f94c2 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langthaimodel.py @@ -0,0 +1,199 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# The following result for thai was collected from a limited sample (1M). + +# Character Mapping Table: +TIS620CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 92.6386% +# first 1024 sequences:7.3177% +# rest sequences: 1.0230% +# negative sequences: 0.0436% +ThaiLangModel = ( +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +TIS620ThaiModel = { + 'char_to_order_map': TIS620CharToOrderMap, + 'precedence_matrix': ThaiLangModel, + 'typical_positive_ratio': 0.926386, + 'keep_english_letter': False, + 'charset_name': "TIS-620", + 'language': 'Thai', +} diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langturkishmodel.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langturkishmodel.py new file mode 100644 index 0000000..a427a45 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/langturkishmodel.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Özgür Baskın - Turkish Language Model +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin5_TurkishCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, + 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, +255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, + 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, +180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, +164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, +150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, + 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, +124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, + 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, + 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, + 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, +) + +TurkishLangModel = ( +3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, +3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, +3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, +3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, +3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, +3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, +2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, +3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, +1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, +3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, +3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, +2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, +2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, +3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, +0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, +3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, +3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, +0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, +1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, +3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, +1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, +3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, +0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, +3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, +1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, +1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, +2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, +2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, +3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, +1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, +0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, +3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, +0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, +3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, +1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, +2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, +0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, +3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, +0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, +0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, +3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, +0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, +0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, +3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, +0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, +3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, +0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, +0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, +3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, +0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, +3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, +0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, +0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, +0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, +0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, +0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, +0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, +1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, +0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, +0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, +3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, +0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, +2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, +2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, +0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1, +0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin5TurkishModel = { + 'char_to_order_map': Latin5_TurkishCharToOrderMap, + 'precedence_matrix': TurkishLangModel, + 'typical_positive_ratio': 0.970290, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-9", + 'language': 'Turkish', +} diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/latin1prober.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/latin1prober.py new file mode 100644 index 0000000..7d1e8c2 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/latin1prober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +Latin1_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( +# UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) + + +class Latin1Prober(CharSetProber): + def __init__(self): + super(Latin1Prober, self).__init__() + self._last_char_class = None + self._freq_counter = None + self.reset() + + def reset(self): + self._last_char_class = OTH + self._freq_counter = [0] * FREQ_CAT_NUM + CharSetProber.reset(self) + + @property + def charset_name(self): + return "ISO-8859-1" + + @property + def language(self): + return "" + + def feed(self, byte_str): + byte_str = self.filter_with_english_letters(byte_str) + for c in byte_str: + char_class = Latin1_CharToClass[c] + freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + + char_class] + if freq == 0: + self._state = ProbingState.NOT_ME + break + self._freq_counter[freq] += 1 + self._last_char_class = char_class + + return self.state + + def get_confidence(self): + if self.state == ProbingState.NOT_ME: + return 0.01 + + total = sum(self._freq_counter) + if total < 0.01: + confidence = 0.0 + else: + confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) + / total) + if confidence < 0.0: + confidence = 0.0 + # lower the confidence of latin1 so that other more accurate + # detector can take priority. + confidence = confidence * 0.73 + return confidence diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/mbcharsetprober.py new file mode 100644 index 0000000..6256ecf --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/mbcharsetprober.py @@ -0,0 +1,91 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState + + +class MultiByteCharSetProber(CharSetProber): + """ + MultiByteCharSetProber + """ + + def __init__(self, lang_filter=None): + super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) + self.distribution_analyzer = None + self.coding_sm = None + self._last_char = [0, 0] + + def reset(self): + super(MultiByteCharSetProber, self).reset() + if self.coding_sm: + self.coding_sm.reset() + if self.distribution_analyzer: + self.distribution_analyzer.reset() + self._last_char = [0, 0] + + @property + def charset_name(self): + raise NotImplementedError + + @property + def language(self): + raise NotImplementedError + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.distribution_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + return self.distribution_analyzer.get_confidence() diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/mbcsgroupprober.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/mbcsgroupprober.py new file mode 100644 index 0000000..530abe7 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/mbcsgroupprober.py @@ -0,0 +1,54 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .utf8prober import UTF8Prober +from .sjisprober import SJISProber +from .eucjpprober import EUCJPProber +from .gb2312prober import GB2312Prober +from .euckrprober import EUCKRProber +from .cp949prober import CP949Prober +from .big5prober import Big5Prober +from .euctwprober import EUCTWProber + + +class MBCSGroupProber(CharSetGroupProber): + def __init__(self, lang_filter=None): + super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) + self.probers = [ + UTF8Prober(), + SJISProber(), + EUCJPProber(), + GB2312Prober(), + EUCKRProber(), + CP949Prober(), + Big5Prober(), + EUCTWProber() + ] + self.reset() diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/mbcssm.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/mbcssm.py new file mode 100644 index 0000000..8360d0f --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/mbcssm.py @@ -0,0 +1,572 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +# BIG5 + +BIG5_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 4,4,4,4,4,4,4,4, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 4,3,3,3,3,3,3,3, # a0 - a7 + 3,3,3,3,3,3,3,3, # a8 - af + 3,3,3,3,3,3,3,3, # b0 - b7 + 3,3,3,3,3,3,3,3, # b8 - bf + 3,3,3,3,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +BIG5_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 +) + +BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) + +BIG5_SM_MODEL = {'class_table': BIG5_CLS, + 'class_factor': 5, + 'state_table': BIG5_ST, + 'char_len_table': BIG5_CHAR_LEN_TABLE, + 'name': 'Big5'} + +# CP949 + +CP949_CLS = ( + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f + 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f + 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f + 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f + 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f + 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f + 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f + 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f + 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af + 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf + 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff +) + +CP949_ST = ( +#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 +) + +CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) + +CP949_SM_MODEL = {'class_table': CP949_CLS, + 'class_factor': 10, + 'state_table': CP949_ST, + 'char_len_table': CP949_CHAR_LEN_TABLE, + 'name': 'CP949'} + +# EUC-JP + +EUCJP_CLS = ( + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,5,5, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,5,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,4,4,4,4,4,4,4, # 30 - 37 + 4,4,4,4,4,4,4,4, # 38 - 3f + 4,4,4,4,4,4,4,4, # 40 - 47 + 4,4,4,4,4,4,4,4, # 48 - 4f + 4,4,4,4,4,4,4,4, # 50 - 57 + 4,4,4,4,4,4,4,4, # 58 - 5f + 4,4,4,4,4,4,4,4, # 60 - 67 + 4,4,4,4,4,4,4,4, # 68 - 6f + 4,4,4,4,4,4,4,4, # 70 - 77 + 4,4,4,4,4,4,4,4, # 78 - 7f + 5,5,5,5,5,5,5,5, # 80 - 87 + 5,5,5,5,5,5,1,3, # 88 - 8f + 5,5,5,5,5,5,5,5, # 90 - 97 + 5,5,5,5,5,5,5,5, # 98 - 9f + 5,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,0,5 # f8 - ff +) + +EUCJP_ST = ( + 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f + 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 +) + +EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) + +EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, + 'class_factor': 6, + 'state_table': EUCJP_ST, + 'char_len_table': EUCJP_CHAR_LEN_TABLE, + 'name': 'EUC-JP'} + +# EUC-KR + +EUCKR_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,3,3,3, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,3,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 2,2,2,2,2,2,2,2, # e0 - e7 + 2,2,2,2,2,2,2,2, # e8 - ef + 2,2,2,2,2,2,2,2, # f0 - f7 + 2,2,2,2,2,2,2,0 # f8 - ff +) + +EUCKR_ST = ( + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f +) + +EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) + +EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, + 'class_factor': 4, + 'state_table': EUCKR_ST, + 'char_len_table': EUCKR_CHAR_LEN_TABLE, + 'name': 'EUC-KR'} + +# EUC-TW + +EUCTW_CLS = ( + 2,2,2,2,2,2,2,2, # 00 - 07 + 2,2,2,2,2,2,0,0, # 08 - 0f + 2,2,2,2,2,2,2,2, # 10 - 17 + 2,2,2,0,2,2,2,2, # 18 - 1f + 2,2,2,2,2,2,2,2, # 20 - 27 + 2,2,2,2,2,2,2,2, # 28 - 2f + 2,2,2,2,2,2,2,2, # 30 - 37 + 2,2,2,2,2,2,2,2, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,2, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,6,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,3,4,4,4,4,4,4, # a0 - a7 + 5,5,1,1,1,1,1,1, # a8 - af + 1,1,1,1,1,1,1,1, # b0 - b7 + 1,1,1,1,1,1,1,1, # b8 - bf + 1,1,3,1,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +EUCTW_ST = ( + MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 + MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 + MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) + +EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, + 'class_factor': 7, + 'state_table': EUCTW_ST, + 'char_len_table': EUCTW_CHAR_LEN_TABLE, + 'name': 'x-euc-tw'} + +# GB2312 + +GB2312_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 3,3,3,3,3,3,3,3, # 30 - 37 + 3,3,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,4, # 78 - 7f + 5,6,6,6,6,6,6,6, # 80 - 87 + 6,6,6,6,6,6,6,6, # 88 - 8f + 6,6,6,6,6,6,6,6, # 90 - 97 + 6,6,6,6,6,6,6,6, # 98 - 9f + 6,6,6,6,6,6,6,6, # a0 - a7 + 6,6,6,6,6,6,6,6, # a8 - af + 6,6,6,6,6,6,6,6, # b0 - b7 + 6,6,6,6,6,6,6,6, # b8 - bf + 6,6,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 6,6,6,6,6,6,6,6, # e0 - e7 + 6,6,6,6,6,6,6,6, # e8 - ef + 6,6,6,6,6,6,6,6, # f0 - f7 + 6,6,6,6,6,6,6,0 # f8 - ff +) + +GB2312_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 + 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +# To be accurate, the length of class 6 can be either 2 or 4. +# But it is not necessary to discriminate between the two since +# it is used for frequency analysis only, and we are validating +# each code range there as well. So it is safe to set it to be +# 2 here. +GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) + +GB2312_SM_MODEL = {'class_table': GB2312_CLS, + 'class_factor': 7, + 'state_table': GB2312_ST, + 'char_len_table': GB2312_CHAR_LEN_TABLE, + 'name': 'GB2312'} + +# Shift_JIS + +SJIS_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 3,3,3,3,3,2,2,3, # 80 - 87 + 3,3,3,3,3,3,3,3, # 88 - 8f + 3,3,3,3,3,3,3,3, # 90 - 97 + 3,3,3,3,3,3,3,3, # 98 - 9f + #0xa0 is illegal in sjis encoding, but some pages does + #contain such byte. We need to be more error forgiven. + 2,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,4,4,4, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,0,0,0) # f8 - ff + + +SJIS_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 +) + +SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) + +SJIS_SM_MODEL = {'class_table': SJIS_CLS, + 'class_factor': 6, + 'state_table': SJIS_ST, + 'char_len_table': SJIS_CHAR_LEN_TABLE, + 'name': 'Shift_JIS'} + +# UCS2-BE + +UCS2BE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2BE_ST = ( + 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 + 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 + 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f + 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) + +UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, + 'class_factor': 6, + 'state_table': UCS2BE_ST, + 'char_len_table': UCS2BE_CHAR_LEN_TABLE, + 'name': 'UTF-16BE'} + +# UCS2-LE + +UCS2LE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2LE_ST = ( + 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 + 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) + +UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, + 'class_factor': 6, + 'state_table': UCS2LE_ST, + 'char_len_table': UCS2LE_CHAR_LEN_TABLE, + 'name': 'UTF-16LE'} + +# UTF-8 + +UTF8_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 2,2,2,2,3,3,3,3, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 5,5,5,5,5,5,5,5, # a0 - a7 + 5,5,5,5,5,5,5,5, # a8 - af + 5,5,5,5,5,5,5,5, # b0 - b7 + 5,5,5,5,5,5,5,5, # b8 - bf + 0,0,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 7,8,8,8,8,8,8,8, # e0 - e7 + 8,8,8,8,8,9,8,8, # e8 - ef + 10,11,11,11,11,11,11,11, # f0 - f7 + 12,13,13,13,14,15,0,0 # f8 - ff +) + +UTF8_ST = ( + MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 + 9, 11, 8, 7, 6, 5, 4, 3,#08-0f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f + MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f + MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f + MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f + MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af + MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf +) + +UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) + +UTF8_SM_MODEL = {'class_table': UTF8_CLS, + 'class_factor': 16, + 'state_table': UTF8_ST, + 'char_len_table': UTF8_CHAR_LEN_TABLE, + 'name': 'UTF-8'} diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/sbcharsetprober.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/sbcharsetprober.py new file mode 100644 index 0000000..0adb51d --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/sbcharsetprober.py @@ -0,0 +1,132 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import CharacterCategory, ProbingState, SequenceLikelihood + + +class SingleByteCharSetProber(CharSetProber): + SAMPLE_SIZE = 64 + SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 + POSITIVE_SHORTCUT_THRESHOLD = 0.95 + NEGATIVE_SHORTCUT_THRESHOLD = 0.05 + + def __init__(self, model, reversed=False, name_prober=None): + super(SingleByteCharSetProber, self).__init__() + self._model = model + # TRUE if we need to reverse every pair in the model lookup + self._reversed = reversed + # Optional auxiliary prober for name decision + self._name_prober = name_prober + self._last_order = None + self._seq_counters = None + self._total_seqs = None + self._total_char = None + self._freq_char = None + self.reset() + + def reset(self): + super(SingleByteCharSetProber, self).reset() + # char order of last character + self._last_order = 255 + self._seq_counters = [0] * SequenceLikelihood.get_num_categories() + self._total_seqs = 0 + self._total_char = 0 + # characters that fall in our sampling range + self._freq_char = 0 + + @property + def charset_name(self): + if self._name_prober: + return self._name_prober.charset_name + else: + return self._model['charset_name'] + + @property + def language(self): + if self._name_prober: + return self._name_prober.language + else: + return self._model.get('language') + + def feed(self, byte_str): + if not self._model['keep_english_letter']: + byte_str = self.filter_international_words(byte_str) + if not byte_str: + return self.state + char_to_order_map = self._model['char_to_order_map'] + for i, c in enumerate(byte_str): + # XXX: Order is in range 1-64, so one would think we want 0-63 here, + # but that leads to 27 more test failures than before. + order = char_to_order_map[c] + # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but + # CharacterCategory.SYMBOL is actually 253, so we use CONTROL + # to make it closer to the original intent. The only difference + # is whether or not we count digits and control characters for + # _total_char purposes. + if order < CharacterCategory.CONTROL: + self._total_char += 1 + if order < self.SAMPLE_SIZE: + self._freq_char += 1 + if self._last_order < self.SAMPLE_SIZE: + self._total_seqs += 1 + if not self._reversed: + i = (self._last_order * self.SAMPLE_SIZE) + order + model = self._model['precedence_matrix'][i] + else: # reverse the order of the letters in the lookup + i = (order * self.SAMPLE_SIZE) + self._last_order + model = self._model['precedence_matrix'][i] + self._seq_counters[model] += 1 + self._last_order = order + + charset_name = self._model['charset_name'] + if self.state == ProbingState.DETECTING: + if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: + confidence = self.get_confidence() + if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, we have a winner', + charset_name, confidence) + self._state = ProbingState.FOUND_IT + elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, below negative ' + 'shortcut threshhold %s', charset_name, + confidence, + self.NEGATIVE_SHORTCUT_THRESHOLD) + self._state = ProbingState.NOT_ME + + return self.state + + def get_confidence(self): + r = 0.01 + if self._total_seqs > 0: + r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / + self._total_seqs / self._model['typical_positive_ratio']) + r = r * self._freq_char / self._total_char + if r >= 1.0: + r = 0.99 + return r diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/sbcsgroupprober.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/sbcsgroupprober.py new file mode 100644 index 0000000..98e95dc --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/sbcsgroupprober.py @@ -0,0 +1,73 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .sbcharsetprober import SingleByteCharSetProber +from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, + Latin5CyrillicModel, MacCyrillicModel, + Ibm866Model, Ibm855Model) +from .langgreekmodel import Latin7GreekModel, Win1253GreekModel +from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +from .langthaimodel import TIS620ThaiModel +from .langhebrewmodel import Win1255HebrewModel +from .hebrewprober import HebrewProber +from .langturkishmodel import Latin5TurkishModel + + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + super(SBCSGroupProber, self).__init__() + self.probers = [ + SingleByteCharSetProber(Win1251CyrillicModel), + SingleByteCharSetProber(Koi8rModel), + SingleByteCharSetProber(Latin5CyrillicModel), + SingleByteCharSetProber(MacCyrillicModel), + SingleByteCharSetProber(Ibm866Model), + SingleByteCharSetProber(Ibm855Model), + SingleByteCharSetProber(Latin7GreekModel), + SingleByteCharSetProber(Win1253GreekModel), + SingleByteCharSetProber(Latin5BulgarianModel), + SingleByteCharSetProber(Win1251BulgarianModel), + # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) + # after we retrain model. + # SingleByteCharSetProber(Latin2HungarianModel), + # SingleByteCharSetProber(Win1250HungarianModel), + SingleByteCharSetProber(TIS620ThaiModel), + SingleByteCharSetProber(Latin5TurkishModel), + ] + hebrew_prober = HebrewProber() + logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, + False, hebrew_prober) + visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, + hebrew_prober) + hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) + self.probers.extend([hebrew_prober, logical_hebrew_prober, + visual_hebrew_prober]) + + self.reset() diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/sjisprober.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/sjisprober.py new file mode 100644 index 0000000..9e29623 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/sjisprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import SJISDistributionAnalysis +from .jpcntx import SJISContextAnalysis +from .mbcssm import SJIS_SM_MODEL +from .enums import ProbingState, MachineState + + +class SJISProber(MultiByteCharSetProber): + def __init__(self): + super(SJISProber, self).__init__() + self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) + self.distribution_analyzer = SJISDistributionAnalysis() + self.context_analyzer = SJISContextAnalysis() + self.reset() + + def reset(self): + super(SJISProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return self.context_analyzer.charset_name + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char[2 - char_len:], + char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 + - char_len], char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/universaldetector.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/universaldetector.py new file mode 100644 index 0000000..7b4e92d --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/universaldetector.py @@ -0,0 +1,286 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### +""" +Module containing the UniversalDetector detector class, which is the primary +class a user of ``chardet`` should use. + +:author: Mark Pilgrim (initial port to Python) +:author: Shy Shalom (original C code) +:author: Dan Blanchard (major refactoring for 3.0) +:author: Ian Cordasco +""" + + +import codecs +import logging +import re + +from .charsetgroupprober import CharSetGroupProber +from .enums import InputState, LanguageFilter, ProbingState +from .escprober import EscCharSetProber +from .latin1prober import Latin1Prober +from .mbcsgroupprober import MBCSGroupProber +from .sbcsgroupprober import SBCSGroupProber + + +class UniversalDetector(object): + """ + The ``UniversalDetector`` class underlies the ``chardet.detect`` function + and coordinates all of the different charset probers. + + To get a ``dict`` containing an encoding and its confidence, you can simply + run: + + .. code:: + + u = UniversalDetector() + u.feed(some_bytes) + u.close() + detected = u.result + + """ + + MINIMUM_THRESHOLD = 0.20 + HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') + ESC_DETECTOR = re.compile(b'(\033|~{)') + WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') + ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', + 'iso-8859-2': 'Windows-1250', + 'iso-8859-5': 'Windows-1251', + 'iso-8859-6': 'Windows-1256', + 'iso-8859-7': 'Windows-1253', + 'iso-8859-8': 'Windows-1255', + 'iso-8859-9': 'Windows-1254', + 'iso-8859-13': 'Windows-1257'} + + def __init__(self, lang_filter=LanguageFilter.ALL): + self._esc_charset_prober = None + self._charset_probers = [] + self.result = None + self.done = None + self._got_data = None + self._input_state = None + self._last_char = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + self._has_win_bytes = None + self.reset() + + def reset(self): + """ + Reset the UniversalDetector and all of its probers back to their + initial states. This is called by ``__init__``, so you only need to + call this directly in between analyses of different documents. + """ + self.result = {'encoding': None, 'confidence': 0.0, 'language': None} + self.done = False + self._got_data = False + self._has_win_bytes = False + self._input_state = InputState.PURE_ASCII + self._last_char = b'' + if self._esc_charset_prober: + self._esc_charset_prober.reset() + for prober in self._charset_probers: + prober.reset() + + def feed(self, byte_str): + """ + Takes a chunk of a document and feeds it through all of the relevant + charset probers. + + After calling ``feed``, you can check the value of the ``done`` + attribute to see if you need to continue feeding the + ``UniversalDetector`` more data, or if it has made a prediction + (in the ``result`` attribute). + + .. note:: + You should always call ``close`` when you're done feeding in your + document if ``done`` is not already ``True``. + """ + if self.done: + return + + if not len(byte_str): + return + + if not isinstance(byte_str, bytearray): + byte_str = bytearray(byte_str) + + # First check for known BOMs, since these are guaranteed to be correct + if not self._got_data: + # If the data starts with BOM, we know it is UTF + if byte_str.startswith(codecs.BOM_UTF8): + # EF BB BF UTF-8 with BOM + self.result = {'encoding': "UTF-8-SIG", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_UTF32_LE, + codecs.BOM_UTF32_BE)): + # FF FE 00 00 UTF-32, little-endian BOM + # 00 00 FE FF UTF-32, big-endian BOM + self.result = {'encoding': "UTF-32", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\xFE\xFF\x00\x00'): + # FE FF 00 00 UCS-4, unusual octet order BOM (3412) + self.result = {'encoding': "X-ISO-10646-UCS-4-3412", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\x00\x00\xFF\xFE'): + # 00 00 FF FE UCS-4, unusual octet order BOM (2143) + self.result = {'encoding': "X-ISO-10646-UCS-4-2143", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): + # FF FE UTF-16, little endian BOM + # FE FF UTF-16, big endian BOM + self.result = {'encoding': "UTF-16", + 'confidence': 1.0, + 'language': ''} + + self._got_data = True + if self.result['encoding'] is not None: + self.done = True + return + + # If none of those matched and we've only see ASCII so far, check + # for high bytes and escape sequences + if self._input_state == InputState.PURE_ASCII: + if self.HIGH_BYTE_DETECTOR.search(byte_str): + self._input_state = InputState.HIGH_BYTE + elif self._input_state == InputState.PURE_ASCII and \ + self.ESC_DETECTOR.search(self._last_char + byte_str): + self._input_state = InputState.ESC_ASCII + + self._last_char = byte_str[-1:] + + # If we've seen escape sequences, use the EscCharSetProber, which + # uses a simple state machine to check for known escape sequences in + # HZ and ISO-2022 encodings, since those are the only encodings that + # use such sequences. + if self._input_state == InputState.ESC_ASCII: + if not self._esc_charset_prober: + self._esc_charset_prober = EscCharSetProber(self.lang_filter) + if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': + self._esc_charset_prober.charset_name, + 'confidence': + self._esc_charset_prober.get_confidence(), + 'language': + self._esc_charset_prober.language} + self.done = True + # If we've seen high bytes (i.e., those with values greater than 127), + # we need to do more complicated checks using all our multi-byte and + # single-byte probers that are left. The single-byte probers + # use character bigram distributions to determine the encoding, whereas + # the multi-byte probers use a combination of character unigram and + # bigram distributions. + elif self._input_state == InputState.HIGH_BYTE: + if not self._charset_probers: + self._charset_probers = [MBCSGroupProber(self.lang_filter)] + # If we're checking non-CJK encodings, use single-byte prober + if self.lang_filter & LanguageFilter.NON_CJK: + self._charset_probers.append(SBCSGroupProber()) + self._charset_probers.append(Latin1Prober()) + for prober in self._charset_probers: + if prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': prober.charset_name, + 'confidence': prober.get_confidence(), + 'language': prober.language} + self.done = True + break + if self.WIN_BYTE_DETECTOR.search(byte_str): + self._has_win_bytes = True + + def close(self): + """ + Stop analyzing the current document and come up with a final + prediction. + + :returns: The ``result`` attribute, a ``dict`` with the keys + `encoding`, `confidence`, and `language`. + """ + # Don't bother with checks if we're already done + if self.done: + return self.result + self.done = True + + if not self._got_data: + self.logger.debug('no data received!') + + # Default to ASCII if it is all we've seen so far + elif self._input_state == InputState.PURE_ASCII: + self.result = {'encoding': 'ascii', + 'confidence': 1.0, + 'language': ''} + + # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD + elif self._input_state == InputState.HIGH_BYTE: + prober_confidence = None + max_prober_confidence = 0.0 + max_prober = None + for prober in self._charset_probers: + if not prober: + continue + prober_confidence = prober.get_confidence() + if prober_confidence > max_prober_confidence: + max_prober_confidence = prober_confidence + max_prober = prober + if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): + charset_name = max_prober.charset_name + lower_charset_name = max_prober.charset_name.lower() + confidence = max_prober.get_confidence() + # Use Windows encoding name instead of ISO-8859 if we saw any + # extra Windows-specific bytes + if lower_charset_name.startswith('iso-8859'): + if self._has_win_bytes: + charset_name = self.ISO_WIN_MAP.get(lower_charset_name, + charset_name) + self.result = {'encoding': charset_name, + 'confidence': confidence, + 'language': max_prober.language} + + # Log all prober confidences if none met MINIMUM_THRESHOLD + if self.logger.getEffectiveLevel() == logging.DEBUG: + if self.result['encoding'] is None: + self.logger.debug('no probers hit minimum threshold') + for group_prober in self._charset_probers: + if not group_prober: + continue + if isinstance(group_prober, CharSetGroupProber): + for prober in group_prober.probers: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + else: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + return self.result diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/utf8prober.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/utf8prober.py new file mode 100644 index 0000000..6c3196c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/utf8prober.py @@ -0,0 +1,82 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState +from .codingstatemachine import CodingStateMachine +from .mbcssm import UTF8_SM_MODEL + + + +class UTF8Prober(CharSetProber): + ONE_CHAR_PROB = 0.5 + + def __init__(self): + super(UTF8Prober, self).__init__() + self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) + self._num_mb_chars = None + self.reset() + + def reset(self): + super(UTF8Prober, self).reset() + self.coding_sm.reset() + self._num_mb_chars = 0 + + @property + def charset_name(self): + return "utf-8" + + @property + def language(self): + return "" + + def feed(self, byte_str): + for c in byte_str: + coding_state = self.coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + if self.coding_sm.get_current_charlen() >= 2: + self._num_mb_chars += 1 + + if self.state == ProbingState.DETECTING: + if self.get_confidence() > self.SHORTCUT_THRESHOLD: + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + unlike = 0.99 + if self._num_mb_chars < 6: + unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars + return 1.0 - unlike + else: + return unlike diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/version.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/version.py new file mode 100644 index 0000000..bb2a34a --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/chardet/version.py @@ -0,0 +1,9 @@ +""" +This module exists only to simplify retrieving the version number of chardet +from within setup.py and from chardet subpackages. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + +__version__ = "3.0.4" +VERSION = __version__.split('.') diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__init__.py new file mode 100644 index 0000000..2a3bf47 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c0080185fa6bf776c310535d579b2ba3f0b23b1 GIT binary patch literal 448 zcmX|7O=|)%5Z!Ne*QHngf(MOOOE0DLiynJXD1<^-H?ahhjU?+<{WZPzm-Ij6S}63? zdr!?M?ZCX5ym^`MGRgDw^Y#7d+w;5+m;VvC?#iXPb3i@n3s3skmjMoBh(j6S$Ok?U zu}p9xTev0LxGg)lbKpaf$_!_&k8qd9Gq0a~`EFG|vJtO%Z4=6lRUd0!Dxq{C3sSRf z4YGTsnT>9Wa%JOLy%WqPw;OGg?)x^ot_+{6M_x@%_wi^r9gZLRxlLguF9bJCg99A` zL;$e^8x`)FPT<@EXajU$lEI`_FR)Oj2ZoS_X~R`T$eX86Knn1q(OUDSs2OSsjh0GK zCqv~5)ndF{Y#TZ?=j5zh>{jE+a{nUBk&EXF&C!~#2fQ+MA;e%R*`AuM0rHUUwTdc@ f{{8_G0&WNyu6MS5Ar;*Sb_uQw80h&uzZ?7lU3PtN literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bcc9d4899447bc9344a6cad53f65e43a213f1d65 GIT binary patch literal 3346 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 IGO6SI2PQ3xxc~qF literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..acd95481c12f727f1fdab41a3d24a1e14c473855 GIT binary patch literal 7621 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 O26HCzyGTgQ-TWUezVIXf literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e75704651173cd839bfe02bf6943f0950e406c63 GIT binary patch literal 1669 zcma)6OK&4Z5bmCr$Kywm-4GrM!pZ^35{uc*A`oH`2$2JaT(EYLg|IsAi8IM~#;R`T zh4+FZ4oL7DxbjQ*4|7FA+P}bwui6_YS%Jiis=BMYy1V+TuX?xDO8)xokMDk{3Gt`6 z^#$mE4lx!=3oUaoShjK?o$U=g?P)*vC&3_)@K7Nng47_f4pd!-I=T{rMBme~u3yPP zLnpd{k!C87Te_)RS7IRtZQa&u7+urrdIRmcmfwi({TDb{?7xuEU0F50C`{HbpJm1F zqrDMNU4I@rUqZ|qP!>U+)M?WSD;M(ETL^?Eu$|oR`sBl-YLt|XhsNr1W~(}-CbdJA z=f4YzFzwXewl}5hRN1t5s;GBZ<~k+Q8=drQ{_ybN{8T?S9}Pbo9bB9|+&#QJn~Xld zH!gbp-ZYy&$O>bz<AcYO^irF1!-GzSr)i-}>W#|0BsEdJtjKJp^30^~PcJCM`S&1( z(HAn7ZlphQCPujB7~O4uMrZCf1#Md~7jrrH#{NRWk{UPvQCjcVR{?aWBJKm1m_F7* z)ru_}+kjVKoxcbJVZEWRYV7O0zK2)cc}1^yg{p27^OJ2HH*ISnfvu+!hp)eX`Q90+ z>61N`o3t}3i^Dt{S<^Yo>`_M*7oE}`rPNV0e$uB|+V8e2AH!AhROPeuE25Gr-&~j~ zTBe5hw$4b2Zj#1En-7|%`Z|dXwqa1JCU+*?N@VdovqN1LX%#JvDyDRt8H;(wyc<+? zHM6DTLRCZTrzzPg#E#jt3V8P$ZV*aEQ~_u1b@a?zP{P}kaTv+SOJwA4NvHh)Eiozo zovt0syrgTJ={oc*C#jAU`mlm)+J+7ZO5jcnRxMUdRx83TdoHp_ryScZ=1mO6Jc^i0 zZ=%17go}oEEFoqGYDuDBk<v>f^eM{b843qQgx<HS67t-A+*Vz$3Xn|X>*S2vTfw+E zTGu2W0)P7npX0&-M4n7M+Q!H#9Q4Jijyo{^A24lr-U4Qw&Ho0595AkU?f~;PmW`MP z{4u1f8haPUJfNNH3Y+^{{t`S7=ixDcp&hi|b5tMR7mweU*WgcEtTv%m4~{u1XSp6S zkC@O*({4oXu;1Mk#EhzHOM25Qh|(G+zlIpTqL2aprc17y=>~iI`~B_)@e5KVATi^f zX9o_Ts-f_H+VYIwPxlTkS>?FoV07SZV67{On><(Tms?F#p~k2fP8>02?$}#FIySo8 j$DdA0J<HS2IH!ge#0WI@ny87ubK=KgvK`mj^|<yApIu@Q literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a38c4e7bcd8c79f732e66f04eb0c551c1451f753 GIT binary patch literal 3871 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc1fb61c43c0003a24233ac9b0f028a5cd5bb41a GIT binary patch literal 4609 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/ansi.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/ansi.py new file mode 100644 index 0000000..7877658 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/ansi.py @@ -0,0 +1,102 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +''' +This module generates ANSI character codes to printing colors to terminals. +See: http://en.wikipedia.org/wiki/ANSI_escape_code +''' + +CSI = '\033[' +OSC = '\033]' +BEL = '\007' + + +def code_to_chars(code): + return CSI + str(code) + 'm' + +def set_title(title): + return OSC + '2;' + title + BEL + +def clear_screen(mode=2): + return CSI + str(mode) + 'J' + +def clear_line(mode=2): + return CSI + str(mode) + 'K' + + +class AnsiCodes(object): + def __init__(self): + # the subclasses declare class attributes which are numbers. + # Upon instantiation we define instance attributes, which are the same + # as the class attributes but wrapped with the ANSI escape sequence + for name in dir(self): + if not name.startswith('_'): + value = getattr(self, name) + setattr(self, name, code_to_chars(value)) + + +class AnsiCursor(object): + def UP(self, n=1): + return CSI + str(n) + 'A' + def DOWN(self, n=1): + return CSI + str(n) + 'B' + def FORWARD(self, n=1): + return CSI + str(n) + 'C' + def BACK(self, n=1): + return CSI + str(n) + 'D' + def POS(self, x=1, y=1): + return CSI + str(y) + ';' + str(x) + 'H' + + +class AnsiFore(AnsiCodes): + BLACK = 30 + RED = 31 + GREEN = 32 + YELLOW = 33 + BLUE = 34 + MAGENTA = 35 + CYAN = 36 + WHITE = 37 + RESET = 39 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 90 + LIGHTRED_EX = 91 + LIGHTGREEN_EX = 92 + LIGHTYELLOW_EX = 93 + LIGHTBLUE_EX = 94 + LIGHTMAGENTA_EX = 95 + LIGHTCYAN_EX = 96 + LIGHTWHITE_EX = 97 + + +class AnsiBack(AnsiCodes): + BLACK = 40 + RED = 41 + GREEN = 42 + YELLOW = 43 + BLUE = 44 + MAGENTA = 45 + CYAN = 46 + WHITE = 47 + RESET = 49 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 100 + LIGHTRED_EX = 101 + LIGHTGREEN_EX = 102 + LIGHTYELLOW_EX = 103 + LIGHTBLUE_EX = 104 + LIGHTMAGENTA_EX = 105 + LIGHTCYAN_EX = 106 + LIGHTWHITE_EX = 107 + + +class AnsiStyle(AnsiCodes): + BRIGHT = 1 + DIM = 2 + NORMAL = 22 + RESET_ALL = 0 + +Fore = AnsiFore() +Back = AnsiBack() +Style = AnsiStyle() +Cursor = AnsiCursor() diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/ansitowin32.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/ansitowin32.py new file mode 100644 index 0000000..359c92b --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/initialise.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/initialise.py new file mode 100644 index 0000000..430d066 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/win32.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/win32.py new file mode 100644 index 0000000..c2d8360 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/winterm.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/colorama/winterm.py new file mode 100644 index 0000000..0fdb4ec --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__init__.py new file mode 100644 index 0000000..a786b4d --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import logging + +__version__ = '0.2.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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a63103d0bc5cf7b5059924de5a192fa3daa7611 GIT binary patch literal 1046 zcma)5!EVz)5S_Ih+i}_|6omKygycixmKMPQp-NBzQk4TB0T$BA^=^WjwVkfr&_>+S z58=v}@DF=MLgE)VF=Mw)KpdFWjAwV>&dk0Y@2;;0KfZkXa9{y^hZX6ezmHlKXaoqR zAO>N@>^TTqI2RxsX)Wy7KJVjhM?vny4uiK)+;c#7CV_s%fCl1S;UV6WaO~m<=RFkG zJHVMI{RNA=vU?mzX8{YwFwbiU{hyc<hV#z$;QruIN|P&L=<K6bYiK0IOh9Zkhb+^7 zmQ}UNjt<UJIjys@7>2g-IWLl2a&7|7^HQ8D^4B;&IZaf%^A)s<(HisXB%11Mmeewu zB{~|FN=RKr=_IPv&gkfDCibd_{6TtjKH1qF%|GSoHp;k&-bB-Ex|J1GohY@nm&>`R z&MI1Ll+R=#N*#%|#EA2($ZF09({qi~1JPZP<FjTSGSeHLD)k~Mgp&FX4hXhS_`7J9 z90=<IV!M5u*byD!;=Cg~B2@bbP3a&BeTm4YsFj080D{=CVIZ`OQ%N;4u9j)3#gZHC zA=J1Zo02x^EGo=5SLz(JoBx|hcQJqt$Xvfbo5hiNR^P;pHb;Lo2W_QPKM8&5KFwVy zl7P>^uWp1iI;u=3A!}3pl_f~E#HT()#4SA9=DNL_YY7;JuC@`Ri7?$ELyxAZ5%mU{ zW$?x$wi@1Vpi|M3&uBDjVb6G~9FMbNY<e8KLs!_a*qPny?rr*@0h`{-d|K-IK<iQ) z@3JRMcP#5ej3ISXm~knf)Fw!TxWxRcCgVSD|AQw~Vb!O?EXV5G7VEPOcBd1t-vzbd A$^ZZW literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36138e24d79b00daf4687e7168acf350dafb1de7 GIT binary patch literal 32082 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 J;HJU+{{duY4bcDq literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6202d4e0695896a6c006b8b85716421ba7c4ed7f GIT binary patch literal 42649 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ecf7e899f703c4002dc9c5706ea42ea3ed92e5ee GIT binary patch literal 17377 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ℑm?2c zZ1B-IG~z$eE;D}idv5kgnFVJly~wzW<$%G9y-_#p;M+r-#Z1S;>0^p-`_JQ`R3#aO zexxarGE56cLyJje{Riky{~?n<Vj}jDkU3gXqbwrZ^dIw)>_Lu^!T$O%^S{G{cF-u# znFRXl%v(D+tw0NF5LvgPEc9pb>O^@djB=X;wIA8dQ2!~LpHCAWJQSnsKN5E@;)zjI zjyPW&xMG+mfwmDzwH!Z@j92W_cw4k#MYYEd%;ER^5r`DSNtG9H35I_P863v8LWEA~ zlfYQ3gR`Je(O^tr>^DLnv*Tq$hbQ)MjS&(zsM;|mTNE6Xp*dw;ti^5ghF|do9MUX= zot_U?A7w#(g>iz!$zszLq!*b8<8%Vw)6K2qxKJKmG@R5Z^5nmVAmn;U51ag-0QUBe zF4te7kN@IwRglRD$KsM;Ax_OLL_C0n|J5M*mtSAkyPU!vlBCdHm)sd1za`i;8d15? z=)vO-WN6^zVB<X;eT?4}8VwrD8?x<sjeR}Egy#eGPcwO*$?HrcPA`r0G2X?`@x_;z zh(iBm=Kh=s?Oet@&+nW0W&sv~lO?>MH7|G!NimnRb9VWmV!60ftl)2@c&hwh`Qh>z zEXlLQhsyWj?~USe@#C89Y9A88Co05eGK_!p*YQTXOnweYR0`$)et@PTfrin-)gI+k zIanPnsZp=D-$<)O@tJPNIQPv7FhQ3BJ0v$T%#0f!<>(dF1VC{~2p~iy$Yig}ISBpN zd?N<RGpwE-Ex&%{#n;~e)7#vJE+k)ayQPVW&zb%DDUKbuNKCw;N$G1qXt7<fTzkc) IK$Nrp2iBa0pa1{> literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1491415c97e7013fc2fe2e2576b82ec366f897d5 GIT binary patch literal 38857 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 P0g;au_go^A$S40dmDi4B literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59bfa31d58ff4da5f3a31c90a990f5ef7c668daa GIT binary patch literal 10365 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 btBmgAG76Gg`VS`;|GKG_btGqtRqcNO(4diC literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d2f06d434f17f8ad3c62a599b18ceeb54176334 GIT binary patch literal 4484 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 T=6SYkI;K}!?sz|Pm<j%WW6%-? literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e7ac275eff26bcbd3f371370c43c78c7049085e GIT binary patch literal 27724 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a7b6ad538b636ca9a31ff86d042bc74324973a3 GIT binary patch literal 10913 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9bf6d3b6a99199c997b7bef0ece16f2664925979 GIT binary patch literal 11100 zcmbVSTWlQHd7jJe?CfxNc@cG&<q>6?Tt!^Uw&J*~C0Vw_M1V{y5-lrhJKN!&S#p-U zGwX9^dD#wAAd~|%MG&_L(4ZHfNS_+C4{cxC0DY)mnx~*>`!o-IXp5o-@>1k24?(~G zoV}4&kf2M>*)!*U{_|hH|3CXmvFQBwpZ(JZzj#B_{!<(KWRORhCjJr$)0p1U+Im&j zDQ~olsv*D4swuxS)r|bkR<rWks#?rsnO3fCSM7Gbnr}N*2YpSJZB4Wb)q>1htzx@W zEwv}BlkKVMRC~HQ-JYq==$dadPx!Nkdi5mBHBTLC)zf~ad4}02Im`0ZbIf5APqpg# zFKev8icd9G^e-Hm)#sS;NGq2<!-}=Cp61@%k9~3Powd(&DlpT$*cbIEYy_L>B=cjx z9@qS^9<d<YOmo$svl_H~^s^d4$b4STrUfc_r{i-kj(9q?>7&D5C*ssE=KE;@qwV;3 z?RfE4T2l3Xy&HQQEkDf#VQt3`cf9|_{LbsQ_S!8Mtwj)pH|AcdT$^(Tv)`C|cYSr~ zwK-SBUdX&w6#6&j_I)vT>!$O%CxqYLXzjb`ABr1uT^_E8`j+4J#8Nw`^GHOEc&Q$> zS3J?K?7TGRw!JWD_#%EhKG{vj9S(JmVf{h8e`Gn8Ygm%wc6e0xg^2iVUf&9cNL`NA zJbCR^REAy~`FVkCyx&1~Hwa&Od2acpgV8T7ExBss#=aYG`L5ULw1T=9W5cchSvXC} z{g1i<_uE*3sJKf@w62(UMSL%8M8D=9Uzwv`gCQwTqhiNCd%%Mo9NMNYjuhYBqhrBB z?)y7_%WYA5W6l%z!kuW_=W}j1xLv1x-<WH7E#cFa+}D?X$*{}gQ!fu!kHcCXoYqZo z5lr{>%a<xwI{Wcf6z<-7|Ju@TR6e}2_`aL}uyUn*>jf_{H0`pxbY;m^T)5(P<Hpi! zRN@2;w^k#1*J|#K8}34_*7m?qwS^VO#V2SJAG+Y^s~{=Jj}P<Fhx;OG?f8rBh;>{3 zRkzU%>t)r4+SF>QXRX$6QI=h)3O(E#G-5^d74NI>4~H!}9*+gu(3lm0!;KdgDhs0# zFn6~VqX8tri(^hxTy<ryN+;?pUMr8<HX`nJ+#podqXp7RJ~xgkz)++9+y`TZ{ibUF z5XsRvv=5JO?!15PLoA5<717;T<O_>SqRxX({6VF&zk4hBpyKcOIEsa<?gE~%PGvPF zEr+&?F@~gFm><wiP`~*_Nn<fi2x?EIi)Ht+y9Rm2PGg^Uuxg*Vo^Y>8qWXJvzZ1K6 z<rj$wYWx)!eWDN&FS;E%W#}jOfn*~0<_-7d%B#Zzq4kOw%8FNZAzl9B!u-7WAY5?g z=Usn{R<xX#WH0LB@8RHhz3kLUG1ABEKX2h%RFN<}(Y7uAIMJHW_lG*agPhKEW*!<J z7zg@+ffj~rVW36kP%miwG0P?>Z5XGt11+49eNiJGGb_=kEYYB!b8A1>-Cl9IEBNw8 z5H3SQx||m9bA7Itn-?zWmtKa_vXMGaiD0_j017rMSq_Ta!J!Sbtcm{V1oZNt<S#Tn zOQUs`JJ1DQ>@V+le7O;|Kqj$V-(HSeFEuvycGz|CrP>$k8~fWYz0&CIw(HmM*$kK0 zmpegcDF`uftF?5!?f0126I3W4Qt2$>%PbIaE7(|8>?FWW=?R#HkGfIpkFDlSqUaP7 zO}Dd-KBdp<CBxBeou5Kkohk+&qQM(@M2f`MsyfqPX7#G+XJA$hnA8Q9W!6)@nqxU; z!vNZTzUee4SRM!TX5T0llu4`>S&2=eO^GeCX*Ppilk5bWMah&uU7cYk*(u~tu+!`e zzGqpPon`0H>LfeQE}-O;f0{kVE<V*@bkF!_nrGSb!?$zI^UU2g#E*Q+<+ly~DRLL6 zjDN~5u{rdAj$L7w*$Wu)BKrcHXD=f6yfn~P(}_n?2H*CedV4j=m$%(|3%b*dBk01; zz6<S8=RQu)?GxB-@Tl#IsLSi4GHQiWB6F*_yW`h`M&IU$iY!}OU#(l9D1GRg$ov)_ z(L(}$)oNN|Ak`BSDe<*dGi92IvrUT`+eT+a=FDv)qFj#3(8`YUEO$ulog~|N7*8bN zcDxm2YYYAOupi}e3}vV<GLi#(Z8gnyA`$GRnWnenrP|NUCzY?IMi`e3eh!P{=aH04 zkO8^t8Vh*pKpY5XP`>CfR%>}sGh1NoGz*nl2kfY~qKyror$!{w3|WvgD-B6%3v`4^ z_EQtN)P`IH9?USeF;AMSHDEZSPHNQxQNtpvG$Z_0gFi=0A#28;m+cteukmh3IEmUz zX;aBbs<&Zc!XU2I-p89DF4qi8@BbOIdO>%j2=r#hxS%rVRHx&iPZrPcsNTR!LW)L* zGBWt<q>T9MvC%Y}nM6O-p_0slOp<A433eVD2N_vs;YjICPjnDGyOx@p-C#AfltoT+ zeal?Vp~8=O8ME*?Bx!~K9Vf9(bKLK=JkT}MjDoP7<yWZHw5*Cc1Sv#nurM_m;c-fw zt<gz&EhzpFoIIu#w$WWUNHl#0I-#JK^xpgta{RKM{46@vfg9w92sDXD^7DOU_UB^o z^r8OUsRIK9gT_7t$+m%uzp6ddo@noB;R_ipHe$13Y&(2a*XS=M!Vw`2;PUJvv|}a+ zX7yT9g2)Ea=MIb)ZwF+|8WP|MC2p{2BlYVB!u9$>d!+Xwz;X--L)Dirxh;${vQRYq zXSA!Harx3(Z+g`OZ!yvaQO6J6d9h0DNcl7awZPKcJCE*i4pg4I_m0X~t!Q%-Y@gfp zcnFhOHph<2Xnc-O^Tg(2%Wt&=<`o4bTGjw_p23+E^xnxM=P_t|g!HsvN%}j;khvq$ z^DE#|tpyW_1CSg_29!a0fN#NvFpPRLd#FLRKwYRZGMuMKDOhWqY;rFbiHZ{4`$5>< z>p4wn{|T-1CXblTc~Q>s+vp=XBh9otcr(_ceSqP1IsrC%z(F=1@2A;Tv<v#!uwT-i zjuS|BKF+_Vpb_?JYUVNK{T)muN=P)_F>GT7vRyJVdT;Is!JgT5DBU^qHt|U6eG{2j z!i#N_Pcg`H_*!fbEs=tDr@@Y=HOMrion=7B>nwYa4KvI-$g*6bZ|9=bB$H&f^#e08 z`PZ49pig3;UmpFe&}Ghnl~`<ISY9}-eF-%vE2?kMzT{oNfev~0&2G?Q;8n25252f7 zw&LCk73Tv*w|p2M;k%2#ZSTQljCO&=VUdn@8IHHR71Xy#I>IOhV@EFByiIB6267=f z&@-a!b}=XhQBy#vx4SLnL?J&MjvTE1(kkvdc;mZ)0N$t05?6^WLX*^NB%D`W0#X>9 zWD)4dXT$LZ+f>VhQN?!DR;8^bQH0WWef0Oa+a(Wq07|iEu|+dO>PF*r1L+34gosd4 zao4xJa9djVuXx-8ZPy~sHaWzbe1R=cCI~y-xH1CXk9-iKC88B~D~>xW%gejFyOkhZ z>bBYy<}ZH(E-*|VARSq<s4JHHn^?Zw^25z|Yq%IvFX}@B35>M02`{G?06SD7zPa4b zFV)Gh_gc$j+LmKLzP48%4a3iXQ`bK;k){^&K=Clpz%!qbNc@Zh*A=7_E?<%_j#TlN zFZGYZ5qZ=tEG*D@EVyEV+Rwd!IKbQsZ_GJ@EZzd#kOdf-Ipq0eB&mt5z+Uf*)P^03 zi5(#DBO^2c2ob~Ll6R4o6w{DeBc8>(%G4A+(wVlmH>ezxS<1OOF8rn11_{8R_3vRV z;sO$F!qF{r7JAZx(A&C=bOz5X^1X9MRKSq|enx%k6jq`S$^QvFZ{ZQY1<ElU_8S_M zpQ03U4I3VQJ=UAXp(b98%|n!hYjNgK<M#<vHFK!5;g0AmgIu0v51~O}>$BnFus+W$ z)Kkkm1&;>p$U&i&&=pTH8^Buvx8@)lPc#e7qD0ewgz{2?F;PmhO{#p7;eQiP_4C>0 zG;?GN^kWmyOaIOaaEfyHE~@XuU?u1mfWGDoW&w6Nu=Y!d)jUBxbu!0uFvqjo&L=uQ z*Ehx|*<@m2h59%3uW6z21XhJP+a_9kp!$+#lzm?u_N@;4P9;{N%N>sTThMOPz`<!w zNMRN|TS1?Bk(zg(+)b@F@2%ar_ps*-icyh!eD~oaM9-vY=w)SOA~ox+pqF2Iva-qn zEJd$K*>0<)UM0V~quQ(MBPHc7&hzp>{V^W_4?^t<)yuJaw|>pmq|($rh5<A=c=?os zWt?~{orJ+wn^AnsN!mCWc_mvfQ|>yov<YgB0(dGwSc694uTh(KD0x5$0WJO&B&i)j z3Q6}%CoZ*Q9M9*Esm_vn^V6Ak!vLG~@6c9#1yP*GUaPC}eHkWetYSa>t2F!<X^33k zjqIb$z6>81(1Jvl{mLJrpCACJ>6t#(hG>#yhHzTQk?Wb!3kJ})Q7|F6rUT1OZ3>ow zR#Up6Ph}jWDsKP;_0Aj-XQESox*-Z8ZAW@b$}wSmlHM42y9xW<gd6o8$QroMSc5Nb zsd!SFk@1pDI;l>v2Bbo&4G^0J^%(G+`#=w=CAtlK!x<uNmu6+m^*9x#6cr>}W1zkG zKhRc4HG@6(E_{9mqo%`MkV2=O40l0jgmwVwCfPL;wF`Z%oEfoCYHxrABucXfA=f^p z!V&JNnhdo$zUTsxa?s^}Mhgb&JVNsEW<wvATn};r<YIpT)k!3e9HjbzrCcIH{RcU~ z&ujw!R9u07o0DqD60adoV9E@u36w09)_wFuv>rX|kVcWP^uUgDP`UZoPV(eXeRt-- zNgPtMq$)}Iu)ar;AOwMy6NycLE196NKhgJCqTkUz(Lbyn6tE^JNQ_)e3Q&N>#DXeI zWN9fWO6RR~Fqup?CrMrNe@jXSMZmfuB1Xl1iXu%lr<3Af-tgN{dNWdC?)8=4iRLV+ zcla)O*=tIUeKMIk)G^Z)yq%&v{2Zfs8Y4~74vvl+pTPZsRLT3LQG2N8Q^VN+%;`_5 zWR->;j6!q#ASuFwnn<#zp|%UyH~#@lK{3h7SXi;Y9_$r0KSrOkvdxb%>nuz~k=FAO znVhkm;_Vz-|5TQqPl}sT>BGgnKs2NFbOr=l*9OYjKnzNcQ+>BLF^Co;EY&k9vF0i6 z=l51do|TLkj)6mW$wdT}f{nm>1S5g5T5$Q=KA`GmQ14A(j6qTF+HF$bgbI~^JU);_ zg2%h3dZm}e2=k(M_R)6G>Cj9FMG6_;B)|nXul$@0GK{(6IdT+*-{Bs3o_`rhT9h(B z2z+poTuzal)RtQkF`OKT&JHPCK2-EFgn<|cg{`3{lsaFeZqu?`4Z%ncp$%F|njeN_ z`Ar)B7PYhFYDEgf)Q)z1`c^&~^EbMi{1P>sr-mme&@w{ZD&}J0Is~p)dAhI8sH@<c z)V|PHgd22WmF8&$vNkob(6oTF7>0Q`MXgeMuz4uS82)fOHF}NI?ggD1^AI7rOpS6; zH<s(u!&Jv=S%cn=>!M;!?OrY6r|2l2Akp9gQ>4a*)qs}=%K^ZLl2c?cq>Zp(GaS^~ zuo(zq7}TnS5~_6!Wk*WJIlQ02L+@0NvzH23#{Mct<{pAWGSzgRQp1sYl;F_h*AkPW z(VGgqW%)G<_B3^ZW6%}ZB-=Cy21+1_n?|^VCbPa{!p+lEn5bV5m$8|JhO<b+LDOi> z93t5rXfiuddc^LR{Q;Fht02<XbeMBiQ@{$EW}@HX?_`TYzXfh0KQ>0K05E?d*Njjs z!d5?FQwI**)@kTctvQk80o9<T6X!6C5lNP3*7$qaZ#p%)E#Nf-{6x=$aPT7P`odn; zC03Ae!c>3K%ghTjfHly16h$OSTSCD-6z~d?)zrj=2j4-qT;MNJF`*wNRa=znP(qBu zU!-IKNopd(C=pPa>)%}R@1eXrp&XEi8vZUNgj*znNi(!u#nzVMDaDNw>P2z=x2ZWr z=~W`*h6Px}ZNH|Px!8#y;Uqi*+=7RAYYKl9Np$4j8Kf7egrW~e4CnYz!<YkwEa;JJ z^(UABY-RQ>J#2g|BZ)9j`mii3bHLMw2#ra$%Hf*h2@cP0<`FuEVWjt%V(^3(D13%v zgb67CvrC@>Cd7paDI(bREoDH^yClBxO|(47!i?MpzRxx%!HS4Rh#z9CDTLy*=JX*& zlT0;YJkvY@uVI$r|A&Z(z_{o5zpxzQ9l7R7GJc(ZX88j<f$0^qNtXW?#>B<BG;=nL zo?NSZI|HLa>}@yCCYiobF`DNnbggUQQ_O#!ITRL0j0&^MmL-h(?f8ORC&gOxVBl=? zIW|Fk(BdLk*#?CsVDzkQGVdF#cu)YVmtg)0OIb8NOuyEAo=jN+Q`vN}Lj#Zi%%5b@ z=lg>-OHr6yTkV~vPzhZJkg34U&|<f<6h})?aeg^9_(l(xL@QK5F-OEE+8talOG~mS z`WB`v$UGDs{x-hW<vo)WvEIeOxVUk5J=Vkxbbpqmn<Q%_N`l<fevp{|A@WLoE{!mt z5+WHPcc@;5$v>i;ONlfu+0aMaP1%vBRJuaR4NAU%B(*7^Nmfo-8Tm5<T;~HHG8MNk zuHJk2XuWp--rC*T!@Fs=?Zx#i{tETYZt|$xNwbLg3s^1MlQdw`4)Kp^j&D)BOn}>U zPDq`C`u;YTB2Ti+e-lZ$qy+kpselAJwG>JCC-kB>Ql}Ac#2Mr=|D0M$cg3gLthCTl z<hc~=->3S|Nw-{^lI|~&bU#EZlI~g92eJ?u1Yb+|vtTR8mXIHVQg|t(0ZQ;<$kr$; zQb0ZVG|JwnPz2c->$n~mn{;^DNheE>)B`p$;7af))GzS8A<s-63{)&R9>;bftF~za z#8{fqJMn1Dp!M%YhMonrp-0X|-lvo-TsBD_KQ`aM(NVzVC;{cP(P&yuv6$gBWG&6X zG+#l6gl-V~=d;W_Fd&Q>+}e(AXicC}*hk!88O%OQ;Z<Cq9KtdJX+vPio`NL#wN!ub z8BwWfyn4NAyz+9-CR0OTlJBEfi4@Tj*C>QWx^Ura+{)EO(DUgwh*W;92DBuh7bls5 z3y6Senw5a3Y$-&P*`~70Mt~cs%QWF+|Be;jd41bMZ2w)F?-*Tv8)dsh7Zs5P|G*j) zOtKWmum*Wk1Kcz;3M3Nr$OC#6nN9dF>JEi2l$gG4^EogGTw3LUgj0Ak2wNbyV|<5H zB;A#m-oIiI!+;~f8`tZHDaIn2EBG;lhilC7d&(6=MiJ2%FG8Gl5H0QpTs;?D5zs{o z{UTsEkNeDz^puZ|=q>`PlYt$sN`+p$Uoq6+dbO+~+XHC&jNvx+f7MWZMJ_LLK^t|I z+ltgLgv#o+miE&pQvY^s#l7uPTmUz1fah-1z?G1^c2hy@s0H=2IS2@C`cR`XSUxtK z`l$$w(}K4_BOtu(dK>tmOcxi-6#J2|#3dvgBOV<`quy(Mqy^8O!ngddDEU(){j0#V zc;w_15|WrmqNAhSnr7$-J|=c0WuQ&S2r85tn00Dgk5IE`^XMYF5s&U&BoF(;Q{Ymd zV#%Qy3NT9F(0NaBrQZ8=cqr@Y@CPI~vT8D)OtFX3&_ZzsLT&A<!x5gvys*C`vK}3C zM8lQ;#|ez4rN|NdAox!FM`Ls^9i45A@PCh1$J9hxB#PE>lY*dr%l|%|04X)if_np} z=BTPT(za}_uaaFLU=C&&{JZ>bQII<DwB;|Ypy3L&+DBcl)z^2qT8%|@6i+^S>*2iz z>$UZ}Z$G$yd;KooMn@H@T%z2w!i=}6f)u$7Dk^JD06m?q-MPDZ``!ENwYP7t-CMo; zXq|Iv)}`coln`%9F2#jG|LRZS3=3W<ZV424AqC4{poA2tBrN|2%8eLS<_Mbe(@4l% z3-ToF4D7LyF>w1gY3B;MUBKV-&TA+)?2LWgIc;ArWJ;Nf8N1}1kbTP+QzM9^qn_sI znidi(mjMvx^S`DkD9oB#fIW~#8NrocMY;8P+)zkmA^OGxzvOGlA1x@6l*nrs-%ayS z^!Mdmusk9Oyztv0+;?^Or!-BDrh$*me?T+;BPA5NOs#06iQhZQB|nP}sr|Y->zic5 Z<ZTGHKlqbBZMa}MGYGAo&Y1Sp{{basNRj{m literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..509767322d0bd158b2da36d87dc0c1fb3c6a304f GIT binary patch literal 48083 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2cf63dfe9165c1faebc740779bde18955951193e GIT binary patch literal 20692 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 BCfNW0 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51ae2035caca927b5c9606dc1158d43ff5e48c85 GIT binary patch literal 25456 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__init__.py new file mode 100644 index 0000000..f7dbf4c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__init__.py @@ -0,0 +1,6 @@ +"""Modules copied from Python 3 standard libraries, for internal use only. + +Individual classes and functions are found in d2._backport.misc. Intended +usage is to always import things missing from 3.1 from that module: the +built-in/stdlib objects will be used if found. +""" diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49bcc4ee7380b74ccb44ed86afe2609e73b21dba GIT binary patch literal 488 zcmYjO&1xJm4EE-bhAFw^33Lr4<8C&kP)g}Fhm=Bc3IXG>JiF?8?7{NPX404GwNKJ_ z$Tg6M=&9OW2oXp~vVOi#UK}4+FTelZpUjkcR&PXN^-YwI#GtxUIJ;4&2ll-@TqhiY zXK<+}kI?4S!H=n|QiKI?u@P-X2-IYo$@3YsDFemgbF={l_K;$j>Z-bmNF(7OSr;s` z%#>zmhv*8WC{gy(JV=fr;6-g3>(+hBrS6Db4R9q>BYLa`wo4DhP!ia%u@eJz+e#=a zic1D*U~%?n7xjGal$9;e?f86_N?$btg>p_&b3tJMsrl($Vc1Xz(D*HS0n_eL)z$aY z+0#2?FgauXsC*#D+L?d9bf0Oo#p}^#-KKy(vvzA;!n|!BM!e)t=A&z-^?cDjZaVit zWEu6X?x~mka>fwOFFXH;{J`7fPR%HEQ`Sga1fG69h&F~I6=UjtdOG^Dr}Xu3`-7tD EKYEm(MF0Q* literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5cac6397f7437426bf4515d3678d7f92dd26bc2c GIT binary patch literal 1094 zcmZ8fON-P%5bo+EGnvfn;EIpKdI*BzfNm65yojia2QPC`P=gSX?#`Imyy)(k-C0Hu z*B|0hFa8Y={)4^>f`7r2)tMC^9lBCo@A|54Z*2wNKYV%h)gj~?`RnW;{{XN0jD(Yz zaNx9r7`i`=DR;Qby_pj`t1~F;m2Tz59+2mx4qYO82Z5Xdv7hMY!28^J53%=>)bs^e z`NEHVw7iCv1GId*vBWrj8C1h~2!s!~`<}%9sYf7SK8i=^a|wO6(C6c+PryC28*S`3 zeM%<7<LFV!4%$X)73Pf$i<%e9f-llCWM!(9P+?m0FkjS67fr2pe_)ejYPMO*UW+7` zO_iu-A(=2fOUp9NO5}1SYSwTu0ZGxESz-@DM=ZaOSDiz$2I+HX15V%2HCfY(1dDQ} z2AF~76S8r?T_t&eK|L<A#mqS3NXtIDcI4+_)XHL+Y7s3{8RbpMg;Wtch;(@?&yJRS zPu)%Kuxxd3>vn#8Sh1UUW_9!|YK!(pQ7er_-`K0fF;_>*3cH&uMa>%-@j~gc$f6`W zMJcKZ#dh0O*Vndf!$m@11QRg+{wV?stPqd=+orpQ17tK=6AdR8dzenB2@2H}Q8OWj zsK+Qylg<BhD6N;YG3=hH4oUbYzAd1Oe-D}8@#T1pP<AhRLgm#pnLFB@dne=sP~PL9 z`)lOq{spA(fLq|{^ms=cwSws|TWK6UE`-wZdRR9)yrL!pIl>gi>y*YpmFaB;jgOTw z=VwCOSs|}Q)oF@)W(Lnzt#~YDBaN$(HGY!RX(f`xVrCue>;IN*TbJ=Fo0C8QF5WS9 zVKO%TB;gH95<?p$?G&s8u}6thRBbmLGkj9nz1}1qpoiU`B<Zj;gDIxmsD`X5OYGUM zcQ*rRQ=9Qat!0rd^v3M3^1AJ_V=?}{s^N=L-0$H_g-BfLgHHp8!WkIDS&xE`{}CO# I)Rqsw0Gdz^Qvd(} literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7975f8c4f83801c5fef0144ecb3b56ce8eacda90 GIT binary patch literal 21441 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�K-TKwO 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a0569e82b6382f7994af1c57ada81b5c792fdbd GIT binary patch literal 16042 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 Dv(dl* literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6574fc26a2a4758f3b1496785ab2fae0eab19e10 GIT binary patch literal 63052 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 XJV<SrPx8OLt*&j=kvpRe#r*#Oa_t7L literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/misc.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/misc.py new file mode 100644 index 0000000..cfb318d --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/misc.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Backports for individual classes and functions.""" + +import os +import sys + +__all__ = ['cache_from_source', 'callable', 'fsencode'] + + +try: + from imp import cache_from_source +except ImportError: + def cache_from_source(py_file, debug=__debug__): + ext = debug and 'c' or 'o' + return py_file + ext + + +try: + callable = callable +except NameError: + from collections import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode +except AttributeError: + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, str): + return filename.encode(sys.getfilesystemencoding()) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/shutil.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/shutil.py new file mode 100644 index 0000000..159e49e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/shutil.py @@ -0,0 +1,761 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Utility functions for copying and archiving files and directory trees. + +XXX The functions here don't copy the resource fork or other metadata on Mac. + +""" + +import os +import sys +import stat +from os.path import abspath +import fnmatch +import collections +import errno +from . import tarfile + +try: + import bz2 + _BZ2_SUPPORTED = True +except ImportError: + _BZ2_SUPPORTED = False + +try: + from pwd import getpwnam +except ImportError: + getpwnam = None + +try: + from grp import getgrnam +except ImportError: + getgrnam = None + +__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", + "copytree", "move", "rmtree", "Error", "SpecialFileError", + "ExecError", "make_archive", "get_archive_formats", + "register_archive_format", "unregister_archive_format", + "get_unpack_formats", "register_unpack_format", + "unregister_unpack_format", "unpack_archive", "ignore_patterns"] + +class Error(EnvironmentError): + pass + +class SpecialFileError(EnvironmentError): + """Raised when trying to do a kind of operation (e.g. copying) which is + not supported on a special file (e.g. a named pipe)""" + +class ExecError(EnvironmentError): + """Raised when a command could not be executed""" + +class ReadError(EnvironmentError): + """Raised when an archive cannot be read""" + +class RegistryError(Exception): + """Raised when a registry operation with the archiving + and unpacking registries fails""" + + +try: + WindowsError +except NameError: + WindowsError = None + +def copyfileobj(fsrc, fdst, length=16*1024): + """copy data from file-like object fsrc to file-like object fdst""" + while 1: + buf = fsrc.read(length) + if not buf: + break + fdst.write(buf) + +def _samefile(src, dst): + # Macintosh, Unix. + if hasattr(os.path, 'samefile'): + try: + return os.path.samefile(src, dst) + except OSError: + return False + + # All other platforms: check for same pathname. + return (os.path.normcase(os.path.abspath(src)) == + os.path.normcase(os.path.abspath(dst))) + +def copyfile(src, dst): + """Copy data from src to dst""" + if _samefile(src, dst): + raise Error("`%s` and `%s` are the same file" % (src, dst)) + + for fn in [src, dst]: + try: + st = os.stat(fn) + except OSError: + # File most likely does not exist + pass + else: + # XXX What about other special files? (sockets, devices...) + if stat.S_ISFIFO(st.st_mode): + raise SpecialFileError("`%s` is a named pipe" % fn) + + with open(src, 'rb') as fsrc: + with open(dst, 'wb') as fdst: + copyfileobj(fsrc, fdst) + +def copymode(src, dst): + """Copy mode bits from src to dst""" + if hasattr(os, 'chmod'): + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + os.chmod(dst, mode) + +def copystat(src, dst): + """Copy all stat info (mode bits, atime, mtime, flags) from src to dst""" + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + if hasattr(os, 'utime'): + os.utime(dst, (st.st_atime, st.st_mtime)) + if hasattr(os, 'chmod'): + os.chmod(dst, mode) + if hasattr(os, 'chflags') and hasattr(st, 'st_flags'): + try: + os.chflags(dst, st.st_flags) + except OSError as why: + if (not hasattr(errno, 'EOPNOTSUPP') or + why.errno != errno.EOPNOTSUPP): + raise + +def copy(src, dst): + """Copy data and mode bits ("cp src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copymode(src, dst) + +def copy2(src, dst): + """Copy data and all stat info ("cp -p src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copystat(src, dst) + +def ignore_patterns(*patterns): + """Function that can be used as copytree() ignore parameter. + + Patterns is a sequence of glob-style patterns + that are used to exclude files""" + def _ignore_patterns(path, names): + ignored_names = [] + for pattern in patterns: + ignored_names.extend(fnmatch.filter(names, pattern)) + return set(ignored_names) + return _ignore_patterns + +def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, + ignore_dangling_symlinks=False): + """Recursively copy a directory tree. + + The destination directory must not already exist. + If exception(s) occur, an Error is raised with a list of reasons. + + If the optional symlinks flag is true, symbolic links in the + source tree result in symbolic links in the destination tree; if + it is false, the contents of the files pointed to by symbolic + links are copied. If the file pointed by the symlink doesn't + exist, an exception will be added in the list of errors raised in + an Error exception at the end of the copy process. + + You can set the optional ignore_dangling_symlinks flag to true if you + want to silence this exception. Notice that this has no effect on + platforms that don't support os.symlink. + + The optional ignore argument is a callable. If given, it + is called with the `src` parameter, which is the directory + being visited by copytree(), and `names` which is the list of + `src` contents, as returned by os.listdir(): + + callable(src, names) -> ignored_names + + Since copytree() is called recursively, the callable will be + called once for each directory that is copied. It returns a + list of names relative to the `src` directory that should + not be copied. + + The optional copy_function argument is a callable that will be used + to copy each file. It will be called with the source path and the + destination path as arguments. By default, copy2() is used, but any + function that supports the same signature (like copy()) can be used. + + """ + names = os.listdir(src) + if ignore is not None: + ignored_names = ignore(src, names) + else: + ignored_names = set() + + os.makedirs(dst) + errors = [] + for name in names: + if name in ignored_names: + continue + srcname = os.path.join(src, name) + dstname = os.path.join(dst, name) + try: + if os.path.islink(srcname): + linkto = os.readlink(srcname) + if symlinks: + os.symlink(linkto, dstname) + else: + # ignore dangling symlink if the flag is on + if not os.path.exists(linkto) and ignore_dangling_symlinks: + continue + # otherwise let the copy occurs. copy2 will raise an error + copy_function(srcname, dstname) + elif os.path.isdir(srcname): + copytree(srcname, dstname, symlinks, ignore, copy_function) + else: + # Will raise a SpecialFileError for unsupported file types + copy_function(srcname, dstname) + # catch the Error from the recursive copytree so that we can + # continue with other files + except Error as err: + errors.extend(err.args[0]) + except EnvironmentError as why: + errors.append((srcname, dstname, str(why))) + try: + copystat(src, dst) + except OSError as why: + if WindowsError is not None and isinstance(why, WindowsError): + # Copying file access times may fail on Windows + pass + else: + errors.extend((src, dst, str(why))) + if errors: + raise Error(errors) + +def rmtree(path, ignore_errors=False, onerror=None): + """Recursively delete a directory tree. + + If ignore_errors is set, errors are ignored; otherwise, if onerror + is set, it is called to handle the error with arguments (func, + path, exc_info) where func is os.listdir, os.remove, or os.rmdir; + path is the argument to that function that caused it to fail; and + exc_info is a tuple returned by sys.exc_info(). If ignore_errors + is false and onerror is None, an exception is raised. + + """ + if ignore_errors: + def onerror(*args): + pass + elif onerror is None: + def onerror(*args): + raise + try: + if os.path.islink(path): + # symlinks to directories are forbidden, see bug #1669 + raise OSError("Cannot call rmtree on a symbolic link") + except OSError: + onerror(os.path.islink, path, sys.exc_info()) + # can't continue even if onerror hook returns + return + names = [] + try: + names = os.listdir(path) + except os.error: + onerror(os.listdir, path, sys.exc_info()) + for name in names: + fullname = os.path.join(path, name) + try: + mode = os.lstat(fullname).st_mode + except os.error: + mode = 0 + if stat.S_ISDIR(mode): + rmtree(fullname, ignore_errors, onerror) + else: + try: + os.remove(fullname) + except os.error: + onerror(os.remove, fullname, sys.exc_info()) + try: + os.rmdir(path) + except os.error: + onerror(os.rmdir, path, sys.exc_info()) + + +def _basename(path): + # A basename() variant which first strips the trailing slash, if present. + # Thus we always get the last component of the path, even for directories. + return os.path.basename(path.rstrip(os.path.sep)) + +def move(src, dst): + """Recursively move a file or directory to another location. This is + similar to the Unix "mv" command. + + If the destination is a directory or a symlink to a directory, the source + is moved inside the directory. The destination path must not already + exist. + + If the destination already exists but is not a directory, it may be + overwritten depending on os.rename() semantics. + + If the destination is on our current filesystem, then rename() is used. + Otherwise, src is copied to the destination and then removed. + A lot more could be done here... A look at a mv.c shows a lot of + the issues this implementation glosses over. + + """ + real_dst = dst + if os.path.isdir(dst): + if _samefile(src, dst): + # We might be on a case insensitive filesystem, + # perform the rename anyway. + os.rename(src, dst) + return + + real_dst = os.path.join(dst, _basename(src)) + if os.path.exists(real_dst): + raise Error("Destination path '%s' already exists" % real_dst) + try: + os.rename(src, real_dst) + except OSError: + if os.path.isdir(src): + if _destinsrc(src, dst): + raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst)) + copytree(src, real_dst, symlinks=True) + rmtree(src) + else: + copy2(src, real_dst) + os.unlink(src) + +def _destinsrc(src, dst): + src = abspath(src) + dst = abspath(dst) + if not src.endswith(os.path.sep): + src += os.path.sep + if not dst.endswith(os.path.sep): + dst += os.path.sep + return dst.startswith(src) + +def _get_gid(name): + """Returns a gid, given a group name.""" + if getgrnam is None or name is None: + return None + try: + result = getgrnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _get_uid(name): + """Returns an uid, given a user name.""" + if getpwnam is None or name is None: + return None + try: + result = getpwnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0, + owner=None, group=None, logger=None): + """Create a (possibly compressed) tar file from all the files under + 'base_dir'. + + 'compress' must be "gzip" (the default), "bzip2", or None. + + 'owner' and 'group' can be used to define an owner and a group for the + archive that is being built. If not provided, the current owner and group + will be used. + + The output tar file will be named 'base_name' + ".tar", possibly plus + the appropriate compression extension (".gz", or ".bz2"). + + Returns the output filename. + """ + tar_compression = {'gzip': 'gz', None: ''} + compress_ext = {'gzip': '.gz'} + + if _BZ2_SUPPORTED: + tar_compression['bzip2'] = 'bz2' + compress_ext['bzip2'] = '.bz2' + + # flags for compression program, each element of list will be an argument + if compress is not None and compress not in compress_ext: + raise ValueError("bad value for 'compress', or compression format not " + "supported : {0}".format(compress)) + + archive_name = base_name + '.tar' + compress_ext.get(compress, '') + archive_dir = os.path.dirname(archive_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # creating the tarball + if logger is not None: + logger.info('Creating tar archive') + + uid = _get_uid(owner) + gid = _get_gid(group) + + def _set_uid_gid(tarinfo): + if gid is not None: + tarinfo.gid = gid + tarinfo.gname = group + if uid is not None: + tarinfo.uid = uid + tarinfo.uname = owner + return tarinfo + + if not dry_run: + tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress]) + try: + tar.add(base_dir, filter=_set_uid_gid) + finally: + tar.close() + + return archive_name + +def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False): + # XXX see if we want to keep an external call here + if verbose: + zipoptions = "-r" + else: + zipoptions = "-rq" + from distutils.errors import DistutilsExecError + from distutils.spawn import spawn + try: + spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run) + except DistutilsExecError: + # XXX really should distinguish between "couldn't find + # external 'zip' command" and "zip failed". + raise ExecError("unable to create zip file '%s': " + "could neither import the 'zipfile' module nor " + "find a standalone zip utility") % zip_filename + +def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None): + """Create a zip file from all the files under 'base_dir'. + + The output zip file will be named 'base_name' + ".zip". Uses either the + "zipfile" Python module (if available) or the InfoZIP "zip" utility + (if installed and found on the default search path). If neither tool is + available, raises ExecError. Returns the name of the output zip + file. + """ + zip_filename = base_name + ".zip" + archive_dir = os.path.dirname(base_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # If zipfile module is not available, try spawning an external 'zip' + # command. + try: + import zipfile + except ImportError: + zipfile = None + + if zipfile is None: + _call_external_zip(base_dir, zip_filename, verbose, dry_run) + else: + if logger is not None: + logger.info("creating '%s' and adding '%s' to it", + zip_filename, base_dir) + + if not dry_run: + zip = zipfile.ZipFile(zip_filename, "w", + compression=zipfile.ZIP_DEFLATED) + + for dirpath, dirnames, filenames in os.walk(base_dir): + for name in filenames: + path = os.path.normpath(os.path.join(dirpath, name)) + if os.path.isfile(path): + zip.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + zip.close() + + return zip_filename + +_ARCHIVE_FORMATS = { + 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), + 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), + 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), + 'zip': (_make_zipfile, [], "ZIP file"), + } + +if _BZ2_SUPPORTED: + _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')], + "bzip2'ed tar-file") + +def get_archive_formats(): + """Returns a list of supported formats for archiving and unarchiving. + + Each element of the returned sequence is a tuple (name, description) + """ + formats = [(name, registry[2]) for name, registry in + _ARCHIVE_FORMATS.items()] + formats.sort() + return formats + +def register_archive_format(name, function, extra_args=None, description=''): + """Registers an archive format. + + name is the name of the format. function is the callable that will be + used to create archives. If provided, extra_args is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_archive_formats() function. + """ + if extra_args is None: + extra_args = [] + if not isinstance(function, collections.Callable): + raise TypeError('The %s object is not callable' % function) + if not isinstance(extra_args, (tuple, list)): + raise TypeError('extra_args needs to be a sequence') + for element in extra_args: + if not isinstance(element, (tuple, list)) or len(element) !=2: + raise TypeError('extra_args elements are : (arg_name, value)') + + _ARCHIVE_FORMATS[name] = (function, extra_args, description) + +def unregister_archive_format(name): + del _ARCHIVE_FORMATS[name] + +def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, + dry_run=0, owner=None, group=None, logger=None): + """Create an archive file (eg. zip or tar). + + 'base_name' is the name of the file to create, minus any format-specific + extension; 'format' is the archive format: one of "zip", "tar", "bztar" + or "gztar". + + 'root_dir' is a directory that will be the root directory of the + archive; ie. we typically chdir into 'root_dir' before creating the + archive. 'base_dir' is the directory where we start archiving from; + ie. 'base_dir' will be the common prefix of all files and + directories in the archive. 'root_dir' and 'base_dir' both default + to the current directory. Returns the name of the archive file. + + 'owner' and 'group' are used when creating a tar archive. By default, + uses the current owner and group. + """ + save_cwd = os.getcwd() + if root_dir is not None: + if logger is not None: + logger.debug("changing into '%s'", root_dir) + base_name = os.path.abspath(base_name) + if not dry_run: + os.chdir(root_dir) + + if base_dir is None: + base_dir = os.curdir + + kwargs = {'dry_run': dry_run, 'logger': logger} + + try: + format_info = _ARCHIVE_FORMATS[format] + except KeyError: + raise ValueError("unknown archive format '%s'" % format) + + func = format_info[0] + for arg, val in format_info[1]: + kwargs[arg] = val + + if format != 'zip': + kwargs['owner'] = owner + kwargs['group'] = group + + try: + filename = func(base_name, base_dir, **kwargs) + finally: + if root_dir is not None: + if logger is not None: + logger.debug("changing back to '%s'", save_cwd) + os.chdir(save_cwd) + + return filename + + +def get_unpack_formats(): + """Returns a list of supported formats for unpacking. + + Each element of the returned sequence is a tuple + (name, extensions, description) + """ + formats = [(name, info[0], info[3]) for name, info in + _UNPACK_FORMATS.items()] + formats.sort() + return formats + +def _check_unpack_options(extensions, function, extra_args): + """Checks what gets registered as an unpacker.""" + # first make sure no other unpacker is registered for this extension + existing_extensions = {} + for name, info in _UNPACK_FORMATS.items(): + for ext in info[0]: + existing_extensions[ext] = name + + for extension in extensions: + if extension in existing_extensions: + msg = '%s is already registered for "%s"' + raise RegistryError(msg % (extension, + existing_extensions[extension])) + + if not isinstance(function, collections.Callable): + raise TypeError('The registered function must be a callable') + + +def register_unpack_format(name, extensions, function, extra_args=None, + description=''): + """Registers an unpack format. + + `name` is the name of the format. `extensions` is a list of extensions + corresponding to the format. + + `function` is the callable that will be + used to unpack archives. The callable will receive archives to unpack. + If it's unable to handle an archive, it needs to raise a ReadError + exception. + + If provided, `extra_args` is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_unpack_formats() function. + """ + if extra_args is None: + extra_args = [] + _check_unpack_options(extensions, function, extra_args) + _UNPACK_FORMATS[name] = extensions, function, extra_args, description + +def unregister_unpack_format(name): + """Removes the pack format from the registry.""" + del _UNPACK_FORMATS[name] + +def _ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + if not os.path.isdir(dirname): + os.makedirs(dirname) + +def _unpack_zipfile(filename, extract_dir): + """Unpack zip `filename` to `extract_dir` + """ + try: + import zipfile + except ImportError: + raise ReadError('zlib not supported, cannot unpack this archive.') + + if not zipfile.is_zipfile(filename): + raise ReadError("%s is not a zip file" % filename) + + zip = zipfile.ZipFile(filename) + try: + for info in zip.infolist(): + name = info.filename + + # don't extract absolute paths or ones with .. in them + if name.startswith('/') or '..' in name: + continue + + target = os.path.join(extract_dir, *name.split('/')) + if not target: + continue + + _ensure_directory(target) + if not name.endswith('/'): + # file + data = zip.read(info.filename) + f = open(target, 'wb') + try: + f.write(data) + finally: + f.close() + del data + finally: + zip.close() + +def _unpack_tarfile(filename, extract_dir): + """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` + """ + try: + tarobj = tarfile.open(filename) + except tarfile.TarError: + raise ReadError( + "%s is not a compressed or uncompressed tar file" % filename) + try: + tarobj.extractall(extract_dir) + finally: + tarobj.close() + +_UNPACK_FORMATS = { + 'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"), + 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"), + 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file") + } + +if _BZ2_SUPPORTED: + _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [], + "bzip2'ed tar-file") + +def _find_unpack_format(filename): + for name, info in _UNPACK_FORMATS.items(): + for extension in info[0]: + if filename.endswith(extension): + return name + return None + +def unpack_archive(filename, extract_dir=None, format=None): + """Unpack an archive. + + `filename` is the name of the archive. + + `extract_dir` is the name of the target directory, where the archive + is unpacked. If not provided, the current working directory is used. + + `format` is the archive format: one of "zip", "tar", or "gztar". Or any + other registered format. If not provided, unpack_archive will use the + filename extension and see if an unpacker was registered for that + extension. + + In case none is found, a ValueError is raised. + """ + if extract_dir is None: + extract_dir = os.getcwd() + + if format is not None: + try: + format_info = _UNPACK_FORMATS[format] + except KeyError: + raise ValueError("Unknown unpack format '{0}'".format(format)) + + func = format_info[1] + func(filename, extract_dir, **dict(format_info[2])) + else: + # we need to look at the registered unpackers supported extensions + format = _find_unpack_format(filename) + if format is None: + raise ReadError("Unknown archive format '{0}'".format(filename)) + + func = _UNPACK_FORMATS[format][1] + kwargs = dict(_UNPACK_FORMATS[format][2]) + func(filename, extract_dir, **kwargs) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg new file mode 100644 index 0000000..1746bd0 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg @@ -0,0 +1,84 @@ +[posix_prefix] +# Configuration directories. Some of these come straight out of the +# configure script. They are for implementing the other variables, not to +# be used directly in [resource_locations]. +confdir = /etc +datadir = /usr/share +libdir = /usr/lib +statedir = /var +# User resource directory +local = ~/.local/{distribution.name} + +stdlib = {base}/lib/python{py_version_short} +platstdlib = {platbase}/lib/python{py_version_short} +purelib = {base}/lib/python{py_version_short}/site-packages +platlib = {platbase}/lib/python{py_version_short}/site-packages +include = {base}/include/python{py_version_short}{abiflags} +platinclude = {platbase}/include/python{py_version_short}{abiflags} +data = {base} + +[posix_home] +stdlib = {base}/lib/python +platstdlib = {base}/lib/python +purelib = {base}/lib/python +platlib = {base}/lib/python +include = {base}/include/python +platinclude = {base}/include/python +scripts = {base}/bin +data = {base} + +[nt] +stdlib = {base}/Lib +platstdlib = {base}/Lib +purelib = {base}/Lib/site-packages +platlib = {base}/Lib/site-packages +include = {base}/Include +platinclude = {base}/Include +scripts = {base}/Scripts +data = {base} + +[os2] +stdlib = {base}/Lib +platstdlib = {base}/Lib +purelib = {base}/Lib/site-packages +platlib = {base}/Lib/site-packages +include = {base}/Include +platinclude = {base}/Include +scripts = {base}/Scripts +data = {base} + +[os2_home] +stdlib = {userbase}/lib/python{py_version_short} +platstdlib = {userbase}/lib/python{py_version_short} +purelib = {userbase}/lib/python{py_version_short}/site-packages +platlib = {userbase}/lib/python{py_version_short}/site-packages +include = {userbase}/include/python{py_version_short} +scripts = {userbase}/bin +data = {userbase} + +[nt_user] +stdlib = {userbase}/Python{py_version_nodot} +platstdlib = {userbase}/Python{py_version_nodot} +purelib = {userbase}/Python{py_version_nodot}/site-packages +platlib = {userbase}/Python{py_version_nodot}/site-packages +include = {userbase}/Python{py_version_nodot}/Include +scripts = {userbase}/Scripts +data = {userbase} + +[posix_user] +stdlib = {userbase}/lib/python{py_version_short} +platstdlib = {userbase}/lib/python{py_version_short} +purelib = {userbase}/lib/python{py_version_short}/site-packages +platlib = {userbase}/lib/python{py_version_short}/site-packages +include = {userbase}/include/python{py_version_short} +scripts = {userbase}/bin +data = {userbase} + +[osx_framework_user] +stdlib = {userbase}/lib/python +platstdlib = {userbase}/lib/python +purelib = {userbase}/lib/python/site-packages +platlib = {userbase}/lib/python/site-packages +include = {userbase}/include +scripts = {userbase}/bin +data = {userbase} diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.py new file mode 100644 index 0000000..1df3aba --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.py @@ -0,0 +1,788 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Access to Python's configuration information.""" + +import codecs +import os +import re +import sys +from os.path import pardir, realpath +try: + import configparser +except ImportError: + import ConfigParser as configparser + + +__all__ = [ + 'get_config_h_filename', + 'get_config_var', + 'get_config_vars', + 'get_makefile_filename', + 'get_path', + 'get_path_names', + 'get_paths', + 'get_platform', + 'get_python_version', + 'get_scheme_names', + 'parse_config_h', +] + + +def _safe_realpath(path): + try: + return realpath(path) + except OSError: + return path + + +if sys.executable: + _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable)) +else: + # sys.executable can be empty if argv[0] has been changed and Python is + # unable to retrieve the real program name + _PROJECT_BASE = _safe_realpath(os.getcwd()) + +if os.name == "nt" and "pcbuild" in _PROJECT_BASE[-8:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir)) +# PC/VS7.1 +if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) +# PC/AMD64 +if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) + + +def is_python_build(): + for fn in ("Setup.dist", "Setup.local"): + if os.path.isfile(os.path.join(_PROJECT_BASE, "Modules", fn)): + return True + return False + +_PYTHON_BUILD = is_python_build() + +_cfg_read = False + +def _ensure_cfg_read(): + global _cfg_read + if not _cfg_read: + from ..resources import finder + backport_package = __name__.rsplit('.', 1)[0] + _finder = finder(backport_package) + _cfgfile = _finder.find('sysconfig.cfg') + assert _cfgfile, 'sysconfig.cfg exists' + with _cfgfile.as_stream() as s: + _SCHEMES.readfp(s) + if _PYTHON_BUILD: + for scheme in ('posix_prefix', 'posix_home'): + _SCHEMES.set(scheme, 'include', '{srcdir}/Include') + _SCHEMES.set(scheme, 'platinclude', '{projectbase}/.') + + _cfg_read = True + + +_SCHEMES = configparser.RawConfigParser() +_VAR_REPL = re.compile(r'\{([^{]*?)\}') + +def _expand_globals(config): + _ensure_cfg_read() + if config.has_section('globals'): + globals = config.items('globals') + else: + globals = tuple() + + sections = config.sections() + for section in sections: + if section == 'globals': + continue + for option, value in globals: + if config.has_option(section, option): + continue + config.set(section, option, value) + config.remove_section('globals') + + # now expanding local variables defined in the cfg file + # + for section in config.sections(): + variables = dict(config.items(section)) + + def _replacer(matchobj): + name = matchobj.group(1) + if name in variables: + return variables[name] + return matchobj.group(0) + + for option, value in config.items(section): + config.set(section, option, _VAR_REPL.sub(_replacer, value)) + +#_expand_globals(_SCHEMES) + + # FIXME don't rely on sys.version here, its format is an implementation detail + # of CPython, use sys.version_info or sys.hexversion +_PY_VERSION = sys.version.split()[0] +_PY_VERSION_SHORT = sys.version[:3] +_PY_VERSION_SHORT_NO_DOT = _PY_VERSION[0] + _PY_VERSION[2] +_PREFIX = os.path.normpath(sys.prefix) +_EXEC_PREFIX = os.path.normpath(sys.exec_prefix) +_CONFIG_VARS = None +_USER_BASE = None + + +def _subst_vars(path, local_vars): + """In the string `path`, replace tokens like {some.thing} with the + corresponding value from the map `local_vars`. + + If there is no corresponding value, leave the token unchanged. + """ + def _replacer(matchobj): + name = matchobj.group(1) + if name in local_vars: + return local_vars[name] + elif name in os.environ: + return os.environ[name] + return matchobj.group(0) + return _VAR_REPL.sub(_replacer, path) + + +def _extend_dict(target_dict, other_dict): + target_keys = target_dict.keys() + for key, value in other_dict.items(): + if key in target_keys: + continue + target_dict[key] = value + + +def _expand_vars(scheme, vars): + res = {} + if vars is None: + vars = {} + _extend_dict(vars, get_config_vars()) + + for key, value in _SCHEMES.items(scheme): + if os.name in ('posix', 'nt'): + value = os.path.expanduser(value) + res[key] = os.path.normpath(_subst_vars(value, vars)) + return res + + +def format_value(value, vars): + def _replacer(matchobj): + name = matchobj.group(1) + if name in vars: + return vars[name] + return matchobj.group(0) + return _VAR_REPL.sub(_replacer, value) + + +def _get_default_scheme(): + if os.name == 'posix': + # the default scheme for posix is posix_prefix + return 'posix_prefix' + return os.name + + +def _getuserbase(): + env_base = os.environ.get("PYTHONUSERBASE", None) + + def joinuser(*args): + return os.path.expanduser(os.path.join(*args)) + + # what about 'os2emx', 'riscos' ? + if os.name == "nt": + base = os.environ.get("APPDATA") or "~" + if env_base: + return env_base + else: + return joinuser(base, "Python") + + if sys.platform == "darwin": + framework = get_config_var("PYTHONFRAMEWORK") + if framework: + if env_base: + return env_base + else: + return joinuser("~", "Library", framework, "%d.%d" % + sys.version_info[:2]) + + if env_base: + return env_base + else: + return joinuser("~", ".local") + + +def _parse_makefile(filename, vars=None): + """Parse a Makefile-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + # Regexes needed for parsing Makefile (and similar syntaxes, + # like old-style Setup files). + _variable_rx = re.compile(r"([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") + _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)") + _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}") + + if vars is None: + vars = {} + done = {} + notdone = {} + + with codecs.open(filename, encoding='utf-8', errors="surrogateescape") as f: + lines = f.readlines() + + for line in lines: + if line.startswith('#') or line.strip() == '': + continue + m = _variable_rx.match(line) + if m: + n, v = m.group(1, 2) + v = v.strip() + # `$$' is a literal `$' in make + tmpv = v.replace('$$', '') + + if "$" in tmpv: + notdone[n] = v + else: + try: + v = int(v) + except ValueError: + # insert literal `$' + done[n] = v.replace('$$', '$') + else: + done[n] = v + + # do variable interpolation here + variables = list(notdone.keys()) + + # Variables with a 'PY_' prefix in the makefile. These need to + # be made available without that prefix through sysconfig. + # Special care is needed to ensure that variable expansion works, even + # if the expansion uses the name without a prefix. + renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS') + + while len(variables) > 0: + for name in tuple(variables): + value = notdone[name] + m = _findvar1_rx.search(value) or _findvar2_rx.search(value) + if m is not None: + n = m.group(1) + found = True + if n in done: + item = str(done[n]) + elif n in notdone: + # get it on a subsequent round + found = False + elif n in os.environ: + # do it like make: fall back to environment + item = os.environ[n] + + elif n in renamed_variables: + if (name.startswith('PY_') and + name[3:] in renamed_variables): + item = "" + + elif 'PY_' + n in notdone: + found = False + + else: + item = str(done['PY_' + n]) + + else: + done[n] = item = "" + + if found: + after = value[m.end():] + value = value[:m.start()] + item + after + if "$" in after: + notdone[name] = value + else: + try: + value = int(value) + except ValueError: + done[name] = value.strip() + else: + done[name] = value + variables.remove(name) + + if (name.startswith('PY_') and + name[3:] in renamed_variables): + + name = name[3:] + if name not in done: + done[name] = value + + else: + # bogus variable reference (e.g. "prefix=$/opt/python"); + # just drop it since we can't deal + done[name] = value + variables.remove(name) + + # strip spurious spaces + for k, v in done.items(): + if isinstance(v, str): + done[k] = v.strip() + + # save the results in the global dictionary + vars.update(done) + return vars + + +def get_makefile_filename(): + """Return the path of the Makefile.""" + if _PYTHON_BUILD: + return os.path.join(_PROJECT_BASE, "Makefile") + if hasattr(sys, 'abiflags'): + config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags) + else: + config_dir_name = 'config' + return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile') + + +def _init_posix(vars): + """Initialize the module as appropriate for POSIX systems.""" + # load the installed Makefile: + makefile = get_makefile_filename() + try: + _parse_makefile(makefile, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % makefile + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # load the installed pyconfig.h: + config_h = get_config_h_filename() + try: + with open(config_h) as f: + parse_config_h(f, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % config_h + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # On AIX, there are wrong paths to the linker scripts in the Makefile + # -- these paths are relative to the Python source, but when installed + # the scripts are in another directory. + if _PYTHON_BUILD: + vars['LDSHARED'] = vars['BLDSHARED'] + + +def _init_non_posix(vars): + """Initialize the module as appropriate for NT""" + # set basic install directories + vars['LIBDEST'] = get_path('stdlib') + vars['BINLIBDEST'] = get_path('platstdlib') + vars['INCLUDEPY'] = get_path('include') + vars['SO'] = '.pyd' + vars['EXE'] = '.exe' + vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT + vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) + +# +# public APIs +# + + +def parse_config_h(fp, vars=None): + """Parse a config.h-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + if vars is None: + vars = {} + define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n") + undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n") + + while True: + line = fp.readline() + if not line: + break + m = define_rx.match(line) + if m: + n, v = m.group(1, 2) + try: + v = int(v) + except ValueError: + pass + vars[n] = v + else: + m = undef_rx.match(line) + if m: + vars[m.group(1)] = 0 + return vars + + +def get_config_h_filename(): + """Return the path of pyconfig.h.""" + if _PYTHON_BUILD: + if os.name == "nt": + inc_dir = os.path.join(_PROJECT_BASE, "PC") + else: + inc_dir = _PROJECT_BASE + else: + inc_dir = get_path('platinclude') + return os.path.join(inc_dir, 'pyconfig.h') + + +def get_scheme_names(): + """Return a tuple containing the schemes names.""" + return tuple(sorted(_SCHEMES.sections())) + + +def get_path_names(): + """Return a tuple containing the paths names.""" + # xxx see if we want a static list + return _SCHEMES.options('posix_prefix') + + +def get_paths(scheme=_get_default_scheme(), vars=None, expand=True): + """Return a mapping containing an install scheme. + + ``scheme`` is the install scheme name. If not provided, it will + return the default scheme for the current platform. + """ + _ensure_cfg_read() + if expand: + return _expand_vars(scheme, vars) + else: + return dict(_SCHEMES.items(scheme)) + + +def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True): + """Return a path corresponding to the scheme. + + ``scheme`` is the install scheme name. + """ + return get_paths(scheme, vars, expand)[name] + + +def get_config_vars(*args): + """With no arguments, return a dictionary of all configuration + variables relevant for the current platform. + + On Unix, this means every variable defined in Python's installed Makefile; + On Windows and Mac OS it's a much smaller set. + + With arguments, return a list of values that result from looking up + each argument in the configuration variable dictionary. + """ + global _CONFIG_VARS + if _CONFIG_VARS is None: + _CONFIG_VARS = {} + # Normalized versions of prefix and exec_prefix are handy to have; + # in fact, these are the standard versions used most places in the + # distutils2 module. + _CONFIG_VARS['prefix'] = _PREFIX + _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX + _CONFIG_VARS['py_version'] = _PY_VERSION + _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT + _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2] + _CONFIG_VARS['base'] = _PREFIX + _CONFIG_VARS['platbase'] = _EXEC_PREFIX + _CONFIG_VARS['projectbase'] = _PROJECT_BASE + try: + _CONFIG_VARS['abiflags'] = sys.abiflags + except AttributeError: + # sys.abiflags may not be defined on all platforms. + _CONFIG_VARS['abiflags'] = '' + + if os.name in ('nt', 'os2'): + _init_non_posix(_CONFIG_VARS) + if os.name == 'posix': + _init_posix(_CONFIG_VARS) + # Setting 'userbase' is done below the call to the + # init function to enable using 'get_config_var' in + # the init-function. + if sys.version >= '2.6': + _CONFIG_VARS['userbase'] = _getuserbase() + + if 'srcdir' not in _CONFIG_VARS: + _CONFIG_VARS['srcdir'] = _PROJECT_BASE + else: + _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir']) + + # Convert srcdir into an absolute path if it appears necessary. + # Normally it is relative to the build directory. However, during + # testing, for example, we might be running a non-installed python + # from a different directory. + if _PYTHON_BUILD and os.name == "posix": + base = _PROJECT_BASE + try: + cwd = os.getcwd() + except OSError: + cwd = None + if (not os.path.isabs(_CONFIG_VARS['srcdir']) and + base != cwd): + # srcdir is relative and we are not in the same directory + # as the executable. Assume executable is in the build + # directory and make srcdir absolute. + srcdir = os.path.join(base, _CONFIG_VARS['srcdir']) + _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir) + + if sys.platform == 'darwin': + kernel_version = os.uname()[2] # Kernel version (8.4.3) + major_version = int(kernel_version.split('.')[0]) + + if major_version < 8: + # On Mac OS X before 10.4, check if -arch and -isysroot + # are in CFLAGS or LDFLAGS and remove them if they are. + # This is needed when building extensions on a 10.3 system + # using a universal build of python. + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + flags = _CONFIG_VARS[key] + flags = re.sub(r'-arch\s+\w+\s', ' ', flags) + flags = re.sub('-isysroot [^ \t]*', ' ', flags) + _CONFIG_VARS[key] = flags + else: + # Allow the user to override the architecture flags using + # an environment variable. + # NOTE: This name was introduced by Apple in OSX 10.5 and + # is used by several scripting languages distributed with + # that OS release. + if 'ARCHFLAGS' in os.environ: + arch = os.environ['ARCHFLAGS'] + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub(r'-arch\s+\w+\s', ' ', flags) + flags = flags + ' ' + arch + _CONFIG_VARS[key] = flags + + # If we're on OSX 10.5 or later and the user tries to + # compiles an extension using an SDK that is not present + # on the current machine it is better to not use an SDK + # than to fail. + # + # The major usecase for this is users using a Python.org + # binary installer on OSX 10.6: that installer uses + # the 10.4u SDK, but that SDK is not installed by default + # when you install Xcode. + # + CFLAGS = _CONFIG_VARS.get('CFLAGS', '') + m = re.search(r'-isysroot\s+(\S+)', CFLAGS) + if m is not None: + sdk = m.group(1) + if not os.path.exists(sdk): + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub(r'-isysroot\s+\S+(\s|$)', ' ', flags) + _CONFIG_VARS[key] = flags + + if args: + vals = [] + for name in args: + vals.append(_CONFIG_VARS.get(name)) + return vals + else: + return _CONFIG_VARS + + +def get_config_var(name): + """Return the value of a single variable using the dictionary returned by + 'get_config_vars()'. + + Equivalent to get_config_vars().get(name) + """ + return get_config_vars().get(name) + + +def get_platform(): + """Return a string that identifies the current platform. + + This is used mainly to distinguish platform-specific build directories and + platform-specific built distributions. Typically includes the OS name + and version and the architecture (as supplied by 'os.uname()'), + although the exact information included depends on the OS; eg. for IRIX + the architecture isn't particularly important (IRIX only runs on SGI + hardware), but for Linux the kernel version isn't particularly + important. + + Examples of returned values: + linux-i586 + linux-alpha (?) + solaris-2.6-sun4u + irix-5.3 + irix64-6.2 + + Windows will return one of: + win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) + win-ia64 (64bit Windows on Itanium) + win32 (all others - specifically, sys.platform is returned) + + For other non-POSIX platforms, currently just returns 'sys.platform'. + """ + if os.name == 'nt': + # sniff sys.version for architecture. + prefix = " bit (" + i = sys.version.find(prefix) + if i == -1: + return sys.platform + j = sys.version.find(")", i) + look = sys.version[i+len(prefix):j].lower() + if look == 'amd64': + return 'win-amd64' + if look == 'itanium': + return 'win-ia64' + return sys.platform + + if os.name != "posix" or not hasattr(os, 'uname'): + # XXX what about the architecture? NT is Intel or Alpha, + # Mac OS is M68k or PPC, etc. + return sys.platform + + # Try to distinguish various flavours of Unix + osname, host, release, version, machine = os.uname() + + # Convert the OS name to lowercase, remove '/' characters + # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh") + osname = osname.lower().replace('/', '') + machine = machine.replace(' ', '_') + machine = machine.replace('/', '-') + + if osname[:5] == "linux": + # At least on Linux/Intel, 'machine' is the processor -- + # i386, etc. + # XXX what about Alpha, SPARC, etc? + return "%s-%s" % (osname, machine) + elif osname[:5] == "sunos": + if release[0] >= "5": # SunOS 5 == Solaris 2 + osname = "solaris" + release = "%d.%s" % (int(release[0]) - 3, release[2:]) + # fall through to standard osname-release-machine representation + elif osname[:4] == "irix": # could be "irix64"! + return "%s-%s" % (osname, release) + elif osname[:3] == "aix": + return "%s-%s.%s" % (osname, version, release) + elif osname[:6] == "cygwin": + osname = "cygwin" + rel_re = re.compile(r'[\d.]+') + m = rel_re.match(release) + if m: + release = m.group() + elif osname[:6] == "darwin": + # + # For our purposes, we'll assume that the system version from + # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set + # to. This makes the compatibility story a bit more sane because the + # machine is going to compile and link as if it were + # MACOSX_DEPLOYMENT_TARGET. + cfgvars = get_config_vars() + macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET') + + if True: + # Always calculate the release of the running machine, + # needed to determine if we can build fat binaries or not. + + macrelease = macver + # Get the system version. Reading this plist is a documented + # way to get the system version (see the documentation for + # the Gestalt Manager) + try: + f = open('/System/Library/CoreServices/SystemVersion.plist') + except IOError: + # We're on a plain darwin box, fall back to the default + # behaviour. + pass + else: + try: + m = re.search(r'<key>ProductUserVisibleVersion</key>\s*' + r'<string>(.*?)</string>', f.read()) + finally: + f.close() + if m is not None: + macrelease = '.'.join(m.group(1).split('.')[:2]) + # else: fall back to the default behaviour + + if not macver: + macver = macrelease + + if macver: + release = macver + osname = "macosx" + + if ((macrelease + '.') >= '10.4.' and + '-arch' in get_config_vars().get('CFLAGS', '').strip()): + # The universal build will build fat binaries, but not on + # systems before 10.4 + # + # Try to detect 4-way universal builds, those have machine-type + # 'universal' instead of 'fat'. + + machine = 'fat' + cflags = get_config_vars().get('CFLAGS') + + archs = re.findall(r'-arch\s+(\S+)', cflags) + archs = tuple(sorted(set(archs))) + + if len(archs) == 1: + machine = archs[0] + elif archs == ('i386', 'ppc'): + machine = 'fat' + elif archs == ('i386', 'x86_64'): + machine = 'intel' + elif archs == ('i386', 'ppc', 'x86_64'): + machine = 'fat3' + elif archs == ('ppc64', 'x86_64'): + machine = 'fat64' + elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'): + machine = 'universal' + else: + raise ValueError( + "Don't know machine value for archs=%r" % (archs,)) + + elif machine == 'i386': + # On OSX the machine type returned by uname is always the + # 32-bit variant, even if the executable architecture is + # the 64-bit variant + if sys.maxsize >= 2**32: + machine = 'x86_64' + + elif machine in ('PowerPC', 'Power_Macintosh'): + # Pick a sane name for the PPC architecture. + # See 'i386' case + if sys.maxsize >= 2**32: + machine = 'ppc64' + else: + machine = 'ppc' + + return "%s-%s-%s" % (osname, release, machine) + + +def get_python_version(): + return _PY_VERSION_SHORT + + +def _print_dict(title, data): + for index, (key, value) in enumerate(sorted(data.items())): + if index == 0: + print('%s: ' % (title)) + print('\t%s = "%s"' % (key, value)) + + +def _main(): + """Display all information sysconfig detains.""" + print('Platform: "%s"' % get_platform()) + print('Python version: "%s"' % get_python_version()) + print('Current installation scheme: "%s"' % _get_default_scheme()) + print() + _print_dict('Paths', get_paths()) + print() + _print_dict('Variables', get_config_vars()) + + +if __name__ == '__main__': + _main() diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/tarfile.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/tarfile.py new file mode 100644 index 0000000..d66d856 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/tarfile.py @@ -0,0 +1,2607 @@ +#------------------------------------------------------------------- +# tarfile.py +#------------------------------------------------------------------- +# Copyright (C) 2002 Lars Gustaebel <lars@gustaebel.de> +# All rights reserved. +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following +# conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +from __future__ import print_function + +"""Read from and write to tar format archives. +""" + +__version__ = "$Revision$" + +version = "0.9.0" +__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)" +__date__ = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $" +__cvsid__ = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $" +__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend." + +#--------- +# Imports +#--------- +import sys +import os +import stat +import errno +import time +import struct +import copy +import re + +try: + import grp, pwd +except ImportError: + grp = pwd = None + +# os.symlink on Windows prior to 6.0 raises NotImplementedError +symlink_exception = (AttributeError, NotImplementedError) +try: + # WindowsError (1314) will be raised if the caller does not hold the + # SeCreateSymbolicLinkPrivilege privilege + symlink_exception += (WindowsError,) +except NameError: + pass + +# from tarfile import * +__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"] + +if sys.version_info[0] < 3: + import __builtin__ as builtins +else: + import builtins + +_open = builtins.open # Since 'open' is TarFile.open + +#--------------------------------------------------------- +# tar constants +#--------------------------------------------------------- +NUL = b"\0" # the null character +BLOCKSIZE = 512 # length of processing blocks +RECORDSIZE = BLOCKSIZE * 20 # length of records +GNU_MAGIC = b"ustar \0" # magic gnu tar string +POSIX_MAGIC = b"ustar\x0000" # magic posix tar string + +LENGTH_NAME = 100 # maximum length of a filename +LENGTH_LINK = 100 # maximum length of a linkname +LENGTH_PREFIX = 155 # maximum length of the prefix field + +REGTYPE = b"0" # regular file +AREGTYPE = b"\0" # regular file +LNKTYPE = b"1" # link (inside tarfile) +SYMTYPE = b"2" # symbolic link +CHRTYPE = b"3" # character special device +BLKTYPE = b"4" # block special device +DIRTYPE = b"5" # directory +FIFOTYPE = b"6" # fifo special device +CONTTYPE = b"7" # contiguous file + +GNUTYPE_LONGNAME = b"L" # GNU tar longname +GNUTYPE_LONGLINK = b"K" # GNU tar longlink +GNUTYPE_SPARSE = b"S" # GNU tar sparse file + +XHDTYPE = b"x" # POSIX.1-2001 extended header +XGLTYPE = b"g" # POSIX.1-2001 global header +SOLARIS_XHDTYPE = b"X" # Solaris extended header + +USTAR_FORMAT = 0 # POSIX.1-1988 (ustar) format +GNU_FORMAT = 1 # GNU tar format +PAX_FORMAT = 2 # POSIX.1-2001 (pax) format +DEFAULT_FORMAT = GNU_FORMAT + +#--------------------------------------------------------- +# tarfile constants +#--------------------------------------------------------- +# File types that tarfile supports: +SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE, + SYMTYPE, DIRTYPE, FIFOTYPE, + CONTTYPE, CHRTYPE, BLKTYPE, + GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# File types that will be treated as a regular file. +REGULAR_TYPES = (REGTYPE, AREGTYPE, + CONTTYPE, GNUTYPE_SPARSE) + +# File types that are part of the GNU tar format. +GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# Fields from a pax header that override a TarInfo attribute. +PAX_FIELDS = ("path", "linkpath", "size", "mtime", + "uid", "gid", "uname", "gname") + +# Fields from a pax header that are affected by hdrcharset. +PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname")) + +# Fields in a pax header that are numbers, all other fields +# are treated as strings. +PAX_NUMBER_FIELDS = { + "atime": float, + "ctime": float, + "mtime": float, + "uid": int, + "gid": int, + "size": int +} + +#--------------------------------------------------------- +# Bits used in the mode field, values in octal. +#--------------------------------------------------------- +S_IFLNK = 0o120000 # symbolic link +S_IFREG = 0o100000 # regular file +S_IFBLK = 0o060000 # block device +S_IFDIR = 0o040000 # directory +S_IFCHR = 0o020000 # character device +S_IFIFO = 0o010000 # fifo + +TSUID = 0o4000 # set UID on execution +TSGID = 0o2000 # set GID on execution +TSVTX = 0o1000 # reserved + +TUREAD = 0o400 # read by owner +TUWRITE = 0o200 # write by owner +TUEXEC = 0o100 # execute/search by owner +TGREAD = 0o040 # read by group +TGWRITE = 0o020 # write by group +TGEXEC = 0o010 # execute/search by group +TOREAD = 0o004 # read by other +TOWRITE = 0o002 # write by other +TOEXEC = 0o001 # execute/search by other + +#--------------------------------------------------------- +# initialization +#--------------------------------------------------------- +if os.name in ("nt", "ce"): + ENCODING = "utf-8" +else: + ENCODING = sys.getfilesystemencoding() + +#--------------------------------------------------------- +# Some useful functions +#--------------------------------------------------------- + +def stn(s, length, encoding, errors): + """Convert a string to a null-terminated bytes object. + """ + s = s.encode(encoding, errors) + return s[:length] + (length - len(s)) * NUL + +def nts(s, encoding, errors): + """Convert a null-terminated bytes object to a string. + """ + p = s.find(b"\0") + if p != -1: + s = s[:p] + return s.decode(encoding, errors) + +def nti(s): + """Convert a number field to a python number. + """ + # There are two possible encodings for a number field, see + # itn() below. + if s[0] != chr(0o200): + try: + n = int(nts(s, "ascii", "strict") or "0", 8) + except ValueError: + raise InvalidHeaderError("invalid header") + else: + n = 0 + for i in range(len(s) - 1): + n <<= 8 + n += ord(s[i + 1]) + return n + +def itn(n, digits=8, format=DEFAULT_FORMAT): + """Convert a python number to a number field. + """ + # POSIX 1003.1-1988 requires numbers to be encoded as a string of + # octal digits followed by a null-byte, this allows values up to + # (8**(digits-1))-1. GNU tar allows storing numbers greater than + # that if necessary. A leading 0o200 byte indicates this particular + # encoding, the following digits-1 bytes are a big-endian + # representation. This allows values up to (256**(digits-1))-1. + if 0 <= n < 8 ** (digits - 1): + s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL + else: + if format != GNU_FORMAT or n >= 256 ** (digits - 1): + raise ValueError("overflow in number field") + + if n < 0: + # XXX We mimic GNU tar's behaviour with negative numbers, + # this could raise OverflowError. + n = struct.unpack("L", struct.pack("l", n))[0] + + s = bytearray() + for i in range(digits - 1): + s.insert(0, n & 0o377) + n >>= 8 + s.insert(0, 0o200) + return s + +def calc_chksums(buf): + """Calculate the checksum for a member's header by summing up all + characters except for the chksum field which is treated as if + it was filled with spaces. According to the GNU tar sources, + some tars (Sun and NeXT) calculate chksum with signed char, + which will be different if there are chars in the buffer with + the high bit set. So we calculate two checksums, unsigned and + signed. + """ + unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512])) + signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512])) + return unsigned_chksum, signed_chksum + +def copyfileobj(src, dst, length=None): + """Copy length bytes from fileobj src to fileobj dst. + If length is None, copy the entire content. + """ + if length == 0: + return + if length is None: + while True: + buf = src.read(16*1024) + if not buf: + break + dst.write(buf) + return + + BUFSIZE = 16 * 1024 + blocks, remainder = divmod(length, BUFSIZE) + for b in range(blocks): + buf = src.read(BUFSIZE) + if len(buf) < BUFSIZE: + raise IOError("end of file reached") + dst.write(buf) + + if remainder != 0: + buf = src.read(remainder) + if len(buf) < remainder: + raise IOError("end of file reached") + dst.write(buf) + return + +filemode_table = ( + ((S_IFLNK, "l"), + (S_IFREG, "-"), + (S_IFBLK, "b"), + (S_IFDIR, "d"), + (S_IFCHR, "c"), + (S_IFIFO, "p")), + + ((TUREAD, "r"),), + ((TUWRITE, "w"),), + ((TUEXEC|TSUID, "s"), + (TSUID, "S"), + (TUEXEC, "x")), + + ((TGREAD, "r"),), + ((TGWRITE, "w"),), + ((TGEXEC|TSGID, "s"), + (TSGID, "S"), + (TGEXEC, "x")), + + ((TOREAD, "r"),), + ((TOWRITE, "w"),), + ((TOEXEC|TSVTX, "t"), + (TSVTX, "T"), + (TOEXEC, "x")) +) + +def filemode(mode): + """Convert a file's mode to a string of the form + -rwxrwxrwx. + Used by TarFile.list() + """ + perm = [] + for table in filemode_table: + for bit, char in table: + if mode & bit == bit: + perm.append(char) + break + else: + perm.append("-") + return "".join(perm) + +class TarError(Exception): + """Base exception.""" + pass +class ExtractError(TarError): + """General exception for extract errors.""" + pass +class ReadError(TarError): + """Exception for unreadable tar archives.""" + pass +class CompressionError(TarError): + """Exception for unavailable compression methods.""" + pass +class StreamError(TarError): + """Exception for unsupported operations on stream-like TarFiles.""" + pass +class HeaderError(TarError): + """Base exception for header errors.""" + pass +class EmptyHeaderError(HeaderError): + """Exception for empty headers.""" + pass +class TruncatedHeaderError(HeaderError): + """Exception for truncated headers.""" + pass +class EOFHeaderError(HeaderError): + """Exception for end of file headers.""" + pass +class InvalidHeaderError(HeaderError): + """Exception for invalid headers.""" + pass +class SubsequentHeaderError(HeaderError): + """Exception for missing and invalid extended headers.""" + pass + +#--------------------------- +# internal stream interface +#--------------------------- +class _LowLevelFile(object): + """Low-level file object. Supports reading and writing. + It is used instead of a regular file object for streaming + access. + """ + + def __init__(self, name, mode): + mode = { + "r": os.O_RDONLY, + "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC, + }[mode] + if hasattr(os, "O_BINARY"): + mode |= os.O_BINARY + self.fd = os.open(name, mode, 0o666) + + def close(self): + os.close(self.fd) + + def read(self, size): + return os.read(self.fd, size) + + def write(self, s): + os.write(self.fd, s) + +class _Stream(object): + """Class that serves as an adapter between TarFile and + a stream-like object. The stream-like object only + needs to have a read() or write() method and is accessed + blockwise. Use of gzip or bzip2 compression is possible. + A stream-like object could be for example: sys.stdin, + sys.stdout, a socket, a tape device etc. + + _Stream is intended to be used only internally. + """ + + def __init__(self, name, mode, comptype, fileobj, bufsize): + """Construct a _Stream object. + """ + self._extfileobj = True + if fileobj is None: + fileobj = _LowLevelFile(name, mode) + self._extfileobj = False + + if comptype == '*': + # Enable transparent compression detection for the + # stream interface + fileobj = _StreamProxy(fileobj) + comptype = fileobj.getcomptype() + + self.name = name or "" + self.mode = mode + self.comptype = comptype + self.fileobj = fileobj + self.bufsize = bufsize + self.buf = b"" + self.pos = 0 + self.closed = False + + try: + if comptype == "gz": + try: + import zlib + except ImportError: + raise CompressionError("zlib module is not available") + self.zlib = zlib + self.crc = zlib.crc32(b"") + if mode == "r": + self._init_read_gz() + else: + self._init_write_gz() + + if comptype == "bz2": + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + if mode == "r": + self.dbuf = b"" + self.cmp = bz2.BZ2Decompressor() + else: + self.cmp = bz2.BZ2Compressor() + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + def __del__(self): + if hasattr(self, "closed") and not self.closed: + self.close() + + def _init_write_gz(self): + """Initialize for writing with gzip compression. + """ + self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED, + -self.zlib.MAX_WBITS, + self.zlib.DEF_MEM_LEVEL, + 0) + timestamp = struct.pack("<L", int(time.time())) + self.__write(b"\037\213\010\010" + timestamp + b"\002\377") + if self.name.endswith(".gz"): + self.name = self.name[:-3] + # RFC1952 says we must use ISO-8859-1 for the FNAME field. + self.__write(self.name.encode("iso-8859-1", "replace") + NUL) + + def write(self, s): + """Write string s to the stream. + """ + if self.comptype == "gz": + self.crc = self.zlib.crc32(s, self.crc) + self.pos += len(s) + if self.comptype != "tar": + s = self.cmp.compress(s) + self.__write(s) + + def __write(self, s): + """Write string s to the stream if a whole new block + is ready to be written. + """ + self.buf += s + while len(self.buf) > self.bufsize: + self.fileobj.write(self.buf[:self.bufsize]) + self.buf = self.buf[self.bufsize:] + + def close(self): + """Close the _Stream object. No operation should be + done on it afterwards. + """ + if self.closed: + return + + if self.mode == "w" and self.comptype != "tar": + self.buf += self.cmp.flush() + + if self.mode == "w" and self.buf: + self.fileobj.write(self.buf) + self.buf = b"" + if self.comptype == "gz": + # The native zlib crc is an unsigned 32-bit integer, but + # the Python wrapper implicitly casts that to a signed C + # long. So, on a 32-bit box self.crc may "look negative", + # while the same crc on a 64-bit box may "look positive". + # To avoid irksome warnings from the `struct` module, force + # it to look positive on all boxes. + self.fileobj.write(struct.pack("<L", self.crc & 0xffffffff)) + self.fileobj.write(struct.pack("<L", self.pos & 0xffffFFFF)) + + if not self._extfileobj: + self.fileobj.close() + + self.closed = True + + def _init_read_gz(self): + """Initialize for reading a gzip compressed fileobj. + """ + self.cmp = self.zlib.decompressobj(-self.zlib.MAX_WBITS) + self.dbuf = b"" + + # taken from gzip.GzipFile with some alterations + if self.__read(2) != b"\037\213": + raise ReadError("not a gzip file") + if self.__read(1) != b"\010": + raise CompressionError("unsupported compression method") + + flag = ord(self.__read(1)) + self.__read(6) + + if flag & 4: + xlen = ord(self.__read(1)) + 256 * ord(self.__read(1)) + self.read(xlen) + if flag & 8: + while True: + s = self.__read(1) + if not s or s == NUL: + break + if flag & 16: + while True: + s = self.__read(1) + if not s or s == NUL: + break + if flag & 2: + self.__read(2) + + def tell(self): + """Return the stream's file pointer position. + """ + return self.pos + + def seek(self, pos=0): + """Set the stream's file pointer to pos. Negative seeking + is forbidden. + """ + if pos - self.pos >= 0: + blocks, remainder = divmod(pos - self.pos, self.bufsize) + for i in range(blocks): + self.read(self.bufsize) + self.read(remainder) + else: + raise StreamError("seeking backwards is not allowed") + return self.pos + + def read(self, size=None): + """Return the next size number of bytes from the stream. + If size is not defined, return all bytes of the stream + up to EOF. + """ + if size is None: + t = [] + while True: + buf = self._read(self.bufsize) + if not buf: + break + t.append(buf) + buf = "".join(t) + else: + buf = self._read(size) + self.pos += len(buf) + return buf + + def _read(self, size): + """Return size bytes from the stream. + """ + if self.comptype == "tar": + return self.__read(size) + + c = len(self.dbuf) + while c < size: + buf = self.__read(self.bufsize) + if not buf: + break + try: + buf = self.cmp.decompress(buf) + except IOError: + raise ReadError("invalid compressed data") + self.dbuf += buf + c += len(buf) + buf = self.dbuf[:size] + self.dbuf = self.dbuf[size:] + return buf + + def __read(self, size): + """Return size bytes from stream. If internal buffer is empty, + read another block from the stream. + """ + c = len(self.buf) + while c < size: + buf = self.fileobj.read(self.bufsize) + if not buf: + break + self.buf += buf + c += len(buf) + buf = self.buf[:size] + self.buf = self.buf[size:] + return buf +# class _Stream + +class _StreamProxy(object): + """Small proxy class that enables transparent compression + detection for the Stream interface (mode 'r|*'). + """ + + def __init__(self, fileobj): + self.fileobj = fileobj + self.buf = self.fileobj.read(BLOCKSIZE) + + def read(self, size): + self.read = self.fileobj.read + return self.buf + + def getcomptype(self): + if self.buf.startswith(b"\037\213\010"): + return "gz" + if self.buf.startswith(b"BZh91"): + return "bz2" + return "tar" + + def close(self): + self.fileobj.close() +# class StreamProxy + +class _BZ2Proxy(object): + """Small proxy class that enables external file object + support for "r:bz2" and "w:bz2" modes. This is actually + a workaround for a limitation in bz2 module's BZ2File + class which (unlike gzip.GzipFile) has no support for + a file object argument. + """ + + blocksize = 16 * 1024 + + def __init__(self, fileobj, mode): + self.fileobj = fileobj + self.mode = mode + self.name = getattr(self.fileobj, "name", None) + self.init() + + def init(self): + import bz2 + self.pos = 0 + if self.mode == "r": + self.bz2obj = bz2.BZ2Decompressor() + self.fileobj.seek(0) + self.buf = b"" + else: + self.bz2obj = bz2.BZ2Compressor() + + def read(self, size): + x = len(self.buf) + while x < size: + raw = self.fileobj.read(self.blocksize) + if not raw: + break + data = self.bz2obj.decompress(raw) + self.buf += data + x += len(data) + + buf = self.buf[:size] + self.buf = self.buf[size:] + self.pos += len(buf) + return buf + + def seek(self, pos): + if pos < self.pos: + self.init() + self.read(pos - self.pos) + + def tell(self): + return self.pos + + def write(self, data): + self.pos += len(data) + raw = self.bz2obj.compress(data) + self.fileobj.write(raw) + + def close(self): + if self.mode == "w": + raw = self.bz2obj.flush() + self.fileobj.write(raw) +# class _BZ2Proxy + +#------------------------ +# Extraction file object +#------------------------ +class _FileInFile(object): + """A thin wrapper around an existing file object that + provides a part of its data as an individual file + object. + """ + + def __init__(self, fileobj, offset, size, blockinfo=None): + self.fileobj = fileobj + self.offset = offset + self.size = size + self.position = 0 + + if blockinfo is None: + blockinfo = [(0, size)] + + # Construct a map with data and zero blocks. + self.map_index = 0 + self.map = [] + lastpos = 0 + realpos = self.offset + for offset, size in blockinfo: + if offset > lastpos: + self.map.append((False, lastpos, offset, None)) + self.map.append((True, offset, offset + size, realpos)) + realpos += size + lastpos = offset + size + if lastpos < self.size: + self.map.append((False, lastpos, self.size, None)) + + def seekable(self): + if not hasattr(self.fileobj, "seekable"): + # XXX gzip.GzipFile and bz2.BZ2File + return True + return self.fileobj.seekable() + + def tell(self): + """Return the current file position. + """ + return self.position + + def seek(self, position): + """Seek to a position in the file. + """ + self.position = position + + def read(self, size=None): + """Read data from the file. + """ + if size is None: + size = self.size - self.position + else: + size = min(size, self.size - self.position) + + buf = b"" + while size > 0: + while True: + data, start, stop, offset = self.map[self.map_index] + if start <= self.position < stop: + break + else: + self.map_index += 1 + if self.map_index == len(self.map): + self.map_index = 0 + length = min(size, stop - self.position) + if data: + self.fileobj.seek(offset + (self.position - start)) + buf += self.fileobj.read(length) + else: + buf += NUL * length + size -= length + self.position += length + return buf +#class _FileInFile + + +class ExFileObject(object): + """File-like object for reading an archive member. + Is returned by TarFile.extractfile(). + """ + blocksize = 1024 + + def __init__(self, tarfile, tarinfo): + self.fileobj = _FileInFile(tarfile.fileobj, + tarinfo.offset_data, + tarinfo.size, + tarinfo.sparse) + self.name = tarinfo.name + self.mode = "r" + self.closed = False + self.size = tarinfo.size + + self.position = 0 + self.buffer = b"" + + def readable(self): + return True + + def writable(self): + return False + + def seekable(self): + return self.fileobj.seekable() + + def read(self, size=None): + """Read at most size bytes from the file. If size is not + present or None, read all data until EOF is reached. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + buf = b"" + if self.buffer: + if size is None: + buf = self.buffer + self.buffer = b"" + else: + buf = self.buffer[:size] + self.buffer = self.buffer[size:] + + if size is None: + buf += self.fileobj.read() + else: + buf += self.fileobj.read(size - len(buf)) + + self.position += len(buf) + return buf + + # XXX TextIOWrapper uses the read1() method. + read1 = read + + def readline(self, size=-1): + """Read one entire line from the file. If size is present + and non-negative, return a string with at most that + size, which may be an incomplete line. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + while True: + buf = self.fileobj.read(self.blocksize) + self.buffer += buf + if not buf or b"\n" in buf: + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + pos = len(self.buffer) + break + + if size != -1: + pos = min(size, pos) + + buf = self.buffer[:pos] + self.buffer = self.buffer[pos:] + self.position += len(buf) + return buf + + def readlines(self): + """Return a list with all remaining lines. + """ + result = [] + while True: + line = self.readline() + if not line: break + result.append(line) + return result + + def tell(self): + """Return the current file position. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + return self.position + + def seek(self, pos, whence=os.SEEK_SET): + """Seek to a position in the file. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + if whence == os.SEEK_SET: + self.position = min(max(pos, 0), self.size) + elif whence == os.SEEK_CUR: + if pos < 0: + self.position = max(self.position + pos, 0) + else: + self.position = min(self.position + pos, self.size) + elif whence == os.SEEK_END: + self.position = max(min(self.size + pos, self.size), 0) + else: + raise ValueError("Invalid argument") + + self.buffer = b"" + self.fileobj.seek(self.position) + + def close(self): + """Close the file object. + """ + self.closed = True + + def __iter__(self): + """Get an iterator over the file's lines. + """ + while True: + line = self.readline() + if not line: + break + yield line +#class ExFileObject + +#------------------ +# Exported Classes +#------------------ +class TarInfo(object): + """Informational class which holds the details about an + archive member given by a tar header block. + TarInfo objects are returned by TarFile.getmember(), + TarFile.getmembers() and TarFile.gettarinfo() and are + usually created internally. + """ + + __slots__ = ("name", "mode", "uid", "gid", "size", "mtime", + "chksum", "type", "linkname", "uname", "gname", + "devmajor", "devminor", + "offset", "offset_data", "pax_headers", "sparse", + "tarfile", "_sparse_structs", "_link_target") + + def __init__(self, name=""): + """Construct a TarInfo object. name is the optional name + of the member. + """ + self.name = name # member name + self.mode = 0o644 # file permissions + self.uid = 0 # user id + self.gid = 0 # group id + self.size = 0 # file size + self.mtime = 0 # modification time + self.chksum = 0 # header checksum + self.type = REGTYPE # member type + self.linkname = "" # link name + self.uname = "" # user name + self.gname = "" # group name + self.devmajor = 0 # device major number + self.devminor = 0 # device minor number + + self.offset = 0 # the tar header starts here + self.offset_data = 0 # the file's data starts here + + self.sparse = None # sparse member information + self.pax_headers = {} # pax header information + + # In pax headers the "name" and "linkname" field are called + # "path" and "linkpath". + def _getpath(self): + return self.name + def _setpath(self, name): + self.name = name + path = property(_getpath, _setpath) + + def _getlinkpath(self): + return self.linkname + def _setlinkpath(self, linkname): + self.linkname = linkname + linkpath = property(_getlinkpath, _setlinkpath) + + def __repr__(self): + return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self)) + + def get_info(self): + """Return the TarInfo's attributes as a dictionary. + """ + info = { + "name": self.name, + "mode": self.mode & 0o7777, + "uid": self.uid, + "gid": self.gid, + "size": self.size, + "mtime": self.mtime, + "chksum": self.chksum, + "type": self.type, + "linkname": self.linkname, + "uname": self.uname, + "gname": self.gname, + "devmajor": self.devmajor, + "devminor": self.devminor + } + + if info["type"] == DIRTYPE and not info["name"].endswith("/"): + info["name"] += "/" + + return info + + def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"): + """Return a tar header as a string of 512 byte blocks. + """ + info = self.get_info() + + if format == USTAR_FORMAT: + return self.create_ustar_header(info, encoding, errors) + elif format == GNU_FORMAT: + return self.create_gnu_header(info, encoding, errors) + elif format == PAX_FORMAT: + return self.create_pax_header(info, encoding) + else: + raise ValueError("invalid format") + + def create_ustar_header(self, info, encoding, errors): + """Return the object as a ustar header block. + """ + info["magic"] = POSIX_MAGIC + + if len(info["linkname"]) > LENGTH_LINK: + raise ValueError("linkname is too long") + + if len(info["name"]) > LENGTH_NAME: + info["prefix"], info["name"] = self._posix_split_name(info["name"]) + + return self._create_header(info, USTAR_FORMAT, encoding, errors) + + def create_gnu_header(self, info, encoding, errors): + """Return the object as a GNU header block sequence. + """ + info["magic"] = GNU_MAGIC + + buf = b"" + if len(info["linkname"]) > LENGTH_LINK: + buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors) + + if len(info["name"]) > LENGTH_NAME: + buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors) + + return buf + self._create_header(info, GNU_FORMAT, encoding, errors) + + def create_pax_header(self, info, encoding): + """Return the object as a ustar header block. If it cannot be + represented this way, prepend a pax extended header sequence + with supplement information. + """ + info["magic"] = POSIX_MAGIC + pax_headers = self.pax_headers.copy() + + # Test string fields for values that exceed the field length or cannot + # be represented in ASCII encoding. + for name, hname, length in ( + ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK), + ("uname", "uname", 32), ("gname", "gname", 32)): + + if hname in pax_headers: + # The pax header has priority. + continue + + # Try to encode the string as ASCII. + try: + info[name].encode("ascii", "strict") + except UnicodeEncodeError: + pax_headers[hname] = info[name] + continue + + if len(info[name]) > length: + pax_headers[hname] = info[name] + + # Test number fields for values that exceed the field limit or values + # that like to be stored as float. + for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)): + if name in pax_headers: + # The pax header has priority. Avoid overflow. + info[name] = 0 + continue + + val = info[name] + if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float): + pax_headers[name] = str(val) + info[name] = 0 + + # Create a pax extended header if necessary. + if pax_headers: + buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding) + else: + buf = b"" + + return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace") + + @classmethod + def create_pax_global_header(cls, pax_headers): + """Return the object as a pax global header block sequence. + """ + return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8") + + def _posix_split_name(self, name): + """Split a name longer than 100 chars into a prefix + and a name part. + """ + prefix = name[:LENGTH_PREFIX + 1] + while prefix and prefix[-1] != "/": + prefix = prefix[:-1] + + name = name[len(prefix):] + prefix = prefix[:-1] + + if not prefix or len(name) > LENGTH_NAME: + raise ValueError("name is too long") + return prefix, name + + @staticmethod + def _create_header(info, format, encoding, errors): + """Return a header block. info is a dictionary with file + information, format must be one of the *_FORMAT constants. + """ + parts = [ + stn(info.get("name", ""), 100, encoding, errors), + itn(info.get("mode", 0) & 0o7777, 8, format), + itn(info.get("uid", 0), 8, format), + itn(info.get("gid", 0), 8, format), + itn(info.get("size", 0), 12, format), + itn(info.get("mtime", 0), 12, format), + b" ", # checksum field + info.get("type", REGTYPE), + stn(info.get("linkname", ""), 100, encoding, errors), + info.get("magic", POSIX_MAGIC), + stn(info.get("uname", ""), 32, encoding, errors), + stn(info.get("gname", ""), 32, encoding, errors), + itn(info.get("devmajor", 0), 8, format), + itn(info.get("devminor", 0), 8, format), + stn(info.get("prefix", ""), 155, encoding, errors) + ] + + buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts)) + chksum = calc_chksums(buf[-BLOCKSIZE:])[0] + buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:] + return buf + + @staticmethod + def _create_payload(payload): + """Return the string payload filled with zero bytes + up to the next 512 byte border. + """ + blocks, remainder = divmod(len(payload), BLOCKSIZE) + if remainder > 0: + payload += (BLOCKSIZE - remainder) * NUL + return payload + + @classmethod + def _create_gnu_long_header(cls, name, type, encoding, errors): + """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence + for name. + """ + name = name.encode(encoding, errors) + NUL + + info = {} + info["name"] = "././@LongLink" + info["type"] = type + info["size"] = len(name) + info["magic"] = GNU_MAGIC + + # create extended header + name blocks. + return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \ + cls._create_payload(name) + + @classmethod + def _create_pax_generic_header(cls, pax_headers, type, encoding): + """Return a POSIX.1-2008 extended or global header sequence + that contains a list of keyword, value pairs. The values + must be strings. + """ + # Check if one of the fields contains surrogate characters and thereby + # forces hdrcharset=BINARY, see _proc_pax() for more information. + binary = False + for keyword, value in pax_headers.items(): + try: + value.encode("utf8", "strict") + except UnicodeEncodeError: + binary = True + break + + records = b"" + if binary: + # Put the hdrcharset field at the beginning of the header. + records += b"21 hdrcharset=BINARY\n" + + for keyword, value in pax_headers.items(): + keyword = keyword.encode("utf8") + if binary: + # Try to restore the original byte representation of `value'. + # Needless to say, that the encoding must match the string. + value = value.encode(encoding, "surrogateescape") + else: + value = value.encode("utf8") + + l = len(keyword) + len(value) + 3 # ' ' + '=' + '\n' + n = p = 0 + while True: + n = l + len(str(p)) + if n == p: + break + p = n + records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n" + + # We use a hardcoded "././@PaxHeader" name like star does + # instead of the one that POSIX recommends. + info = {} + info["name"] = "././@PaxHeader" + info["type"] = type + info["size"] = len(records) + info["magic"] = POSIX_MAGIC + + # Create pax header + record blocks. + return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \ + cls._create_payload(records) + + @classmethod + def frombuf(cls, buf, encoding, errors): + """Construct a TarInfo object from a 512 byte bytes object. + """ + if len(buf) == 0: + raise EmptyHeaderError("empty header") + if len(buf) != BLOCKSIZE: + raise TruncatedHeaderError("truncated header") + if buf.count(NUL) == BLOCKSIZE: + raise EOFHeaderError("end of file header") + + chksum = nti(buf[148:156]) + if chksum not in calc_chksums(buf): + raise InvalidHeaderError("bad checksum") + + obj = cls() + obj.name = nts(buf[0:100], encoding, errors) + obj.mode = nti(buf[100:108]) + obj.uid = nti(buf[108:116]) + obj.gid = nti(buf[116:124]) + obj.size = nti(buf[124:136]) + obj.mtime = nti(buf[136:148]) + obj.chksum = chksum + obj.type = buf[156:157] + obj.linkname = nts(buf[157:257], encoding, errors) + obj.uname = nts(buf[265:297], encoding, errors) + obj.gname = nts(buf[297:329], encoding, errors) + obj.devmajor = nti(buf[329:337]) + obj.devminor = nti(buf[337:345]) + prefix = nts(buf[345:500], encoding, errors) + + # Old V7 tar format represents a directory as a regular + # file with a trailing slash. + if obj.type == AREGTYPE and obj.name.endswith("/"): + obj.type = DIRTYPE + + # The old GNU sparse format occupies some of the unused + # space in the buffer for up to 4 sparse structures. + # Save the them for later processing in _proc_sparse(). + if obj.type == GNUTYPE_SPARSE: + pos = 386 + structs = [] + for i in range(4): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[482]) + origsize = nti(buf[483:495]) + obj._sparse_structs = (structs, isextended, origsize) + + # Remove redundant slashes from directories. + if obj.isdir(): + obj.name = obj.name.rstrip("/") + + # Reconstruct a ustar longname. + if prefix and obj.type not in GNU_TYPES: + obj.name = prefix + "/" + obj.name + return obj + + @classmethod + def fromtarfile(cls, tarfile): + """Return the next TarInfo object from TarFile object + tarfile. + """ + buf = tarfile.fileobj.read(BLOCKSIZE) + obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors) + obj.offset = tarfile.fileobj.tell() - BLOCKSIZE + return obj._proc_member(tarfile) + + #-------------------------------------------------------------------------- + # The following are methods that are called depending on the type of a + # member. The entry point is _proc_member() which can be overridden in a + # subclass to add custom _proc_*() methods. A _proc_*() method MUST + # implement the following + # operations: + # 1. Set self.offset_data to the position where the data blocks begin, + # if there is data that follows. + # 2. Set tarfile.offset to the position where the next member's header will + # begin. + # 3. Return self or another valid TarInfo object. + def _proc_member(self, tarfile): + """Choose the right processing method depending on + the type and call it. + """ + if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK): + return self._proc_gnulong(tarfile) + elif self.type == GNUTYPE_SPARSE: + return self._proc_sparse(tarfile) + elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE): + return self._proc_pax(tarfile) + else: + return self._proc_builtin(tarfile) + + def _proc_builtin(self, tarfile): + """Process a builtin type or an unknown type which + will be treated as a regular file. + """ + self.offset_data = tarfile.fileobj.tell() + offset = self.offset_data + if self.isreg() or self.type not in SUPPORTED_TYPES: + # Skip the following data blocks. + offset += self._block(self.size) + tarfile.offset = offset + + # Patch the TarInfo object with saved global + # header information. + self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors) + + return self + + def _proc_gnulong(self, tarfile): + """Process the blocks that hold a GNU longname + or longlink member. + """ + buf = tarfile.fileobj.read(self._block(self.size)) + + # Fetch the next header and process it. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Patch the TarInfo object from the next header with + # the longname information. + next.offset = self.offset + if self.type == GNUTYPE_LONGNAME: + next.name = nts(buf, tarfile.encoding, tarfile.errors) + elif self.type == GNUTYPE_LONGLINK: + next.linkname = nts(buf, tarfile.encoding, tarfile.errors) + + return next + + def _proc_sparse(self, tarfile): + """Process a GNU sparse header plus extra headers. + """ + # We already collected some sparse structures in frombuf(). + structs, isextended, origsize = self._sparse_structs + del self._sparse_structs + + # Collect sparse structures from extended header blocks. + while isextended: + buf = tarfile.fileobj.read(BLOCKSIZE) + pos = 0 + for i in range(21): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + if offset and numbytes: + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[504]) + self.sparse = structs + + self.offset_data = tarfile.fileobj.tell() + tarfile.offset = self.offset_data + self._block(self.size) + self.size = origsize + return self + + def _proc_pax(self, tarfile): + """Process an extended or global header as described in + POSIX.1-2008. + """ + # Read the header information. + buf = tarfile.fileobj.read(self._block(self.size)) + + # A pax header stores supplemental information for either + # the following file (extended) or all following files + # (global). + if self.type == XGLTYPE: + pax_headers = tarfile.pax_headers + else: + pax_headers = tarfile.pax_headers.copy() + + # Check if the pax header contains a hdrcharset field. This tells us + # the encoding of the path, linkpath, uname and gname fields. Normally, + # these fields are UTF-8 encoded but since POSIX.1-2008 tar + # implementations are allowed to store them as raw binary strings if + # the translation to UTF-8 fails. + match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf) + if match is not None: + pax_headers["hdrcharset"] = match.group(1).decode("utf8") + + # For the time being, we don't care about anything other than "BINARY". + # The only other value that is currently allowed by the standard is + # "ISO-IR 10646 2000 UTF-8" in other words UTF-8. + hdrcharset = pax_headers.get("hdrcharset") + if hdrcharset == "BINARY": + encoding = tarfile.encoding + else: + encoding = "utf8" + + # Parse pax header information. A record looks like that: + # "%d %s=%s\n" % (length, keyword, value). length is the size + # of the complete record including the length field itself and + # the newline. keyword and value are both UTF-8 encoded strings. + regex = re.compile(br"(\d+) ([^=]+)=") + pos = 0 + while True: + match = regex.match(buf, pos) + if not match: + break + + length, keyword = match.groups() + length = int(length) + value = buf[match.end(2) + 1:match.start(1) + length - 1] + + # Normally, we could just use "utf8" as the encoding and "strict" + # as the error handler, but we better not take the risk. For + # example, GNU tar <= 1.23 is known to store filenames it cannot + # translate to UTF-8 as raw strings (unfortunately without a + # hdrcharset=BINARY header). + # We first try the strict standard encoding, and if that fails we + # fall back on the user's encoding and error handler. + keyword = self._decode_pax_field(keyword, "utf8", "utf8", + tarfile.errors) + if keyword in PAX_NAME_FIELDS: + value = self._decode_pax_field(value, encoding, tarfile.encoding, + tarfile.errors) + else: + value = self._decode_pax_field(value, "utf8", "utf8", + tarfile.errors) + + pax_headers[keyword] = value + pos += length + + # Fetch the next header. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Process GNU sparse information. + if "GNU.sparse.map" in pax_headers: + # GNU extended sparse format version 0.1. + self._proc_gnusparse_01(next, pax_headers) + + elif "GNU.sparse.size" in pax_headers: + # GNU extended sparse format version 0.0. + self._proc_gnusparse_00(next, pax_headers, buf) + + elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0": + # GNU extended sparse format version 1.0. + self._proc_gnusparse_10(next, pax_headers, tarfile) + + if self.type in (XHDTYPE, SOLARIS_XHDTYPE): + # Patch the TarInfo object with the extended header info. + next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors) + next.offset = self.offset + + if "size" in pax_headers: + # If the extended header replaces the size field, + # we need to recalculate the offset where the next + # header starts. + offset = next.offset_data + if next.isreg() or next.type not in SUPPORTED_TYPES: + offset += next._block(next.size) + tarfile.offset = offset + + return next + + def _proc_gnusparse_00(self, next, pax_headers, buf): + """Process a GNU tar extended sparse header, version 0.0. + """ + offsets = [] + for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf): + offsets.append(int(match.group(1))) + numbytes = [] + for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf): + numbytes.append(int(match.group(1))) + next.sparse = list(zip(offsets, numbytes)) + + def _proc_gnusparse_01(self, next, pax_headers): + """Process a GNU tar extended sparse header, version 0.1. + """ + sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")] + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _proc_gnusparse_10(self, next, pax_headers, tarfile): + """Process a GNU tar extended sparse header, version 1.0. + """ + fields = None + sparse = [] + buf = tarfile.fileobj.read(BLOCKSIZE) + fields, buf = buf.split(b"\n", 1) + fields = int(fields) + while len(sparse) < fields * 2: + if b"\n" not in buf: + buf += tarfile.fileobj.read(BLOCKSIZE) + number, buf = buf.split(b"\n", 1) + sparse.append(int(number)) + next.offset_data = tarfile.fileobj.tell() + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _apply_pax_info(self, pax_headers, encoding, errors): + """Replace fields with supplemental information from a previous + pax extended or global header. + """ + for keyword, value in pax_headers.items(): + if keyword == "GNU.sparse.name": + setattr(self, "path", value) + elif keyword == "GNU.sparse.size": + setattr(self, "size", int(value)) + elif keyword == "GNU.sparse.realsize": + setattr(self, "size", int(value)) + elif keyword in PAX_FIELDS: + if keyword in PAX_NUMBER_FIELDS: + try: + value = PAX_NUMBER_FIELDS[keyword](value) + except ValueError: + value = 0 + if keyword == "path": + value = value.rstrip("/") + setattr(self, keyword, value) + + self.pax_headers = pax_headers.copy() + + def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors): + """Decode a single field from a pax record. + """ + try: + return value.decode(encoding, "strict") + except UnicodeDecodeError: + return value.decode(fallback_encoding, fallback_errors) + + def _block(self, count): + """Round up a byte count by BLOCKSIZE and return it, + e.g. _block(834) => 1024. + """ + blocks, remainder = divmod(count, BLOCKSIZE) + if remainder: + blocks += 1 + return blocks * BLOCKSIZE + + def isreg(self): + return self.type in REGULAR_TYPES + def isfile(self): + return self.isreg() + def isdir(self): + return self.type == DIRTYPE + def issym(self): + return self.type == SYMTYPE + def islnk(self): + return self.type == LNKTYPE + def ischr(self): + return self.type == CHRTYPE + def isblk(self): + return self.type == BLKTYPE + def isfifo(self): + return self.type == FIFOTYPE + def issparse(self): + return self.sparse is not None + def isdev(self): + return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE) +# class TarInfo + +class TarFile(object): + """The TarFile Class provides an interface to tar archives. + """ + + debug = 0 # May be set from 0 (no msgs) to 3 (all msgs) + + dereference = False # If true, add content of linked file to the + # tar file, else the link. + + ignore_zeros = False # If true, skips empty or invalid blocks and + # continues processing. + + errorlevel = 1 # If 0, fatal errors only appear in debug + # messages (if debug >= 0). If > 0, errors + # are passed to the caller as exceptions. + + format = DEFAULT_FORMAT # The format to use when creating an archive. + + encoding = ENCODING # Encoding for 8-bit character strings. + + errors = None # Error handler for unicode conversion. + + tarinfo = TarInfo # The default TarInfo class to use. + + fileobject = ExFileObject # The default ExFileObject class to use. + + def __init__(self, name=None, mode="r", fileobj=None, format=None, + tarinfo=None, dereference=None, ignore_zeros=None, encoding=None, + errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None): + """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to + read from an existing archive, 'a' to append data to an existing + file or 'w' to create a new file overwriting an existing one. `mode' + defaults to 'r'. + If `fileobj' is given, it is used for reading or writing data. If it + can be determined, `mode' is overridden by `fileobj's mode. + `fileobj' is not closed, when TarFile is closed. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + self.mode = mode + self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode] + + if not fileobj: + if self.mode == "a" and not os.path.exists(name): + # Create nonexistent files in append mode. + self.mode = "w" + self._mode = "wb" + fileobj = bltn_open(name, self._mode) + self._extfileobj = False + else: + if name is None and hasattr(fileobj, "name"): + name = fileobj.name + if hasattr(fileobj, "mode"): + self._mode = fileobj.mode + self._extfileobj = True + self.name = os.path.abspath(name) if name else None + self.fileobj = fileobj + + # Init attributes. + if format is not None: + self.format = format + if tarinfo is not None: + self.tarinfo = tarinfo + if dereference is not None: + self.dereference = dereference + if ignore_zeros is not None: + self.ignore_zeros = ignore_zeros + if encoding is not None: + self.encoding = encoding + self.errors = errors + + if pax_headers is not None and self.format == PAX_FORMAT: + self.pax_headers = pax_headers + else: + self.pax_headers = {} + + if debug is not None: + self.debug = debug + if errorlevel is not None: + self.errorlevel = errorlevel + + # Init datastructures. + self.closed = False + self.members = [] # list of members as TarInfo objects + self._loaded = False # flag if all members have been read + self.offset = self.fileobj.tell() + # current position in the archive file + self.inodes = {} # dictionary caching the inodes of + # archive members already added + + try: + if self.mode == "r": + self.firstmember = None + self.firstmember = self.next() + + if self.mode == "a": + # Move to the end of the archive, + # before the first empty block. + while True: + self.fileobj.seek(self.offset) + try: + tarinfo = self.tarinfo.fromtarfile(self) + self.members.append(tarinfo) + except EOFHeaderError: + self.fileobj.seek(self.offset) + break + except HeaderError as e: + raise ReadError(str(e)) + + if self.mode in "aw": + self._loaded = True + + if self.pax_headers: + buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy()) + self.fileobj.write(buf) + self.offset += len(buf) + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + #-------------------------------------------------------------------------- + # Below are the classmethods which act as alternate constructors to the + # TarFile class. The open() method is the only one that is needed for + # public use; it is the "super"-constructor and is able to select an + # adequate "sub"-constructor for a particular compression using the mapping + # from OPEN_METH. + # + # This concept allows one to subclass TarFile without losing the comfort of + # the super-constructor. A sub-constructor is registered and made available + # by adding it to the mapping in OPEN_METH. + + @classmethod + def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs): + """Open a tar archive for reading, writing or appending. Return + an appropriate TarFile class. + + mode: + 'r' or 'r:*' open for reading with transparent compression + 'r:' open for reading exclusively uncompressed + 'r:gz' open for reading with gzip compression + 'r:bz2' open for reading with bzip2 compression + 'a' or 'a:' open for appending, creating the file if necessary + 'w' or 'w:' open for writing without compression + 'w:gz' open for writing with gzip compression + 'w:bz2' open for writing with bzip2 compression + + 'r|*' open a stream of tar blocks with transparent compression + 'r|' open an uncompressed stream of tar blocks for reading + 'r|gz' open a gzip compressed stream of tar blocks + 'r|bz2' open a bzip2 compressed stream of tar blocks + 'w|' open an uncompressed stream for writing + 'w|gz' open a gzip compressed stream for writing + 'w|bz2' open a bzip2 compressed stream for writing + """ + + if not name and not fileobj: + raise ValueError("nothing to open") + + if mode in ("r", "r:*"): + # Find out which *open() is appropriate for opening the file. + for comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + if fileobj is not None: + saved_pos = fileobj.tell() + try: + return func(name, "r", fileobj, **kwargs) + except (ReadError, CompressionError) as e: + if fileobj is not None: + fileobj.seek(saved_pos) + continue + raise ReadError("file could not be opened successfully") + + elif ":" in mode: + filemode, comptype = mode.split(":", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + # Select the *open() function according to + # given compression. + if comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + else: + raise CompressionError("unknown compression type %r" % comptype) + return func(name, filemode, fileobj, **kwargs) + + elif "|" in mode: + filemode, comptype = mode.split("|", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + if filemode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + stream = _Stream(name, filemode, comptype, fileobj, bufsize) + try: + t = cls(name, filemode, stream, **kwargs) + except: + stream.close() + raise + t._extfileobj = False + return t + + elif mode in "aw": + return cls.taropen(name, mode, fileobj, **kwargs) + + raise ValueError("undiscernible mode") + + @classmethod + def taropen(cls, name, mode="r", fileobj=None, **kwargs): + """Open uncompressed tar archive name for reading or writing. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + return cls(name, mode, fileobj, **kwargs) + + @classmethod + def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open gzip compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + try: + import gzip + gzip.GzipFile + except (ImportError, AttributeError): + raise CompressionError("gzip module is not available") + + extfileobj = fileobj is not None + try: + fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) + t = cls.taropen(name, mode, fileobj, **kwargs) + except IOError: + if not extfileobj and fileobj is not None: + fileobj.close() + if fileobj is None: + raise + raise ReadError("not a gzip file") + except: + if not extfileobj and fileobj is not None: + fileobj.close() + raise + t._extfileobj = extfileobj + return t + + @classmethod + def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open bzip2 compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'.") + + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + + if fileobj is not None: + fileobj = _BZ2Proxy(fileobj, mode) + else: + fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel) + + try: + t = cls.taropen(name, mode, fileobj, **kwargs) + except (IOError, EOFError): + fileobj.close() + raise ReadError("not a bzip2 file") + t._extfileobj = False + return t + + # All *open() methods are registered here. + OPEN_METH = { + "tar": "taropen", # uncompressed tar + "gz": "gzopen", # gzip compressed tar + "bz2": "bz2open" # bzip2 compressed tar + } + + #-------------------------------------------------------------------------- + # The public methods which TarFile provides: + + def close(self): + """Close the TarFile. In write-mode, two finishing zero blocks are + appended to the archive. + """ + if self.closed: + return + + if self.mode in "aw": + self.fileobj.write(NUL * (BLOCKSIZE * 2)) + self.offset += (BLOCKSIZE * 2) + # fill up the end with zero-blocks + # (like option -b20 for tar does) + blocks, remainder = divmod(self.offset, RECORDSIZE) + if remainder > 0: + self.fileobj.write(NUL * (RECORDSIZE - remainder)) + + if not self._extfileobj: + self.fileobj.close() + self.closed = True + + def getmember(self, name): + """Return a TarInfo object for member `name'. If `name' can not be + found in the archive, KeyError is raised. If a member occurs more + than once in the archive, its last occurrence is assumed to be the + most up-to-date version. + """ + tarinfo = self._getmember(name) + if tarinfo is None: + raise KeyError("filename %r not found" % name) + return tarinfo + + def getmembers(self): + """Return the members of the archive as a list of TarInfo objects. The + list has the same order as the members in the archive. + """ + self._check() + if not self._loaded: # if we want to obtain a list of + self._load() # all members, we first have to + # scan the whole archive. + return self.members + + def getnames(self): + """Return the members of the archive as a list of their names. It has + the same order as the list returned by getmembers(). + """ + return [tarinfo.name for tarinfo in self.getmembers()] + + def gettarinfo(self, name=None, arcname=None, fileobj=None): + """Create a TarInfo object for either the file `name' or the file + object `fileobj' (using os.fstat on its file descriptor). You can + modify some of the TarInfo's attributes before you add it using + addfile(). If given, `arcname' specifies an alternative name for the + file in the archive. + """ + self._check("aw") + + # When fileobj is given, replace name by + # fileobj's real name. + if fileobj is not None: + name = fileobj.name + + # Building the name of the member in the archive. + # Backward slashes are converted to forward slashes, + # Absolute paths are turned to relative paths. + if arcname is None: + arcname = name + drv, arcname = os.path.splitdrive(arcname) + arcname = arcname.replace(os.sep, "/") + arcname = arcname.lstrip("/") + + # Now, fill the TarInfo object with + # information specific for the file. + tarinfo = self.tarinfo() + tarinfo.tarfile = self + + # Use os.stat or os.lstat, depending on platform + # and if symlinks shall be resolved. + if fileobj is None: + if hasattr(os, "lstat") and not self.dereference: + statres = os.lstat(name) + else: + statres = os.stat(name) + else: + statres = os.fstat(fileobj.fileno()) + linkname = "" + + stmd = statres.st_mode + if stat.S_ISREG(stmd): + inode = (statres.st_ino, statres.st_dev) + if not self.dereference and statres.st_nlink > 1 and \ + inode in self.inodes and arcname != self.inodes[inode]: + # Is it a hardlink to an already + # archived file? + type = LNKTYPE + linkname = self.inodes[inode] + else: + # The inode is added only if its valid. + # For win32 it is always 0. + type = REGTYPE + if inode[0]: + self.inodes[inode] = arcname + elif stat.S_ISDIR(stmd): + type = DIRTYPE + elif stat.S_ISFIFO(stmd): + type = FIFOTYPE + elif stat.S_ISLNK(stmd): + type = SYMTYPE + linkname = os.readlink(name) + elif stat.S_ISCHR(stmd): + type = CHRTYPE + elif stat.S_ISBLK(stmd): + type = BLKTYPE + else: + return None + + # Fill the TarInfo object with all + # information we can get. + tarinfo.name = arcname + tarinfo.mode = stmd + tarinfo.uid = statres.st_uid + tarinfo.gid = statres.st_gid + if type == REGTYPE: + tarinfo.size = statres.st_size + else: + tarinfo.size = 0 + tarinfo.mtime = statres.st_mtime + tarinfo.type = type + tarinfo.linkname = linkname + if pwd: + try: + tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0] + except KeyError: + pass + if grp: + try: + tarinfo.gname = grp.getgrgid(tarinfo.gid)[0] + except KeyError: + pass + + if type in (CHRTYPE, BLKTYPE): + if hasattr(os, "major") and hasattr(os, "minor"): + tarinfo.devmajor = os.major(statres.st_rdev) + tarinfo.devminor = os.minor(statres.st_rdev) + return tarinfo + + def list(self, verbose=True): + """Print a table of contents to sys.stdout. If `verbose' is False, only + the names of the members are printed. If it is True, an `ls -l'-like + output is produced. + """ + self._check() + + for tarinfo in self: + if verbose: + print(filemode(tarinfo.mode), end=' ') + print("%s/%s" % (tarinfo.uname or tarinfo.uid, + tarinfo.gname or tarinfo.gid), end=' ') + if tarinfo.ischr() or tarinfo.isblk(): + print("%10s" % ("%d,%d" \ + % (tarinfo.devmajor, tarinfo.devminor)), end=' ') + else: + print("%10d" % tarinfo.size, end=' ') + print("%d-%02d-%02d %02d:%02d:%02d" \ + % time.localtime(tarinfo.mtime)[:6], end=' ') + + print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ') + + if verbose: + if tarinfo.issym(): + print("->", tarinfo.linkname, end=' ') + if tarinfo.islnk(): + print("link to", tarinfo.linkname, end=' ') + print() + + def add(self, name, arcname=None, recursive=True, exclude=None, filter=None): + """Add the file `name' to the archive. `name' may be any type of file + (directory, fifo, symbolic link, etc.). If given, `arcname' + specifies an alternative name for the file in the archive. + Directories are added recursively by default. This can be avoided by + setting `recursive' to False. `exclude' is a function that should + return True for each filename to be excluded. `filter' is a function + that expects a TarInfo object argument and returns the changed + TarInfo object, if it returns None the TarInfo object will be + excluded from the archive. + """ + self._check("aw") + + if arcname is None: + arcname = name + + # Exclude pathnames. + if exclude is not None: + import warnings + warnings.warn("use the filter argument instead", + DeprecationWarning, 2) + if exclude(name): + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Skip if somebody tries to archive the archive... + if self.name is not None and os.path.abspath(name) == self.name: + self._dbg(2, "tarfile: Skipped %r" % name) + return + + self._dbg(1, name) + + # Create a TarInfo object from the file. + tarinfo = self.gettarinfo(name, arcname) + + if tarinfo is None: + self._dbg(1, "tarfile: Unsupported type %r" % name) + return + + # Change or exclude the TarInfo object. + if filter is not None: + tarinfo = filter(tarinfo) + if tarinfo is None: + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Append the tar header and data to the archive. + if tarinfo.isreg(): + f = bltn_open(name, "rb") + self.addfile(tarinfo, f) + f.close() + + elif tarinfo.isdir(): + self.addfile(tarinfo) + if recursive: + for f in os.listdir(name): + self.add(os.path.join(name, f), os.path.join(arcname, f), + recursive, exclude, filter=filter) + + else: + self.addfile(tarinfo) + + def addfile(self, tarinfo, fileobj=None): + """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is + given, tarinfo.size bytes are read from it and added to the archive. + You can create TarInfo objects using gettarinfo(). + On Windows platforms, `fileobj' should always be opened with mode + 'rb' to avoid irritation about the file size. + """ + self._check("aw") + + tarinfo = copy.copy(tarinfo) + + buf = tarinfo.tobuf(self.format, self.encoding, self.errors) + self.fileobj.write(buf) + self.offset += len(buf) + + # If there's data to follow, append it. + if fileobj is not None: + copyfileobj(fileobj, self.fileobj, tarinfo.size) + blocks, remainder = divmod(tarinfo.size, BLOCKSIZE) + if remainder > 0: + self.fileobj.write(NUL * (BLOCKSIZE - remainder)) + blocks += 1 + self.offset += blocks * BLOCKSIZE + + self.members.append(tarinfo) + + def extractall(self, path=".", members=None): + """Extract all members from the archive to the current working + directory and set owner, modification time and permissions on + directories afterwards. `path' specifies a different directory + to extract to. `members' is optional and must be a subset of the + list returned by getmembers(). + """ + directories = [] + + if members is None: + members = self + + for tarinfo in members: + if tarinfo.isdir(): + # Extract directories with a safe mode. + directories.append(tarinfo) + tarinfo = copy.copy(tarinfo) + tarinfo.mode = 0o700 + # Do not set_attrs directories, as we will do that further down + self.extract(tarinfo, path, set_attrs=not tarinfo.isdir()) + + # Reverse sort directories. + directories.sort(key=lambda a: a.name) + directories.reverse() + + # Set correct owner, mtime and filemode on directories. + for tarinfo in directories: + dirpath = os.path.join(path, tarinfo.name) + try: + self.chown(tarinfo, dirpath) + self.utime(tarinfo, dirpath) + self.chmod(tarinfo, dirpath) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extract(self, member, path="", set_attrs=True): + """Extract a member from the archive to the current working directory, + using its full name. Its file information is extracted as accurately + as possible. `member' may be a filename or a TarInfo object. You can + specify a different directory using `path'. File attributes (owner, + mtime, mode) are set unless `set_attrs' is False. + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + # Prepare the link target for makelink(). + if tarinfo.islnk(): + tarinfo._link_target = os.path.join(path, tarinfo.linkname) + + try: + self._extract_member(tarinfo, os.path.join(path, tarinfo.name), + set_attrs=set_attrs) + except EnvironmentError as e: + if self.errorlevel > 0: + raise + else: + if e.filename is None: + self._dbg(1, "tarfile: %s" % e.strerror) + else: + self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename)) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extractfile(self, member): + """Extract a member from the archive as a file object. `member' may be + a filename or a TarInfo object. If `member' is a regular file, a + file-like object is returned. If `member' is a link, a file-like + object is constructed from the link's target. If `member' is none of + the above, None is returned. + The file-like object is read-only and provides the following + methods: read(), readline(), readlines(), seek() and tell() + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + if tarinfo.isreg(): + return self.fileobject(self, tarinfo) + + elif tarinfo.type not in SUPPORTED_TYPES: + # If a member's type is unknown, it is treated as a + # regular file. + return self.fileobject(self, tarinfo) + + elif tarinfo.islnk() or tarinfo.issym(): + if isinstance(self.fileobj, _Stream): + # A small but ugly workaround for the case that someone tries + # to extract a (sym)link as a file-object from a non-seekable + # stream of tar blocks. + raise StreamError("cannot extract (sym)link as file object") + else: + # A (sym)link's file object is its target's file object. + return self.extractfile(self._find_link_target(tarinfo)) + else: + # If there's no data associated with the member (directory, chrdev, + # blkdev, etc.), return None instead of a file object. + return None + + def _extract_member(self, tarinfo, targetpath, set_attrs=True): + """Extract the TarInfo object tarinfo to a physical + file called targetpath. + """ + # Fetch the TarInfo object for the given name + # and build the destination pathname, replacing + # forward slashes to platform specific separators. + targetpath = targetpath.rstrip("/") + targetpath = targetpath.replace("/", os.sep) + + # Create all upper directories. + upperdirs = os.path.dirname(targetpath) + if upperdirs and not os.path.exists(upperdirs): + # Create directories that are not part of the archive with + # default permissions. + os.makedirs(upperdirs) + + if tarinfo.islnk() or tarinfo.issym(): + self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname)) + else: + self._dbg(1, tarinfo.name) + + if tarinfo.isreg(): + self.makefile(tarinfo, targetpath) + elif tarinfo.isdir(): + self.makedir(tarinfo, targetpath) + elif tarinfo.isfifo(): + self.makefifo(tarinfo, targetpath) + elif tarinfo.ischr() or tarinfo.isblk(): + self.makedev(tarinfo, targetpath) + elif tarinfo.islnk() or tarinfo.issym(): + self.makelink(tarinfo, targetpath) + elif tarinfo.type not in SUPPORTED_TYPES: + self.makeunknown(tarinfo, targetpath) + else: + self.makefile(tarinfo, targetpath) + + if set_attrs: + self.chown(tarinfo, targetpath) + if not tarinfo.issym(): + self.chmod(tarinfo, targetpath) + self.utime(tarinfo, targetpath) + + #-------------------------------------------------------------------------- + # Below are the different file methods. They are called via + # _extract_member() when extract() is called. They can be replaced in a + # subclass to implement other functionality. + + def makedir(self, tarinfo, targetpath): + """Make a directory called targetpath. + """ + try: + # Use a safe mode for the directory, the real mode is set + # later in _extract_member(). + os.mkdir(targetpath, 0o700) + except EnvironmentError as e: + if e.errno != errno.EEXIST: + raise + + def makefile(self, tarinfo, targetpath): + """Make a file called targetpath. + """ + source = self.fileobj + source.seek(tarinfo.offset_data) + target = bltn_open(targetpath, "wb") + if tarinfo.sparse is not None: + for offset, size in tarinfo.sparse: + target.seek(offset) + copyfileobj(source, target, size) + else: + copyfileobj(source, target, tarinfo.size) + target.seek(tarinfo.size) + target.truncate() + target.close() + + def makeunknown(self, tarinfo, targetpath): + """Make a file from a TarInfo object with an unknown type + at targetpath. + """ + self.makefile(tarinfo, targetpath) + self._dbg(1, "tarfile: Unknown file type %r, " \ + "extracted as regular file." % tarinfo.type) + + def makefifo(self, tarinfo, targetpath): + """Make a fifo called targetpath. + """ + if hasattr(os, "mkfifo"): + os.mkfifo(targetpath) + else: + raise ExtractError("fifo not supported by system") + + def makedev(self, tarinfo, targetpath): + """Make a character or block device called targetpath. + """ + if not hasattr(os, "mknod") or not hasattr(os, "makedev"): + raise ExtractError("special devices not supported by system") + + mode = tarinfo.mode + if tarinfo.isblk(): + mode |= stat.S_IFBLK + else: + mode |= stat.S_IFCHR + + os.mknod(targetpath, mode, + os.makedev(tarinfo.devmajor, tarinfo.devminor)) + + def makelink(self, tarinfo, targetpath): + """Make a (symbolic) link called targetpath. If it cannot be created + (platform limitation), we try to make a copy of the referenced file + instead of a link. + """ + try: + # For systems that support symbolic and hard links. + if tarinfo.issym(): + os.symlink(tarinfo.linkname, targetpath) + else: + # See extract(). + if os.path.exists(tarinfo._link_target): + os.link(tarinfo._link_target, targetpath) + else: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except symlink_exception: + if tarinfo.issym(): + linkpath = os.path.join(os.path.dirname(tarinfo.name), + tarinfo.linkname) + else: + linkpath = tarinfo.linkname + else: + try: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except KeyError: + raise ExtractError("unable to resolve link inside archive") + + def chown(self, tarinfo, targetpath): + """Set owner of targetpath according to tarinfo. + """ + if pwd and hasattr(os, "geteuid") and os.geteuid() == 0: + # We have to be root to do so. + try: + g = grp.getgrnam(tarinfo.gname)[2] + except KeyError: + g = tarinfo.gid + try: + u = pwd.getpwnam(tarinfo.uname)[2] + except KeyError: + u = tarinfo.uid + try: + if tarinfo.issym() and hasattr(os, "lchown"): + os.lchown(targetpath, u, g) + else: + if sys.platform != "os2emx": + os.chown(targetpath, u, g) + except EnvironmentError as e: + raise ExtractError("could not change owner") + + def chmod(self, tarinfo, targetpath): + """Set file permissions of targetpath according to tarinfo. + """ + if hasattr(os, 'chmod'): + try: + os.chmod(targetpath, tarinfo.mode) + except EnvironmentError as e: + raise ExtractError("could not change mode") + + def utime(self, tarinfo, targetpath): + """Set modification time of targetpath according to tarinfo. + """ + if not hasattr(os, 'utime'): + return + try: + os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime)) + except EnvironmentError as e: + raise ExtractError("could not change modification time") + + #-------------------------------------------------------------------------- + def next(self): + """Return the next member of the archive as a TarInfo object, when + TarFile is opened for reading. Return None if there is no more + available. + """ + self._check("ra") + if self.firstmember is not None: + m = self.firstmember + self.firstmember = None + return m + + # Read the next block. + self.fileobj.seek(self.offset) + tarinfo = None + while True: + try: + tarinfo = self.tarinfo.fromtarfile(self) + except EOFHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + except InvalidHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + elif self.offset == 0: + raise ReadError(str(e)) + except EmptyHeaderError: + if self.offset == 0: + raise ReadError("empty file") + except TruncatedHeaderError as e: + if self.offset == 0: + raise ReadError(str(e)) + except SubsequentHeaderError as e: + raise ReadError(str(e)) + break + + if tarinfo is not None: + self.members.append(tarinfo) + else: + self._loaded = True + + return tarinfo + + #-------------------------------------------------------------------------- + # Little helper methods: + + def _getmember(self, name, tarinfo=None, normalize=False): + """Find an archive member by name from bottom to top. + If tarinfo is given, it is used as the starting point. + """ + # Ensure that all members have been loaded. + members = self.getmembers() + + # Limit the member search list up to tarinfo. + if tarinfo is not None: + members = members[:members.index(tarinfo)] + + if normalize: + name = os.path.normpath(name) + + for member in reversed(members): + if normalize: + member_name = os.path.normpath(member.name) + else: + member_name = member.name + + if name == member_name: + return member + + def _load(self): + """Read through the entire archive file and look for readable + members. + """ + while True: + tarinfo = self.next() + if tarinfo is None: + break + self._loaded = True + + def _check(self, mode=None): + """Check if TarFile is still open, and if the operation's mode + corresponds to TarFile's mode. + """ + if self.closed: + raise IOError("%s is closed" % self.__class__.__name__) + if mode is not None and self.mode not in mode: + raise IOError("bad operation for mode %r" % self.mode) + + def _find_link_target(self, tarinfo): + """Find the target member of a symlink or hardlink member in the + archive. + """ + if tarinfo.issym(): + # Always search the entire archive. + linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname + limit = None + else: + # Search the archive before the link, because a hard link is + # just a reference to an already archived file. + linkname = tarinfo.linkname + limit = tarinfo + + member = self._getmember(linkname, tarinfo=limit, normalize=True) + if member is None: + raise KeyError("linkname %r not found" % linkname) + return member + + def __iter__(self): + """Provide an iterator object. + """ + if self._loaded: + return iter(self.members) + else: + return TarIter(self) + + def _dbg(self, level, msg): + """Write debugging output to sys.stderr. + """ + if level <= self.debug: + print(msg, file=sys.stderr) + + def __enter__(self): + self._check() + return self + + def __exit__(self, type, value, traceback): + if type is None: + self.close() + else: + # An exception occurred. We must not call close() because + # it would try to write end-of-archive blocks and padding. + if not self._extfileobj: + self.fileobj.close() + self.closed = True +# class TarFile + +class TarIter(object): + """Iterator Class. + + for tarinfo in TarFile(...): + suite... + """ + + def __init__(self, tarfile): + """Construct a TarIter object. + """ + self.tarfile = tarfile + self.index = 0 + def __iter__(self): + """Return iterator object. + """ + return self + + def __next__(self): + """Return the next item using TarFile's next() method. + When all members have been read, set TarFile as _loaded. + """ + # Fix for SF #1100429: Under rare circumstances it can + # happen that getmembers() is called during iteration, + # which will cause TarIter to stop prematurely. + if not self.tarfile._loaded: + tarinfo = self.tarfile.next() + if not tarinfo: + self.tarfile._loaded = True + raise StopIteration + else: + try: + tarinfo = self.tarfile.members[self.index] + except IndexError: + raise StopIteration + self.index += 1 + return tarinfo + + next = __next__ # for Python 2.x + +#-------------------- +# exported functions +#-------------------- +def is_tarfile(name): + """Return True if name points to a tar archive that we + are able to handle, else return False. + """ + try: + t = open(name) + t.close() + return True + except TarError: + return False + +bltn_open = open +open = TarFile.open diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/compat.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/compat.py new file mode 100644 index 0000000..ff328c8 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/compat.py @@ -0,0 +1,1120 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import absolute_import + +import os +import re +import sys + +try: + import ssl +except ImportError: # pragma: no cover + ssl = None + +if sys.version_info[0] < 3: # pragma: no cover + from StringIO import StringIO + string_types = basestring, + text_type = unicode + from types import FileType as file_type + import __builtin__ as builtins + import ConfigParser as configparser + from ._backport import shutil + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit + from urllib import (urlretrieve, quote as _quote, unquote, url2pathname, + pathname2url, ContentTooShortError, splittype) + + def quote(s): + if isinstance(s, unicode): + s = s.encode('utf-8') + return _quote(s) + + import urllib2 + from urllib2 import (Request, urlopen, URLError, HTTPError, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPHandler, HTTPRedirectHandler, + build_opener) + if ssl: + from urllib2 import HTTPSHandler + import httplib + import xmlrpclib + import Queue as queue + from HTMLParser import HTMLParser + import htmlentitydefs + raw_input = raw_input + from itertools import ifilter as filter + from itertools import ifilterfalse as filterfalse + + _userprog = None + def splituser(host): + """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" + global _userprog + if _userprog is None: + import re + _userprog = re.compile('^(.*)@(.*)$') + + match = _userprog.match(host) + if match: return match.group(1, 2) + return None, host + +else: # pragma: no cover + from io import StringIO + string_types = str, + text_type = str + from io import TextIOWrapper as file_type + import builtins + import configparser + import shutil + from urllib.parse import (urlparse, urlunparse, urljoin, splituser, quote, + unquote, urlsplit, urlunsplit, splittype) + from urllib.request import (urlopen, urlretrieve, Request, url2pathname, + pathname2url, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPHandler, HTTPRedirectHandler, + build_opener) + if ssl: + from urllib.request import HTTPSHandler + from urllib.error import HTTPError, URLError, ContentTooShortError + import http.client as httplib + import urllib.request as urllib2 + import xmlrpc.client as xmlrpclib + import queue + from html.parser import HTMLParser + import html.entities as htmlentitydefs + raw_input = input + from itertools import filterfalse + filter = filter + +try: + from ssl import match_hostname, CertificateError +except ImportError: # pragma: no cover + class CertificateError(ValueError): + pass + + + def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + parts = dn.split('.') + leftmost, remainder = parts[0], parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + + def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") + + +try: + from types import SimpleNamespace as Container +except ImportError: # pragma: no cover + class Container(object): + """ + A generic container for when multiple values need to be returned + """ + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + + +try: + from shutil import which +except ImportError: # pragma: no cover + # Implementation from Python 3.3 + def which(cmd, mode=os.F_OK | os.X_OK, path=None): + """Given a command, mode, and a PATH string, return the path which + conforms to the given mode on the PATH, or None if there is no such + file. + + `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result + of os.environ.get("PATH"), or can be overridden with a custom search + path. + + """ + # Check that a given file can be accessed with the correct mode. + # Additionally check that `file` is not a directory, as on Windows + # directories pass the os.access check. + def _access_check(fn, mode): + return (os.path.exists(fn) and os.access(fn, mode) + and not os.path.isdir(fn)) + + # If we're given a path with a directory part, look it up directly rather + # than referring to PATH directories. This includes checking relative to the + # current directory, e.g. ./script + if os.path.dirname(cmd): + if _access_check(cmd, mode): + return cmd + return None + + if path is None: + path = os.environ.get("PATH", os.defpath) + if not path: + return None + path = path.split(os.pathsep) + + if sys.platform == "win32": + # The current directory takes precedence on Windows. + if not os.curdir in path: + path.insert(0, os.curdir) + + # PATHEXT is necessary to check on Windows. + pathext = os.environ.get("PATHEXT", "").split(os.pathsep) + # See if the given file matches any of the expected path extensions. + # This will allow us to short circuit when given "python.exe". + # If it does match, only test that one, otherwise we have to try + # others. + if any(cmd.lower().endswith(ext.lower()) for ext in pathext): + files = [cmd] + else: + files = [cmd + ext for ext in pathext] + else: + # On other platforms you don't have things like PATHEXT to tell you + # what file suffixes are executable, so just pass on cmd as-is. + files = [cmd] + + seen = set() + for dir in path: + normdir = os.path.normcase(dir) + if not normdir in seen: + seen.add(normdir) + for thefile in files: + name = os.path.join(dir, thefile) + if _access_check(name, mode): + return name + return None + + +# ZipFile is a context manager in 2.7, but not in 2.6 + +from zipfile import ZipFile as BaseZipFile + +if hasattr(BaseZipFile, '__enter__'): # pragma: no cover + ZipFile = BaseZipFile +else: # pragma: no cover + from zipfile import ZipExtFile as BaseZipExtFile + + class ZipExtFile(BaseZipExtFile): + def __init__(self, base): + self.__dict__.update(base.__dict__) + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + class ZipFile(BaseZipFile): + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + def open(self, *args, **kwargs): + base = BaseZipFile.open(self, *args, **kwargs) + return ZipExtFile(base) + +try: + from platform import python_implementation +except ImportError: # pragma: no cover + def python_implementation(): + """Return a string identifying the Python implementation.""" + if 'PyPy' in sys.version: + return 'PyPy' + if os.name == 'java': + return 'Jython' + if sys.version.startswith('IronPython'): + return 'IronPython' + return 'CPython' + +try: + import sysconfig +except ImportError: # pragma: no cover + from ._backport import sysconfig + +try: + callable = callable +except NameError: # pragma: no cover + from collections import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode + fsdecode = os.fsdecode +except AttributeError: # pragma: no cover + # Issue #99: on some systems (e.g. containerised), + # sys.getfilesystemencoding() returns None, and we need a real value, + # so fall back to utf-8. From the CPython 2.7 docs relating to Unix and + # sys.getfilesystemencoding(): the return value is "the user’s preference + # according to the result of nl_langinfo(CODESET), or None if the + # nl_langinfo(CODESET) failed." + _fsencoding = sys.getfilesystemencoding() or 'utf-8' + if _fsencoding == 'mbcs': + _fserrors = 'strict' + else: + _fserrors = 'surrogateescape' + + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, text_type): + return filename.encode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + + def fsdecode(filename): + if isinstance(filename, text_type): + return filename + elif isinstance(filename, bytes): + return filename.decode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + +try: + from tokenize import detect_encoding +except ImportError: # pragma: no cover + from codecs import BOM_UTF8, lookup + import re + + cookie_re = re.compile(r"coding[:=]\s*([-\w.]+)") + + def _get_normal_name(orig_enc): + """Imitates get_normal_name in tokenizer.c.""" + # Only care about the first 12 characters. + enc = orig_enc[:12].lower().replace("_", "-") + if enc == "utf-8" or enc.startswith("utf-8-"): + return "utf-8" + if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ + enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): + return "iso-8859-1" + return orig_enc + + def detect_encoding(readline): + """ + The detect_encoding() function is used to detect the encoding that should + be used to decode a Python source file. It requires one argument, readline, + in the same way as the tokenize() generator. + + It will call readline a maximum of twice, and return the encoding used + (as a string) and a list of any lines (left as bytes) it has read in. + + It detects the encoding from the presence of a utf-8 bom or an encoding + cookie as specified in pep-0263. If both a bom and a cookie are present, + but disagree, a SyntaxError will be raised. If the encoding cookie is an + invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, + 'utf-8-sig' is returned. + + If no encoding is specified, then the default of 'utf-8' will be returned. + """ + try: + filename = readline.__self__.name + except AttributeError: + filename = None + bom_found = False + encoding = None + default = 'utf-8' + def read_or_stop(): + try: + return readline() + except StopIteration: + return b'' + + def find_cookie(line): + try: + # Decode as UTF-8. Either the line is an encoding declaration, + # in which case it should be pure ASCII, or it must be UTF-8 + # per default encoding. + line_string = line.decode('utf-8') + except UnicodeDecodeError: + msg = "invalid or missing encoding declaration" + if filename is not None: + msg = '{} for {!r}'.format(msg, filename) + raise SyntaxError(msg) + + matches = cookie_re.findall(line_string) + if not matches: + return None + encoding = _get_normal_name(matches[0]) + try: + codec = lookup(encoding) + except LookupError: + # This behaviour mimics the Python interpreter + if filename is None: + msg = "unknown encoding: " + encoding + else: + msg = "unknown encoding for {!r}: {}".format(filename, + encoding) + raise SyntaxError(msg) + + if bom_found: + if codec.name != 'utf-8': + # This behaviour mimics the Python interpreter + if filename is None: + msg = 'encoding problem: utf-8' + else: + msg = 'encoding problem for {!r}: utf-8'.format(filename) + raise SyntaxError(msg) + encoding += '-sig' + return encoding + + first = read_or_stop() + if first.startswith(BOM_UTF8): + bom_found = True + first = first[3:] + default = 'utf-8-sig' + if not first: + return default, [] + + encoding = find_cookie(first) + if encoding: + return encoding, [first] + + second = read_or_stop() + if not second: + return default, [first] + + encoding = find_cookie(second) + if encoding: + return encoding, [first, second] + + return default, [first, second] + +# For converting & <-> & etc. +try: + from html import escape +except ImportError: + from cgi import escape +if sys.version_info[:2] < (3, 4): + unescape = HTMLParser().unescape +else: + from html import unescape + +try: + from collections import ChainMap +except ImportError: # pragma: no cover + from collections import MutableMapping + + try: + from reprlib import recursive_repr as _recursive_repr + except ImportError: + def _recursive_repr(fillvalue='...'): + ''' + Decorator to make a repr function return fillvalue for a recursive + call + ''' + + def decorating_function(user_function): + repr_running = set() + + def wrapper(self): + key = id(self), get_ident() + if key in repr_running: + return fillvalue + repr_running.add(key) + try: + result = user_function(self) + finally: + repr_running.discard(key) + return result + + # Can't use functools.wraps() here because of bootstrap issues + wrapper.__module__ = getattr(user_function, '__module__') + wrapper.__doc__ = getattr(user_function, '__doc__') + wrapper.__name__ = getattr(user_function, '__name__') + wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) + return wrapper + + return decorating_function + + class ChainMap(MutableMapping): + ''' A ChainMap groups multiple dicts (or other mappings) together + to create a single, updateable view. + + The underlying mappings are stored in a list. That list is public and can + accessed or updated using the *maps* attribute. There is no other state. + + Lookups search the underlying mappings successively until a key is found. + In contrast, writes, updates, and deletions only operate on the first + mapping. + + ''' + + def __init__(self, *maps): + '''Initialize a ChainMap by setting *maps* to the given mappings. + If no mappings are provided, a single empty dictionary is used. + + ''' + self.maps = list(maps) or [{}] # always at least one map + + def __missing__(self, key): + raise KeyError(key) + + def __getitem__(self, key): + for mapping in self.maps: + try: + return mapping[key] # can't use 'key in mapping' with defaultdict + except KeyError: + pass + return self.__missing__(key) # support subclasses that define __missing__ + + def get(self, key, default=None): + return self[key] if key in self else default + + def __len__(self): + return len(set().union(*self.maps)) # reuses stored hash values if possible + + def __iter__(self): + return iter(set().union(*self.maps)) + + def __contains__(self, key): + return any(key in m for m in self.maps) + + def __bool__(self): + return any(self.maps) + + @_recursive_repr() + def __repr__(self): + return '{0.__class__.__name__}({1})'.format( + self, ', '.join(map(repr, self.maps))) + + @classmethod + def fromkeys(cls, iterable, *args): + 'Create a ChainMap with a single dict created from the iterable.' + return cls(dict.fromkeys(iterable, *args)) + + def copy(self): + 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' + return self.__class__(self.maps[0].copy(), *self.maps[1:]) + + __copy__ = copy + + def new_child(self): # like Django's Context.push() + 'New ChainMap with a new dict followed by all previous maps.' + return self.__class__({}, *self.maps) + + @property + def parents(self): # like Django's Context.pop() + 'New ChainMap from maps[1:].' + return self.__class__(*self.maps[1:]) + + def __setitem__(self, key, value): + self.maps[0][key] = value + + def __delitem__(self, key): + try: + del self.maps[0][key] + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def popitem(self): + 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' + try: + return self.maps[0].popitem() + except KeyError: + raise KeyError('No keys found in the first mapping.') + + def pop(self, key, *args): + 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' + try: + return self.maps[0].pop(key, *args) + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def clear(self): + 'Clear maps[0], leaving maps[1:] intact.' + self.maps[0].clear() + +try: + from importlib.util import cache_from_source # Python >= 3.4 +except ImportError: # pragma: no cover + try: + from imp import cache_from_source + except ImportError: # pragma: no cover + def cache_from_source(path, debug_override=None): + assert path.endswith('.py') + if debug_override is None: + debug_override = __debug__ + if debug_override: + suffix = 'c' + else: + suffix = 'o' + return path + suffix + +try: + from collections import OrderedDict +except ImportError: # pragma: no cover +## {{{ http://code.activestate.com/recipes/576693/ (r9) +# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. +# Passes Python2.7's test suite and incorporates all the latest updates. + try: + from thread import get_ident as _get_ident + except ImportError: + from dummy_thread import get_ident as _get_ident + + try: + from _abcoll import KeysView, ValuesView, ItemsView + except ImportError: + pass + + + class OrderedDict(dict): + 'Dictionary that remembers insertion order' + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as for regular dictionaries. + + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # Each link is stored as a list of length three: [PREV, NEXT, KEY]. + + def __init__(self, *args, **kwds): + '''Initialize an ordered dictionary. Signature is the same as for + regular dictionaries, but keyword arguments are not recommended + because their insertion order is arbitrary. + + ''' + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__root = root = [] # sentinel node + root[:] = [root, root, None] + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, dict_setitem=dict.__setitem__): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link which goes at the end of the linked + # list, and the inherited dictionary is updated with the new key/value pair. + if key not in self: + root = self.__root + last = root[0] + last[1] = root[0] = self.__map[key] = [last, root, key] + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which is + # then removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link_prev, link_next, key = self.__map.pop(key) + link_prev[1] = link_next + link_next[0] = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + root = self.__root + curr = root[1] + while curr is not root: + yield curr[2] + curr = curr[1] + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + root = self.__root + curr = root[0] + while curr is not root: + yield curr[2] + curr = curr[0] + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + try: + for node in self.__map.itervalues(): + del node[:] + root = self.__root + root[:] = [root, root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) + + def popitem(self, last=True): + '''od.popitem() -> (k, v), return and remove a (key, value) pair. + Pairs are returned in LIFO order if last is true or FIFO order if false. + + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root[0] + link_prev = link[0] + link_prev[1] = root + root[0] = link_prev + else: + link = root[1] + link_next = link[1] + root[1] = link_next + link_next[0] = root + key = link[2] + del self.__map[key] + value = dict.pop(self, key) + return key, value + + # -- the following methods do not depend on the internal structure -- + + def keys(self): + 'od.keys() -> list of keys in od' + return list(self) + + def values(self): + 'od.values() -> list of values in od' + return [self[key] for key in self] + + def items(self): + 'od.items() -> list of (key, value) pairs in od' + return [(key, self[key]) for key in self] + + def iterkeys(self): + 'od.iterkeys() -> an iterator over the keys in od' + return iter(self) + + def itervalues(self): + 'od.itervalues -> an iterator over the values in od' + for k in self: + yield self[k] + + def iteritems(self): + 'od.iteritems -> an iterator over the (key, value) items in od' + for k in self: + yield (k, self[k]) + + def update(*args, **kwds): + '''od.update(E, **F) -> None. Update od from dict/iterable E and F. + + If E is a dict instance, does: for k in E: od[k] = E[k] + If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] + Or if E is an iterable of items, does: for k, v in E: od[k] = v + In either case, this is followed by: for k, v in F.items(): od[k] = v + + ''' + if len(args) > 2: + raise TypeError('update() takes at most 2 positional ' + 'arguments (%d given)' % (len(args),)) + elif not args: + raise TypeError('update() takes at least 1 argument (0 given)') + self = args[0] + # Make progressively weaker assumptions about "other" + other = () + if len(args) == 2: + other = args[1] + if isinstance(other, dict): + for key in other: + self[key] = other[key] + elif hasattr(other, 'keys'): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + __update = update # let subclasses override update without breaking __init__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + + def __repr__(self, _repr_running=None): + 'od.__repr__() <==> repr(od)' + if not _repr_running: _repr_running = {} + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self)==len(other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) + +try: + from logging.config import BaseConfigurator, valid_ident +except ImportError: # pragma: no cover + IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) + + + def valid_ident(s): + m = IDENTIFIER.match(s) + if not m: + raise ValueError('Not a valid Python identifier: %r' % s) + return True + + + # The ConvertingXXX classes are wrappers around standard Python containers, + # and they serve to convert any suitable values in the container. The + # conversion converts base dicts, lists and tuples to their wrapped + # equivalents, whereas strings which match a conversion format are converted + # appropriately. + # + # Each wrapper should have a configurator attribute holding the actual + # configurator to use for conversion. + + class ConvertingDict(dict): + """A converting dictionary wrapper.""" + + def __getitem__(self, key): + value = dict.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def get(self, key, default=None): + value = dict.get(self, key, default) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, key, default=None): + value = dict.pop(self, key, default) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class ConvertingList(list): + """A converting list wrapper.""" + def __getitem__(self, key): + value = list.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, idx=-1): + value = list.pop(self, idx) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + return result + + class ConvertingTuple(tuple): + """A converting tuple wrapper.""" + def __getitem__(self, key): + value = tuple.__getitem__(self, key) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class BaseConfigurator(object): + """ + The configurator base class which defines some useful defaults. + """ + + CONVERT_PATTERN = re.compile(r'^(?P<prefix>[a-z]+)://(?P<suffix>.*)$') + + WORD_PATTERN = re.compile(r'^\s*(\w+)\s*') + DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*') + INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*') + DIGIT_PATTERN = re.compile(r'^\d+$') + + value_converters = { + 'ext' : 'ext_convert', + 'cfg' : 'cfg_convert', + } + + # We might want to use a different one, e.g. importlib + importer = staticmethod(__import__) + + def __init__(self, config): + self.config = ConvertingDict(config) + self.config.configurator = self + + def resolve(self, s): + """ + Resolve strings to objects using standard import and attribute + syntax. + """ + name = s.split('.') + used = name.pop(0) + try: + found = self.importer(used) + for frag in name: + used += '.' + frag + try: + found = getattr(found, frag) + except AttributeError: + self.importer(used) + found = getattr(found, frag) + return found + except ImportError: + e, tb = sys.exc_info()[1:] + v = ValueError('Cannot resolve %r: %s' % (s, e)) + v.__cause__, v.__traceback__ = e, tb + raise v + + def ext_convert(self, value): + """Default converter for the ext:// protocol.""" + return self.resolve(value) + + def cfg_convert(self, value): + """Default converter for the cfg:// protocol.""" + rest = value + m = self.WORD_PATTERN.match(rest) + if m is None: + raise ValueError("Unable to convert %r" % value) + else: + rest = rest[m.end():] + d = self.config[m.groups()[0]] + #print d, rest + while rest: + m = self.DOT_PATTERN.match(rest) + if m: + d = d[m.groups()[0]] + else: + m = self.INDEX_PATTERN.match(rest) + if m: + idx = m.groups()[0] + if not self.DIGIT_PATTERN.match(idx): + d = d[idx] + else: + try: + n = int(idx) # try as number first (most likely) + d = d[n] + except TypeError: + d = d[idx] + if m: + rest = rest[m.end():] + else: + raise ValueError('Unable to convert ' + '%r at %r' % (value, rest)) + #rest should be empty + return d + + def convert(self, value): + """ + Convert values to an appropriate type. dicts, lists and tuples are + replaced by their converting alternatives. Strings are checked to + see if they have a conversion format and are converted if they do. + """ + if not isinstance(value, ConvertingDict) and isinstance(value, dict): + value = ConvertingDict(value) + value.configurator = self + elif not isinstance(value, ConvertingList) and isinstance(value, list): + value = ConvertingList(value) + value.configurator = self + elif not isinstance(value, ConvertingTuple) and\ + isinstance(value, tuple): + value = ConvertingTuple(value) + value.configurator = self + elif isinstance(value, string_types): + m = self.CONVERT_PATTERN.match(value) + if m: + d = m.groupdict() + prefix = d['prefix'] + converter = self.value_converters.get(prefix, None) + if converter: + suffix = d['suffix'] + converter = getattr(self, converter) + value = converter(suffix) + return value + + def configure_custom(self, config): + """Configure an object with a user-supplied factory.""" + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + kwargs = dict([(k, config[k]) for k in config if valid_ident(k)]) + result = c(**kwargs) + if props: + for name, value in props.items(): + setattr(result, name, value) + return result + + def as_tuple(self, value): + """Utility function which converts lists to tuples.""" + if isinstance(value, list): + value = tuple(value) + return value diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/database.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/database.py new file mode 100644 index 0000000..b13cdac --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/index.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/index.py new file mode 100644 index 0000000..2406be2 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/index.py @@ -0,0 +1,516 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import hashlib +import logging +import os +import shutil +import subprocess +import tempfile +try: + from threading import Thread +except ImportError: + from dummy_threading import Thread + +from . import DistlibException +from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, + urlparse, build_opener, string_types) +from .util import cached_property, zip_dir, ServerProxy + +logger = logging.getLogger(__name__) + +DEFAULT_INDEX = 'https://pypi.python.org/pypi' +DEFAULT_REALM = 'pypi' + +class PackageIndex(object): + """ + This class represents a package index compatible with PyPI, the Python + Package Index. + """ + + boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$' + + def __init__(self, url=None): + """ + Initialise an instance. + + :param url: The URL of the index. If not specified, the URL for PyPI is + used. + """ + self.url = url or DEFAULT_INDEX + self.read_configuration() + scheme, netloc, path, params, query, frag = urlparse(self.url) + if params or query or frag or scheme not in ('http', 'https'): + raise DistlibException('invalid repository: %s' % self.url) + self.password_handler = None + self.ssl_verifier = None + self.gpg = None + self.gpg_home = None + with open(os.devnull, 'w') as sink: + # Use gpg by default rather than gpg2, as gpg2 insists on + # prompting for passwords + for s in ('gpg', 'gpg2'): + try: + rc = subprocess.check_call([s, '--version'], stdout=sink, + stderr=sink) + if rc == 0: + self.gpg = s + break + except OSError: + pass + + def _get_pypirc_command(self): + """ + Get the distutils command for interacting with PyPI configurations. + :return: the command. + """ + from distutils.core import Distribution + from distutils.config import PyPIRCCommand + d = Distribution() + return PyPIRCCommand(d) + + def read_configuration(self): + """ + Read the PyPI access configuration as supported by distutils, getting + PyPI to do the actual work. This populates ``username``, ``password``, + ``realm`` and ``url`` attributes from the configuration. + """ + # get distutils to do the work + c = self._get_pypirc_command() + c.repository = self.url + cfg = c._read_pypirc() + self.username = cfg.get('username') + self.password = cfg.get('password') + self.realm = cfg.get('realm', 'pypi') + self.url = cfg.get('repository', self.url) + + def save_configuration(self): + """ + Save the PyPI access configuration. You must have set ``username`` and + ``password`` attributes before calling this method. + + Again, distutils is used to do the actual work. + """ + self.check_credentials() + # get distutils to do the work + c = self._get_pypirc_command() + c._store_pypirc(self.username, self.password) + + def check_credentials(self): + """ + Check that ``username`` and ``password`` have been set, and raise an + exception if not. + """ + if self.username is None or self.password is None: + raise DistlibException('username and password must be set') + pm = HTTPPasswordMgr() + _, netloc, _, _, _, _ = urlparse(self.url) + pm.add_password(self.realm, netloc, self.username, self.password) + self.password_handler = HTTPBasicAuthHandler(pm) + + def register(self, metadata): + """ + Register a distribution on PyPI, using the provided metadata. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the distribution to be + registered. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + metadata.validate() + d = metadata.todict() + d[':action'] = 'verify' + request = self.encode_request(d.items(), []) + response = self.send_request(request) + d[':action'] = 'submit' + request = self.encode_request(d.items(), []) + return self.send_request(request) + + def _reader(self, name, stream, outbuf): + """ + Thread runner for reading lines of from a subprocess into a buffer. + + :param name: The logical name of the stream (used for logging only). + :param stream: The stream to read from. This will typically a pipe + connected to the output stream of a subprocess. + :param outbuf: The list to append the read lines to. + """ + while True: + s = stream.readline() + if not s: + break + s = s.decode('utf-8').rstrip() + outbuf.append(s) + logger.debug('%s: %s' % (name, s)) + stream.close() + + def get_sign_command(self, filename, signer, sign_password, + keystore=None): + """ + Return a suitable command for signing a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The signing command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + if sign_password is not None: + cmd.extend(['--batch', '--passphrase-fd', '0']) + td = tempfile.mkdtemp() + sf = os.path.join(td, os.path.basename(filename) + '.asc') + cmd.extend(['--detach-sign', '--armor', '--local-user', + signer, '--output', sf, filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd, sf + + def run_command(self, cmd, input_data=None): + """ + Run a command in a child process , passing it any input data specified. + + :param cmd: The command to run. + :param input_data: If specified, this must be a byte string containing + data to be sent to the child process. + :return: A tuple consisting of the subprocess' exit code, a list of + lines read from the subprocess' ``stdout``, and a list of + lines read from the subprocess' ``stderr``. + """ + kwargs = { + 'stdout': subprocess.PIPE, + 'stderr': subprocess.PIPE, + } + if input_data is not None: + kwargs['stdin'] = subprocess.PIPE + stdout = [] + stderr = [] + p = subprocess.Popen(cmd, **kwargs) + # We don't use communicate() here because we may need to + # get clever with interacting with the command + t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout)) + t1.start() + t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr)) + t2.start() + if input_data is not None: + p.stdin.write(input_data) + p.stdin.close() + + p.wait() + t1.join() + t2.join() + return p.returncode, stdout, stderr + + def sign_file(self, filename, signer, sign_password, keystore=None): + """ + Sign a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The absolute pathname of the file where the signature is + stored. + """ + cmd, sig_file = self.get_sign_command(filename, signer, sign_password, + keystore) + rc, stdout, stderr = self.run_command(cmd, + sign_password.encode('utf-8')) + if rc != 0: + raise DistlibException('sign command failed with error ' + 'code %s' % rc) + return sig_file + + def upload_file(self, metadata, filename, signer=None, sign_password=None, + filetype='sdist', pyversion='source', keystore=None): + """ + Upload a release file to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the file to be uploaded. + :param filename: The pathname of the file to be uploaded. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param filetype: The type of the file being uploaded. This is the + distutils command which produced that file, e.g. + ``sdist`` or ``bdist_wheel``. + :param pyversion: The version of Python which the release relates + to. For code compatible with any Python, this would + be ``source``, otherwise it would be e.g. ``3.2``. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.exists(filename): + raise DistlibException('not found: %s' % filename) + metadata.validate() + d = metadata.todict() + sig_file = None + if signer: + if not self.gpg: + logger.warning('no signing program available - not signed') + else: + sig_file = self.sign_file(filename, signer, sign_password, + keystore) + with open(filename, 'rb') as f: + file_data = f.read() + md5_digest = hashlib.md5(file_data).hexdigest() + sha256_digest = hashlib.sha256(file_data).hexdigest() + d.update({ + ':action': 'file_upload', + 'protocol_version': '1', + 'filetype': filetype, + 'pyversion': pyversion, + 'md5_digest': md5_digest, + 'sha256_digest': sha256_digest, + }) + files = [('content', os.path.basename(filename), file_data)] + if sig_file: + with open(sig_file, 'rb') as f: + sig_data = f.read() + files.append(('gpg_signature', os.path.basename(sig_file), + sig_data)) + shutil.rmtree(os.path.dirname(sig_file)) + request = self.encode_request(d.items(), files) + return self.send_request(request) + + def upload_documentation(self, metadata, doc_dir): + """ + Upload documentation to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the documentation to be + uploaded. + :param doc_dir: The pathname of the directory which contains the + documentation. This should be the directory that + contains the ``index.html`` for the documentation. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.isdir(doc_dir): + raise DistlibException('not a directory: %r' % doc_dir) + fn = os.path.join(doc_dir, 'index.html') + if not os.path.exists(fn): + raise DistlibException('not found: %r' % fn) + metadata.validate() + name, version = metadata.name, metadata.version + zip_data = zip_dir(doc_dir).getvalue() + fields = [(':action', 'doc_upload'), + ('name', name), ('version', version)] + files = [('content', name, zip_data)] + request = self.encode_request(fields, files) + return self.send_request(request) + + def get_verify_command(self, signature_filename, data_filename, + keystore=None): + """ + Return a suitable command for verifying a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The verifying command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + cmd.extend(['--verify', signature_filename, data_filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd + + def verify_signature(self, signature_filename, data_filename, + keystore=None): + """ + Verify a signature for a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: True if the signature was verified, else False. + """ + if not self.gpg: + raise DistlibException('verification unavailable because gpg ' + 'unavailable') + cmd = self.get_verify_command(signature_filename, data_filename, + keystore) + rc, stdout, stderr = self.run_command(cmd) + if rc not in (0, 1): + raise DistlibException('verify command failed with error ' + 'code %s' % rc) + return rc == 0 + + def download_file(self, url, destfile, digest=None, reporthook=None): + """ + This is a convenience method for downloading a file from an URL. + Normally, this will be a file from the index, though currently + no check is made for this (i.e. a file can be downloaded from + anywhere). + + The method is just like the :func:`urlretrieve` function in the + standard library, except that it allows digest computation to be + done during download and checking that the downloaded data + matched any expected value. + + :param url: The URL of the file to be downloaded (assumed to be + available via an HTTP GET request). + :param destfile: The pathname where the downloaded file is to be + saved. + :param digest: If specified, this must be a (hasher, value) + tuple, where hasher is the algorithm used (e.g. + ``'md5'``) and ``value`` is the expected value. + :param reporthook: The same as for :func:`urlretrieve` in the + standard library. + """ + if digest is None: + digester = None + logger.debug('No digest specified') + else: + if isinstance(digest, (list, tuple)): + hasher, digest = digest + else: + hasher = 'md5' + digester = getattr(hashlib, hasher)() + logger.debug('Digest specified: %s' % digest) + # The following code is equivalent to urlretrieve. + # We need to do it this way so that we can compute the + # digest of the file as we go. + with open(destfile, 'wb') as dfp: + # addinfourl is not a context manager on 2.x + # so we have to use try/finally + sfp = self.send_request(Request(url)) + try: + headers = sfp.info() + blocksize = 8192 + size = -1 + read = 0 + blocknum = 0 + if "content-length" in headers: + size = int(headers["Content-Length"]) + if reporthook: + reporthook(blocknum, blocksize, size) + while True: + block = sfp.read(blocksize) + if not block: + break + read += len(block) + dfp.write(block) + if digester: + digester.update(block) + blocknum += 1 + if reporthook: + reporthook(blocknum, blocksize, size) + finally: + sfp.close() + + # check that we got the whole file, if we can + if size >= 0 and read < size: + raise DistlibException( + 'retrieval incomplete: got only %d out of %d bytes' + % (read, size)) + # if we have a digest, it must match. + if digester: + actual = digester.hexdigest() + if digest != actual: + raise DistlibException('%s digest mismatch for %s: expected ' + '%s, got %s' % (hasher, destfile, + digest, actual)) + logger.debug('Digest verified: %s', digest) + + def send_request(self, req): + """ + Send a standard library :class:`Request` to PyPI and return its + response. + + :param req: The request to send. + :return: The HTTP response from PyPI (a standard library HTTPResponse). + """ + handlers = [] + if self.password_handler: + handlers.append(self.password_handler) + if self.ssl_verifier: + handlers.append(self.ssl_verifier) + opener = build_opener(*handlers) + return opener.open(req) + + def encode_request(self, fields, files): + """ + Encode fields and files for posting to an HTTP server. + + :param fields: The fields to send as a list of (fieldname, value) + tuples. + :param files: The files to send as a list of (fieldname, filename, + file_bytes) tuple. + """ + # Adapted from packaging, which in turn was adapted from + # http://code.activestate.com/recipes/146306 + + parts = [] + boundary = self.boundary + for k, values in fields: + if not isinstance(values, (list, tuple)): + values = [values] + + for v in values: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"' % + k).encode('utf-8'), + b'', + v.encode('utf-8'))) + for key, filename, value in files: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"; filename="%s"' % + (key, filename)).encode('utf-8'), + b'', + value)) + + parts.extend((b'--' + boundary + b'--', b'')) + + body = b'\r\n'.join(parts) + ct = b'multipart/form-data; boundary=' + boundary + headers = { + 'Content-type': ct, + 'Content-length': str(len(body)) + } + return Request(self.url, body, headers) + + def search(self, terms, operator=None): + if isinstance(terms, string_types): + terms = {'name': terms} + rpc_proxy = ServerProxy(self.url, timeout=3.0) + try: + return rpc_proxy.search(terms, operator or 'and') + finally: + rpc_proxy('close')() diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/locators.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/locators.py new file mode 100644 index 0000000..5c655c3 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/manifest.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/manifest.py new file mode 100644 index 0000000..ca0fe44 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/manifest.py @@ -0,0 +1,393 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2013 Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Class representing the list of files in a distribution. + +Equivalent to distutils.filelist, but fixes some problems. +""" +import fnmatch +import logging +import os +import re +import sys + +from . import DistlibException +from .compat import fsdecode +from .util import convert_path + + +__all__ = ['Manifest'] + +logger = logging.getLogger(__name__) + +# a \ followed by some spaces + EOL +_COLLAPSE_PATTERN = re.compile('\\\\w*\n', re.M) +_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S) + +# +# Due to the different results returned by fnmatch.translate, we need +# to do slightly different processing for Python 2.7 and 3.2 ... this needed +# to be brought in for Python 3.6 onwards. +# +_PYTHON_VERSION = sys.version_info[:2] + +class Manifest(object): + """A list of files built by on exploring the filesystem and filtered by + applying various patterns to what we find there. + """ + + def __init__(self, base=None): + """ + Initialise an instance. + + :param base: The base directory to explore under. + """ + self.base = os.path.abspath(os.path.normpath(base or os.getcwd())) + self.prefix = self.base + os.sep + self.allfiles = None + self.files = set() + + # + # Public API + # + + def findall(self): + """Find all files under the base and set ``allfiles`` to the absolute + pathnames of files found. + """ + from stat import S_ISREG, S_ISDIR, S_ISLNK + + self.allfiles = allfiles = [] + root = self.base + stack = [root] + pop = stack.pop + push = stack.append + + while stack: + root = pop() + names = os.listdir(root) + + for name in names: + fullname = os.path.join(root, name) + + # Avoid excess stat calls -- just one will do, thank you! + stat = os.stat(fullname) + mode = stat.st_mode + if S_ISREG(mode): + allfiles.append(fsdecode(fullname)) + elif S_ISDIR(mode) and not S_ISLNK(mode): + push(fullname) + + def add(self, item): + """ + Add a file to the manifest. + + :param item: The pathname to add. This can be relative to the base. + """ + if not item.startswith(self.prefix): + item = os.path.join(self.base, item) + self.files.add(os.path.normpath(item)) + + def add_many(self, items): + """ + Add a list of files to the manifest. + + :param items: The pathnames to add. These can be relative to the base. + """ + for item in items: + self.add(item) + + def sorted(self, wantdirs=False): + """ + Return sorted files in directory order + """ + + def add_dir(dirs, d): + dirs.add(d) + logger.debug('add_dir added %s', d) + if d != self.base: + parent, _ = os.path.split(d) + assert parent not in ('', '/') + add_dir(dirs, parent) + + result = set(self.files) # make a copy! + if wantdirs: + dirs = set() + for f in result: + add_dir(dirs, os.path.dirname(f)) + result |= dirs + return [os.path.join(*path_tuple) for path_tuple in + sorted(os.path.split(path) for path in result)] + + def clear(self): + """Clear all collected files.""" + self.files = set() + self.allfiles = [] + + def process_directive(self, directive): + """ + Process a directive which either adds some files from ``allfiles`` to + ``files``, or removes some files from ``files``. + + :param directive: The directive to process. This should be in a format + compatible with distutils ``MANIFEST.in`` files: + + http://docs.python.org/distutils/sourcedist.html#commands + """ + # Parse the line: split it up, make sure the right number of words + # is there, and return the relevant words. 'action' is always + # defined: it's the first word of the line. Which of the other + # three are defined depends on the action; it'll be either + # patterns, (dir and patterns), or (dirpattern). + action, patterns, thedir, dirpattern = self._parse_directive(directive) + + # OK, now we know that the action is valid and we have the + # right number of words on the line for that action -- so we + # can proceed with minimal error-checking. + if action == 'include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=True): + logger.warning('no files found matching %r', pattern) + + elif action == 'exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, anchor=True) + #if not found: + # logger.warning('no previously-included files ' + # 'found matching %r', pattern) + + elif action == 'global-include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=False): + logger.warning('no files found matching %r ' + 'anywhere in distribution', pattern) + + elif action == 'global-exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, anchor=False) + #if not found: + # logger.warning('no previously-included files ' + # 'matching %r found anywhere in ' + # 'distribution', pattern) + + elif action == 'recursive-include': + for pattern in patterns: + if not self._include_pattern(pattern, prefix=thedir): + logger.warning('no files found matching %r ' + 'under directory %r', pattern, thedir) + + elif action == 'recursive-exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, prefix=thedir) + #if not found: + # logger.warning('no previously-included files ' + # 'matching %r found under directory %r', + # pattern, thedir) + + elif action == 'graft': + if not self._include_pattern(None, prefix=dirpattern): + logger.warning('no directories found matching %r', + dirpattern) + + elif action == 'prune': + if not self._exclude_pattern(None, prefix=dirpattern): + logger.warning('no previously-included directories found ' + 'matching %r', dirpattern) + else: # pragma: no cover + # This should never happen, as it should be caught in + # _parse_template_line + raise DistlibException( + 'invalid action %r' % action) + + # + # Private API + # + + def _parse_directive(self, directive): + """ + Validate a directive. + :param directive: The directive to validate. + :return: A tuple of action, patterns, thedir, dir_patterns + """ + words = directive.split() + if len(words) == 1 and words[0] not in ('include', 'exclude', + 'global-include', + 'global-exclude', + 'recursive-include', + 'recursive-exclude', + 'graft', 'prune'): + # no action given, let's use the default 'include' + words.insert(0, 'include') + + action = words[0] + patterns = thedir = dir_pattern = None + + if action in ('include', 'exclude', + 'global-include', 'global-exclude'): + if len(words) < 2: + raise DistlibException( + '%r expects <pattern1> <pattern2> ...' % action) + + patterns = [convert_path(word) for word in words[1:]] + + elif action in ('recursive-include', 'recursive-exclude'): + if len(words) < 3: + raise DistlibException( + '%r expects <dir> <pattern1> <pattern2> ...' % action) + + thedir = convert_path(words[1]) + patterns = [convert_path(word) for word in words[2:]] + + elif action in ('graft', 'prune'): + if len(words) != 2: + raise DistlibException( + '%r expects a single <dir_pattern>' % action) + + dir_pattern = convert_path(words[1]) + + else: + raise DistlibException('unknown action %r' % action) + + return action, patterns, thedir, dir_pattern + + def _include_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Select strings (presumably filenames) from 'self.files' that + match 'pattern', a Unix-style wildcard (glob) pattern. + + Patterns are not quite the same as implemented by the 'fnmatch' + module: '*' and '?' match non-special characters, where "special" + is platform-dependent: slash on Unix; colon, slash, and backslash on + DOS/Windows; and colon on Mac OS. + + If 'anchor' is true (the default), then the pattern match is more + stringent: "*.py" will match "foo.py" but not "foo/bar.py". If + 'anchor' is false, both of these will match. + + If 'prefix' is supplied, then only filenames starting with 'prefix' + (itself a pattern) and ending with 'pattern', with anything in between + them, will match. 'anchor' is ignored in this case. + + If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and + 'pattern' is assumed to be either a string containing a regex or a + regex object -- no translation is done, the regex is just compiled + and used as-is. + + Selected strings will be added to self.files. + + Return True if files are found. + """ + # XXX docstring lying about what the special chars are? + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + + # delayed loading of allfiles list + if self.allfiles is None: + self.findall() + + for name in self.allfiles: + if pattern_re.search(name): + self.files.add(name) + found = True + return found + + def _exclude_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Remove strings (presumably filenames) from 'files' that match + 'pattern'. + + Other parameters are the same as for 'include_pattern()', above. + The list 'self.files' is modified in place. Return True if files are + found. + + This API is public to allow e.g. exclusion of SCM subdirs, e.g. when + packaging source distributions + """ + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + for f in list(self.files): + if pattern_re.search(f): + self.files.remove(f) + found = True + return found + + def _translate_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Translate a shell-like wildcard pattern to a compiled regular + expression. + + Return the compiled regex. If 'is_regex' true, + then 'pattern' is directly compiled to a regex (if it's a string) + or just returned as-is (assumes it's a regex object). + """ + if is_regex: + if isinstance(pattern, str): + return re.compile(pattern) + else: + return pattern + + if _PYTHON_VERSION > (3, 2): + # ditch start and end characters + start, _, end = self._glob_to_re('_').partition('_') + + if pattern: + pattern_re = self._glob_to_re(pattern) + if _PYTHON_VERSION > (3, 2): + assert pattern_re.startswith(start) and pattern_re.endswith(end) + else: + pattern_re = '' + + base = re.escape(os.path.join(self.base, '')) + if prefix is not None: + # ditch end of pattern character + if _PYTHON_VERSION <= (3, 2): + empty_pattern = self._glob_to_re('') + prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] + else: + prefix_re = self._glob_to_re(prefix) + assert prefix_re.startswith(start) and prefix_re.endswith(end) + prefix_re = prefix_re[len(start): len(prefix_re) - len(end)] + sep = os.sep + if os.sep == '\\': + sep = r'\\' + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + sep.join((prefix_re, + '.*' + pattern_re)) + else: + pattern_re = pattern_re[len(start): len(pattern_re) - len(end)] + pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep, + pattern_re, end) + else: # no prefix -- respect anchor flag + if anchor: + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + pattern_re + else: + pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):]) + + return re.compile(pattern_re) + + def _glob_to_re(self, pattern): + """Translate a shell-like glob pattern to a regular expression. + + Return a string containing the regex. Differs from + 'fnmatch.translate()' in that '*' does not match "special characters" + (which are platform-specific). + """ + pattern_re = fnmatch.translate(pattern) + + # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which + # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, + # and by extension they shouldn't match such "special characters" under + # any OS. So change all non-escaped dots in the RE to match any + # character except the special characters (currently: just os.sep). + sep = os.sep + if os.sep == '\\': + # we're using a regex to manipulate a regex, so we need + # to escape the backslash twice + sep = r'\\\\' + escaped = r'\1[^%s]' % sep + pattern_re = re.sub(r'((?<!\\)(\\\\)*)\.', escaped, pattern_re) + return pattern_re diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/markers.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/markers.py new file mode 100644 index 0000000..ee1f3e2 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/markers.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Parser for the environment markers micro-language defined in PEP 508. +""" + +# Note: In PEP 345, the micro-language was Python compatible, so the ast +# module could be used to parse it. However, PEP 508 introduced operators such +# as ~= and === which aren't in Python, necessitating a different approach. + +import os +import sys +import platform +import re + +from .compat import python_implementation, urlparse, string_types +from .util import in_venv, parse_marker + +__all__ = ['interpret'] + +def _is_literal(o): + if not isinstance(o, string_types) or not o: + return False + return o[0] in '\'"' + +class Evaluator(object): + """ + This class is used to evaluate marker expessions. + """ + + operations = { + '==': lambda x, y: x == y, + '===': lambda x, y: x == y, + '~=': lambda x, y: x == y or x > y, + '!=': lambda x, y: x != y, + '<': lambda x, y: x < y, + '<=': lambda x, y: x == y or x < y, + '>': lambda x, y: x > y, + '>=': lambda x, y: x == y or x > y, + 'and': lambda x, y: x and y, + 'or': lambda x, y: x or y, + 'in': lambda x, y: x in y, + 'not in': lambda x, y: x not in y, + } + + def evaluate(self, expr, context): + """ + Evaluate a marker expression returned by the :func:`parse_requirement` + function in the specified context. + """ + if isinstance(expr, string_types): + if expr[0] in '\'"': + result = expr[1:-1] + else: + if expr not in context: + raise SyntaxError('unknown variable: %s' % expr) + result = context[expr] + else: + assert isinstance(expr, dict) + op = expr['op'] + if op not in self.operations: + raise NotImplementedError('op not implemented: %s' % op) + elhs = expr['lhs'] + erhs = expr['rhs'] + if _is_literal(expr['lhs']) and _is_literal(expr['rhs']): + raise SyntaxError('invalid comparison: %s %s %s' % (elhs, op, erhs)) + + lhs = self.evaluate(elhs, context) + rhs = self.evaluate(erhs, context) + result = self.operations[op](lhs, rhs) + return result + +def default_context(): + def format_full_version(info): + version = '%s.%s.%s' % (info.major, info.minor, info.micro) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + if hasattr(sys, 'implementation'): + implementation_version = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + implementation_version = '0' + implementation_name = '' + + result = { + 'implementation_name': implementation_name, + 'implementation_version': implementation_version, + 'os_name': os.name, + 'platform_machine': platform.machine(), + 'platform_python_implementation': platform.python_implementation(), + 'platform_release': platform.release(), + 'platform_system': platform.system(), + 'platform_version': platform.version(), + 'platform_in_venv': str(in_venv()), + 'python_full_version': platform.python_version(), + 'python_version': platform.python_version()[:3], + 'sys_platform': sys.platform, + } + return result + +DEFAULT_CONTEXT = default_context() +del default_context + +evaluator = Evaluator() + +def interpret(marker, execution_context=None): + """ + Interpret a marker and return a result depending on environment. + + :param marker: The marker to interpret. + :type marker: str + :param execution_context: The context used for name lookup. + :type execution_context: mapping + """ + try: + expr, rest = parse_marker(marker) + except Exception as e: + raise SyntaxError('Unable to interpret marker syntax: %s: %s' % (marker, e)) + if rest and rest[0] != '#': + raise SyntaxError('unexpected trailing data in marker: %s: %s' % (marker, rest)) + context = dict(DEFAULT_CONTEXT) + if execution_context: + context.update(execution_context) + return evaluator.evaluate(expr, context) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/metadata.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/metadata.py new file mode 100644 index 0000000..77eed7f --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/resources.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/resources.py new file mode 100644 index 0000000..1884016 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/resources.py @@ -0,0 +1,355 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import bisect +import io +import logging +import os +import pkgutil +import shutil +import sys +import types +import zipimport + +from . import DistlibException +from .util import cached_property, get_cache_base, path_to_cache_dir, Cache + +logger = logging.getLogger(__name__) + + +cache = None # created when needed + + +class ResourceCache(Cache): + def __init__(self, base=None): + if base is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('resource-cache')) + super(ResourceCache, self).__init__(base) + + def is_stale(self, resource, path): + """ + Is the cache stale for the given resource? + + :param resource: The :class:`Resource` being cached. + :param path: The path of the resource in the cache. + :return: True if the cache is stale. + """ + # Cache invalidation is a hard problem :-) + return True + + def get(self, resource): + """ + Get a resource into the cache, + + :param resource: A :class:`Resource` instance. + :return: The pathname of the resource in the cache. + """ + prefix, path = resource.finder.get_cache_info(resource) + if prefix is None: + result = path + else: + result = os.path.join(self.base, self.prefix_to_dir(prefix), path) + dirname = os.path.dirname(result) + if not os.path.isdir(dirname): + os.makedirs(dirname) + if not os.path.exists(result): + stale = True + else: + stale = self.is_stale(resource, path) + if stale: + # write the bytes of the resource to the cache location + with open(result, 'wb') as f: + f.write(resource.bytes) + return result + + +class ResourceBase(object): + def __init__(self, finder, name): + self.finder = finder + self.name = name + + +class Resource(ResourceBase): + """ + A class representing an in-package resource, such as a data file. This is + not normally instantiated by user code, but rather by a + :class:`ResourceFinder` which manages the resource. + """ + is_container = False # Backwards compatibility + + def as_stream(self): + """ + Get the resource as a stream. + + This is not a property to make it obvious that it returns a new stream + each time. + """ + return self.finder.get_stream(self) + + @cached_property + def file_path(self): + global cache + if cache is None: + cache = ResourceCache() + return cache.get(self) + + @cached_property + def bytes(self): + return self.finder.get_bytes(self) + + @cached_property + def size(self): + return self.finder.get_size(self) + + +class ResourceContainer(ResourceBase): + is_container = True # Backwards compatibility + + @cached_property + def resources(self): + return self.finder.get_resources(self) + + +class ResourceFinder(object): + """ + Resource finder for file system resources. + """ + + if sys.platform.startswith('java'): + skipped_extensions = ('.pyc', '.pyo', '.class') + else: + skipped_extensions = ('.pyc', '.pyo') + + def __init__(self, module): + self.module = module + self.loader = getattr(module, '__loader__', None) + self.base = os.path.dirname(getattr(module, '__file__', '')) + + def _adjust_path(self, path): + return os.path.realpath(path) + + def _make_path(self, resource_name): + # Issue #50: need to preserve type of path on Python 2.x + # like os.path._get_sep + if isinstance(resource_name, bytes): # should only happen on 2.x + sep = b'/' + else: + sep = '/' + parts = resource_name.split(sep) + parts.insert(0, self.base) + result = os.path.join(*parts) + return self._adjust_path(result) + + def _find(self, path): + return os.path.exists(path) + + def get_cache_info(self, resource): + return None, resource.path + + def find(self, resource_name): + path = self._make_path(resource_name) + if not self._find(path): + result = None + else: + if self._is_directory(path): + result = ResourceContainer(self, resource_name) + else: + result = Resource(self, resource_name) + result.path = path + return result + + def get_stream(self, resource): + return open(resource.path, 'rb') + + def get_bytes(self, resource): + with open(resource.path, 'rb') as f: + return f.read() + + def get_size(self, resource): + return os.path.getsize(resource.path) + + def get_resources(self, resource): + def allowed(f): + return (f != '__pycache__' and not + f.endswith(self.skipped_extensions)) + return set([f for f in os.listdir(resource.path) if allowed(f)]) + + def is_container(self, resource): + return self._is_directory(resource.path) + + _is_directory = staticmethod(os.path.isdir) + + def iterator(self, resource_name): + resource = self.find(resource_name) + if resource is not None: + todo = [resource] + while todo: + resource = todo.pop(0) + yield resource + if resource.is_container: + rname = resource.name + for name in resource.resources: + if not rname: + new_name = name + else: + new_name = '/'.join([rname, name]) + child = self.find(new_name) + if child.is_container: + todo.append(child) + else: + yield child + + +class ZipResourceFinder(ResourceFinder): + """ + Resource finder for resources in .zip files. + """ + def __init__(self, module): + super(ZipResourceFinder, self).__init__(module) + archive = self.loader.archive + self.prefix_len = 1 + len(archive) + # PyPy doesn't have a _files attr on zipimporter, and you can't set one + if hasattr(self.loader, '_files'): + self._files = self.loader._files + else: + self._files = zipimport._zip_directory_cache[archive] + self.index = sorted(self._files) + + def _adjust_path(self, path): + return path + + def _find(self, path): + path = path[self.prefix_len:] + if path in self._files: + result = True + else: + if path and path[-1] != os.sep: + path = path + os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + if not result: + logger.debug('_find failed: %r %r', path, self.loader.prefix) + else: + logger.debug('_find worked: %r %r', path, self.loader.prefix) + return result + + def get_cache_info(self, resource): + prefix = self.loader.archive + path = resource.path[1 + len(prefix):] + return prefix, path + + def get_bytes(self, resource): + return self.loader.get_data(resource.path) + + def get_stream(self, resource): + return io.BytesIO(self.get_bytes(resource)) + + def get_size(self, resource): + path = resource.path[self.prefix_len:] + return self._files[path][3] + + def get_resources(self, resource): + path = resource.path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + plen = len(path) + result = set() + i = bisect.bisect(self.index, path) + while i < len(self.index): + if not self.index[i].startswith(path): + break + s = self.index[i][plen:] + result.add(s.split(os.sep, 1)[0]) # only immediate children + i += 1 + return result + + def _is_directory(self, path): + path = path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + return result + +_finder_registry = { + type(None): ResourceFinder, + zipimport.zipimporter: ZipResourceFinder +} + +try: + # In Python 3.6, _frozen_importlib -> _frozen_importlib_external + try: + import _frozen_importlib_external as _fi + except ImportError: + import _frozen_importlib as _fi + _finder_registry[_fi.SourceFileLoader] = ResourceFinder + _finder_registry[_fi.FileFinder] = ResourceFinder + del _fi +except (ImportError, AttributeError): + pass + + +def register_finder(loader, finder_maker): + _finder_registry[type(loader)] = finder_maker + +_finder_cache = {} + + +def finder(package): + """ + Return a resource finder for a package. + :param package: The name of the package. + :return: A :class:`ResourceFinder` instance for the package. + """ + if package in _finder_cache: + result = _finder_cache[package] + else: + if package not in sys.modules: + __import__(package) + module = sys.modules[package] + path = getattr(module, '__path__', None) + if path is None: + raise DistlibException('You cannot get a finder for a module, ' + 'only for a package') + loader = getattr(module, '__loader__', None) + finder_maker = _finder_registry.get(type(loader)) + if finder_maker is None: + raise DistlibException('Unable to locate finder for %r' % package) + result = finder_maker(module) + _finder_cache[package] = result + return result + + +_dummy_module = types.ModuleType(str('__dummy__')) + + +def finder_for_path(path): + """ + Return a resource finder for a path, which should represent a container. + + :param path: The path. + :return: A :class:`ResourceFinder` instance for the path. + """ + result = None + # calls any path hooks, gets importer into cache + pkgutil.get_importer(path) + loader = sys.path_importer_cache.get(path) + finder = _finder_registry.get(type(loader)) + if finder: + module = _dummy_module + module.__file__ = os.path.join(path, '') + module.__loader__ = loader + result = finder(module) + return result diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/scripts.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/scripts.py new file mode 100644 index 0000000..8e22cb9 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/t32.exe b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/t64.exe b/mongo_mac/lib/python3.6/site-packages/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 z+8+$D$B^0(dpJ6<hZa-dac!=Dhn7&}Ml@L8?2`HV^PF4PZHDWFvVxb6nK^I63}Ihy z5|`ET>A18uUe?`-6oJ;)kr577Q&Vi><kIszZ_Qr$uhe^fsNOTolL}S>eB)*fB=t!> z-VTs@&yaf8Q*)_o#I@2F(QesP)-{|(k4g>Cwre=A!xmwMY;-K8yUmySJ@MCm|CJ}& zc_7=d`c9fRLg$#ug2UUQz30hw(;n+0IrXqxE4M$qE!^uU@ncbAh1*({4{wX~#v7|h zt!Ft>u19Wbj`B@4NCff}+~v}ieMORYgqxzJ`{&g7c6~pRG;{)TWAZbx<ie!<90O}9 zFuPst_a~ifU7)u$k|UHeV&x#2(^Kba%8_f6es?Tqy=O2BmwS}1RxI0mFO%57W>(dK zj`6KWJ}w7wdDMsql_NPa){*Rv&G4++R*ji#uw-r)A6qgo=lJ7HdO42m-T9`*@Q7Dz zf+UuVF*`x*lEuy`b}3{lL+qQx-V%G0F)qPi+bXtgzTai9vLpp|U<Ej8B$MXm=2j~8 z#PV~8bbWRN7g3L|ARg-t){(9tPfc@phf2~Fgk5B)l7bbK*Iq$2%`9=Gq9I(EFH}L% zrh*VWhLZT6_2Z6h6H2s_uv8FF<8p763W9KbOfoJW-bwWRO;=Bqsh;-w*7d^;>m{as zs0*o<P&JwQ+18<ca_sbkzHLHZ2%ZxQ>1V`BC1hJ-*Ccia#IBKi=^B#in@UCIn4Fmk zior7R+v?|Wna0Stc!;T_-oKJ_$^PsZYv(fQ1ujjn{%Vk9>tTa9t=}6Y#k$KNsn#7D z>0#YsEHbRM2Ju)c4U%UqHppyip+WMkB7-cjt};lPHO(LuR<=QwS{WMg3(c%?245?9 ziow?lKEUA8&sYft-za#b!KE9r+HRE6_%{pwp}}QbvYHIuAo$A$-!1rVgEtEPguxF8 zzS-bSg5P6sOYqwb-YWRb25%F*+TbFcu)GG35qyEc(VnQRIR;M_JkQ`x!QBRz*{79e z@KnKv8(fYKTTX+sfK^r>gL?#zF?gQfM{m$&uMoV|;Bs!(I%M!_!4DXGt>AkNzFzPK zgWoRr!v<d<_$GsI5`2TfHw(Vr;9CT*HF$&IOAWqT@G^rp3Z8H9je^fG_yNH^25%Dl zB7<9kry9If@WBRe6Fk}ABIdH<3?3u6GI)aEpI@)(kSw@maHrsJ7(7MrMuVpczQf>Y zf^RW6q5)++U~rG%8x5W(_-zKCE%;i4=L^2f;0pw=FnERFMFw9g_-un$3!Y=}wSs3D ze7)e~41T-dDF)vt_yB`%5<J1+n+1<F_!hz2mQwZ_`wj)?KT6u$dUsEH{NL_G91~@| zD8BrcqOvvqIb+jcY}f&g-)3z7Xl!O<bHvzeFgDy)iT}vhtP>lZn(kW^HPoJ7b}}B9 z8IJ`fs1ut?V>89rq+qka*o-$eXnlyk#@GxqHfh+*FgE>+O$IiTjZL(%@nDl-Y`$2c z3%3B9%Z$yt#-;)rx3Sr8Y?fkkp|N>N+vpAm%Mr%%cg9kBA}pQ8@~6g9x+E-n8_R03 zwCQfn2S5?@&$E{%8|J<N?zLgou%ETBlOOvjQ!$P}NmZf0Bp00|>s01iG?D}w*pSou zNIoLCujkrC>z{ZwSCF3JqS>>diBbD}gUJvNhszwO|GKb=>-u!R@M+)WoJJ?AS)L=? z5Ed)n`|GoLl1KkmO|I|Ly=2up0Y}NIui6|-o?|kMf)-fhY2Q=Xj|YzF--?`w7d<tt z6bwxfW1r4mv)zlf0#APyeg^{ESqaN5r}jnfP_{bH^lbYe0lYtWUmJIT_b}FxwTFFv z*+sAen<8|`KP&npuX%ne8D++{ejQ4q8i;Q0rfA0REx`=67XW4dOa?e$6O$A1tmnv! z*<<%-pZSuPIaOX8;ii)GC3ZG003T)JgCu(<OR;2WD;sxV9G>RyG5z-&{r9N;`?dc2 zmHzvs{@d1RR@x!|!$c8BOywC;1%1eW*oBd?zTrlv26n!W?Wv1zAnf3E7<X3oTIa^6 z9Dd%;)q1G9o|$O4_k8NZlTHj*p+10S$~45614{dJ$0qp3gVMU(vB|!XGNBYT9?#3X zBsf3%WiWhyU3WNtEK^u?Oi`7g&mV`5j@=%|9#mGE)I*%rxqc+mKEq_~bs%LOXxNQ{ zz;UzWjNN7M+~gq7z1@k?_IF^kXLR0bteAF&TZ~qc)&Oj0v)i_oI3Z1tYra3Pt(9OD zLiVYw*EyE$@voIZURq^jV1J9UuDlpijn;jNA5VS!ex`JRq_G~X>!L)txN#+py7=W{ ztczb^z)AzE0XhwT{6et_3^|6hUHof(zoIg&!vZyxr`1JST>jX@{{1x{aC!Y1@&n?X zCx3F~&+M8HBD~XUK8W;=tofju_msf1-gB)lZV^fUDR{P4gSK#|YseSu{&E)LV?eWr z60!QHv1$RdEW>=zm|qfenKc8Y!sgJKIi4d@==NhkIfYT@&*Sp%6_N7F(>4~_4W4aH zJjVL8oCvaxGgd{3w{XsF))&O&`iBp0agy2`liEx`@G?PuAnD^tvJ$bfMWdb^c|A&2 zb2$?c>#EO<u!;~|?nN3DgSxNehtP*s^L30jvF7U@UY-t&<WL4;#*~)fIsPX%NfBj{ z?y0#?aD`7_Z@2%^&EUIklD|TQmMAyt$9!?Tz#o4_0n5_;$V#04sHxx)yVLhCKZgfj zv=+IWHWGl1-`z313d31yr$0UgPc1K5<L_icvo3NlIg2J|D;`8ue+-_}-(q{=XOfnG zABtdFqWsSR(%(X<K3VQgmK|%7VWFHlo!|7g9BaB`bl2%zHh&{Ca72&`f+t{)d!!TQ za#1p5JO-LEL?5fHpUmA~HpbXJLYfpvx+RN@*G2t;<30et0Ct3;>e0~1Ywc&66Jh$i z8GIO{<u)SO2<qk4=V3mz_R%KR!$Q*uA4tj~&K!Re=5%d7SJGg6JAH>^^)H1`{<iF4 zM|0}SW2nm*$Lb$qCz>{Ari)u^cKS0_Gxa-t3?LrI#70j<BWfHf6UEOX<XuEw4Zc&g z?5qBArU9>1W{cY$QZBldi#*%7`&mDrO>dF?3F$3G+wzbkg3hd8YcuY=29b2Dar}vP z{JX?xIduDGKUSY95j9G1j);0g$4N{-&>~eJI!uln2rzUQy~nm}+sWC3`H1hHiq*yK z5lA}QPE`)t@{Ci9M4u{=YT48D&~`OlOdj&wyKW-Wa_^IyH!eTxIJuT;wf<5U{({r0 z?$cCstl?w|Vv_iDHu3^VZ%P_S>qL(E6KRt5Nxg8;R2U>~;&6jF$hpj)XKEi!*N7Pj zX4L6K8c1prYjIy<+&6{XyJ`0WLHAk4eL=|m<9j9imZ1CjASfOo;`eZndO3p(4Km)5 z8wdS41fhQL)WRA$>Q9371i24{M^^8b(43)|$H@jSr#8vjp^1{m_<C{iw+514#w-lS znWc*)q4NW;2td4yjMJrGwvbC9X<E$5^|&vH#T9rNFVTlNFU`qFZcHS#WDw^do!UO{ zxIoehNd-S=%Tu0O@H!9=F}8=^=)<%<#Be6f`0>ZTc8?Gt({@SV2sUCiF1c$j@K=Kz zp!UdpoS|j#4@cL7NByt9%GQ^yudT`{$rE(YrE#Y=cxqsWzkSNbVVy+Y(UZ*s6wiGs z6TNPtc&_F7@1vdW9bz)`!A;Bu|G+qB`U_Fz*eKWEQH7`fyy$b{0gb$Sn3ORW?In)f z8|>F&=~*e5^;3yVh8J$>59*LbL~LC8&F1ivZ$R#_gB%(OFUhQn?48YShuj_*C9<#P zmXw@f`!hL)e=4tRMP$o4B-}&*=Z%tS$sv6kAGiJ_=vcFe9#Kcxqoi)m)MFeR&1+dN zxo`xF)a=8HZm%5ub=G_tz9PQn%Lv~o{-`|8bG8ifM|psC@e{?=+j@0fXml(Bl|xn1 zu=So*NM`LcH!p-Jv2uLtcVwgG2SW5{Yv;A#b38R)H7&`6S*}IAAgfyVNN#u{d*Rd* z(&|9c1uo6I@RzUrf~c?WWTHyDf6m%-mp=G1%v1Aq)8fC1&12YD7we405tBLmlq&sx zn(05RK{)Epe82>Tlik*yI(E(@TK;Cm1RWxb!)EOuhpGNz_Tk#gB$}YPPa?cyo-e(m z$#dkh?DPhnFWpA4(DS9^Q4>dF*yD|{?mbt^Krj1}oY{I+4@vs0*D0dwAkj076LN9U zQsC`Y9Rr^z!_(bfd*03b#u@7VIIUCvz~DwS5^PEB&m3jmp9sdDh(BumDiYH-;hm?- zNghtVpx9y%SFt$sodp?XO7LDcJW&w?tr6sTP@2_EXI)Qse!>YNDzteUescUAV0#z! zE4TihQDNIr&Y%BdpeXH?^J#gxoC0^P^E%RGmXMzjemJA?7$+{n^|?#V!E^pY>udUj z>#*B__P%(u_dTbz_g&kY3V6;Mmt?k`o((5E^-&{8WU@c93GdOOap)net=oRC`*QU8 z&0#j#AUskZ6@kwSuIM8<VK3F;xNSS<#Hc&zxR(<ONj|6W4?Ai_6c9){da+VafPL3D z87SstaXPa$7Z>rerWU?i$Dz&YFJsvm#XW}v?qX^wT8mvZ%lhUiuaoCO`{u088C>9! z1;1L0#!**I5l*6LFu#Qx?|ZEKlJ$<jxNNF#*!JuQX4<?Q@uNQwzn0LOpm2dT9H08! zz@Np9qo)JxopLxtWcgN)pod$;0~^3;`fsYDQ=G%PiMNya!<A#4)z}wh7d1*K!=g&0 z{eh%sIRv5A>NsjIlPCzs&|EawDb#yLPaETQ%aKg>+bDn#G0VS$_oE0WM3n74be0eM zCIZHhmnmmEZbsL#Vn;X!uAuVGOga?jb;QZ7*8F(Q9mhp%$`(j^<suXJPI5{-v%?%W z{~45f!*1U9y8+G#)0`9TJKgbE1ovUM{}Nk5c`{s%+jhtiOWA+Pk@+T|gZB#^j|tIk z;y6Z0I^KQrd9hXwJ`A$ePWktuzorN;g&{8_DGBSM$nNeluJoN%XElGo83qpB)+haj zd0}7|g?Y!d*6qlFE#GnNa!2P0!D*X0&0lKHdhtSx2bw>`plw?~pl~6fg%FzY;pAgj z%P{et=D6pGL-XKi5xmVXJ>Jd4$?d6s#7T?eu^aymJ3B*N>mmnd2X<T(>+7-h6c-nP z0y|mq@qcYML05elpdD4d;2Fe@l&5};ghy43dsu^95MxI%{`LE%?&G%UtC%vg*EKEm z?(x+BRQv~$CNP_nDj&rNKyBloBk~Mu^%OFz@}%!{+#E;#$=Bm@^2ub*v3e5zn?Hjd z(&Qa$4g?D&k~{73WW^f8phmfBc7#g>`*?Tr6c-gHcZ~JW%<x=N$D|tLsxOa83AdlT zgkRqG-6g!5N|F-h((|6Igy&F@&LvEj63Vkgy0R+7hkid?+9;dE?G-iZ_!7mzZTcxu zIiet+y$8l-(k4h=xwB)7meyP`jJ61nc03arbIep8mAzvaigEV0p~E&<C#G?Kbb-_} zm)eXbI?*vN)oq%0;R~Mn+v25av)FX3k3S&uFjzqR&}&G|`{QEV!*;U%AReX-JtCOA zyVH-Y+|t5KU!@60i!q7&Xr{pQ1FrOAj@1zmL~{|RP}ax_g?@HU&DT-BORZ<v+%^}8 ztb?HFq1^H%zLOq2U!rT-BR!0VKA2@IS;*3Jy+G1-5|d&)bd*V&+(v)B<sQa`EyU2g zl<+}5?yU<ExlNA@8QvbQ>g5WZU1RWKU8++aKyIvj&>E*|9*_Mn+LY|N*2^#`^T@Xf zB)$!U*D_vmcvObX;C}mDo^jRk1J<oE!2_|ZFgX6e;MsmZR+;#%1FM3C)kkj3{n%N| zXgl4HorBfM?#K2Sbi(~u9@OE&SMN4xA@^e|L#bFl1f^i+e(Y*O>ie<R8Cxs6-Qz3l zHQPtrySN|Q=?<9Ib(LVnhJrW$O6n8^S8IUj<Ja6xiI&R&ew5DJ_rI{ROT<|xx&LKu z{EFJDiO$gdFS+qM46DBk6y{?kvJN(2?!o1@jZB8j<u;fn$@&8sW(s^0z_5=g<DJAs z8GBm`Lk`wgD??>7%S?SQ43$GU_Pn#>-Crk~in#piKbWzunb{=TrZUz&A9&8%FPF<E zpy7PY>ns0Z&$7C_>-X*YhR#_kO!Zy*hQ6e|ev7`LtOD5gW=h3M##5KIQ6vh(tsAkh zB~LNh?L@^rGCg}8p{<K|A#8m^`?&_(u5W16!|-~2(#@;!lfKiN(m~(QCOl?;yS||{ zcnRqn+W9^84eeMF%Jx*yuJsM=Y#vOurMRMQK<3c9&^d6NzM(8s9tHIc9ikU&*EbYY zO(6P){(?&<eM67l9J8MDNA3EC(1IU_f|CYL=udJyTHAdyuC8rXq?=k{_SP2TsFg9y z<=@S;*il<Z&g2;A&4`@@j<exsw*B92xWR_CWI+@V4VJ9@`xOvHXV>iduPPuKTq|^Z z&Wf|>SO3POqm$Yo|3JF;jtYo&eX9bZH*0isT`C|7h13d&rf?Fbg94%_Xw_6cW6p63 zh%WhmO##u%v@7WO?^HlEL8{xTLN2BW#z@Z)iCz>gto@f15NY;l87Z;qSlSg3U1Agv z0YVChz)?VS$^U;85Y@2NM-RMN#8}aY2#!}kgiZXXt5^UF@j5CXsvQL%{I?Vk{h4Ta ze@@5Kl>(x5+I>Jr_Y)Klop*={gVBpa&-Op6fM_Li6^}n_qfF{DWLlipK>^Vpkx9U7 zCs9D;mTAtvrhsTUlRVuTzK;T;R8kkuwgRHVZccliTmezI@hxOLxdNhFj)VwJp*6E` zD0;W`<!qf)Pyvx1+uSnU4rw47dl6d_>(0;`h|Xnl%7EjIWeAE!?HP3Vc7;S|%`y|$ zZ&OG#9)&jxyd(J=R7kX5wA=J(sjI%QjPufgr^Oi8%!aur!bxZrksye(xfo=fQ9y)J zqCV9(h)yC|v`7F)vy71FBocd664~~sBpNC9MJUu0Sn8-fU0}JR_7s7rB<d*;l|<bH zqLN7N9EkRu{Nq&;ox@<-l}e&>&=G6s_?;?=0uO|0rFj*pKm)CkNcW%!rnE{TIsDFJ ze!>Lq=1L5mRT5pJJ=iLVrUs)yC6VqpX;)e$QJOf^oLnVQvI+PtDv1swU?7H==8p^# z*?h<#Va=}#0@0(J_ZzG5=G`DdwJuc>nbH`QM8C$P<wA&S&m3Ry+A4`|Jlydvfhd09 z@UUojN@G4Spb!0*-1A7ZqIB5q%=<meE>S~^4_T95B+Auf20we4K1-Y?-jV6QcD79D zwNj#3g0^rUnBxrFnRL$oIdO0wLM{k&R7xakxwPZ9bIhLYcdWT?rX(zVtRkSTq2g9@ z$(n0%`uKO*JE~fAoK7MOtFG2u+={g}B24I@lc<;0s~glwM7Q74*ZPJthW0wPmr2=U zRwQvkE0!b!tgrAQIeM|(>s(Nwn-s6py36bl1fp7Rl<=<^RkFQ*jDOJ{3kl<S%_YWG z8QanuL!{`I#UflPLp;gjExi2ZLA3=NVYW_-nlF#};;qX<d1#pkNk*o}H~tio@IV== zHj~}}KmKZ&)QICrcMQ+JWVH0M9HHRW25xO2GY{?0C5z4#r>!s~1Htn7*Aki8YD*PW zv*`SFJoc$$&6+St<XP)4Tv_7r+vLTFjq8ULkTk5~Jy+8mCs~4|h~X#V52h+KuP4-E z?C^R*Zp45$S|W1%Z}M_N+TfKJv12dlI3?hfIu<+1+>TLZ93SQAZ;z5k3LY2I5@oa< z<!CW{b)U&4FEH%0KEePD=JM|t{g%At$vd9e5yRg&oFx+KI*A7X>R=iBoG8zG!L=m{ zJL|<H5%@_jzeR2yH;cy$kkYNVSWe6j=7EQ$=ofT|4tO4^h;}^6Zf6539$I>GA&soP zYBeGE_U~pN$op5Mx`AiX3B7EW<FTD=zZFiA<0QxGro>R^XAw_H-RPDiPvIq4Hyo>z z*DaPZGDVlvv2_}a${>9!{8h4N{q-~{Ioo|A64{$4h18EZm+2GWTnyK`wEXeer4#^m z*c0ZtAbtkfM>fu0udVN)BEeI)l*79D&YAXmW{7Kz9%wn?%DS$%oL%YZMk&G&*#wD1 zBsR!w$>htH%mRIzNu;lG@SNA#nMNVX-*1hcCL*S*o3bt_?BhF=6)`tiAEh7>?zG}I zt#r4wX5((C`HkK$YWaiXQ3pdxlhuTsEaT{XC}3`r+g~TQQCu}&hOJ0-rGL6?n5Y4v z0Nfb)X#*mG$GhW`jy-sw|C7NcAYzJMp2AfU*puE`d6qkEewf$k*A|iqN9}oxX(SPR z*uMEJ%+`)_={U|I&J%Jf%k^;lh``Y30MdD2gOy{>yL1-(T%MJC1%6LtAgP#~P!xTT zq2)gI8Mz?VT+Ps;`;rU@EZk;wn=08r-0yZgiYlbF8RU2(qSY&gsA_INqFLHL?4KGu z>|e7ZgWkj5w+zO^CBP>%AN=bvnZB(nz0;>yTfUZe|KNSpo%y1;%iTfI^moZ@9FN&D z8^>cJvte@n{bV+ry9mjE<PeY+;e8+7)tQ{&AX670$L*lJ`ZUrN-Tlamd`Y6cy3f`L z)UOsN{Y~FdLxJ_)@1ek2s<yK{$;o<->-J5N!gWyxive1m)X4H&8j99mz0_03s-Ql1 zy-{C{%AUb_@Jj_-J2EBFI;>^KNAB~N@wu%}FM}7;7U~HpE1E4vrZf}_duH%(nYf8e zX_IbF8|~&KOge|<ChrMWOWS=8RRt+r$IJ46mBsx)L^4boGD>)l(@{GJf5>GT5I@yl zc7?nCnnBrU+RCZRs+I>u+Gto1@|hCXu<ca-k|d<i?~FHgjz@E1nobbWY(qrDuE}5V z1TV*hxwbVUrQu08S}#(XPb5PB9v*#j)K0dgGP&4^l%~x#-)qD5Hq5f&P$R8blV@jY zYY{cbrO+SuVtD0I6R53KMen8YXjRcuHG-;Wx$~n{ML(#K>5kfM1l8)IZzOC@+m+ra zT3z%8?T)%=*)(&bY{UK32z-hn*fK5|i+Jepjtn+f7#Wz~9g1<(9H!Pwn48WC9^1-k zPQukzGo8aMHBY7n7X)=pr|K9baF41}&^zs}FMs(CxxnWZjnnJ}wA|u$Je7u~N|_G2 z<yFhmMpa5BJ!kcO#jH;JZOwC~6FRa(>z<Ct>hUfwb9>M}%@D<t1a7q5@8q%tX=l~G z>!_VhY2Y5}pB?$r-o8#^6ZOwO>W6oC+9{6O1Q5rgXup}c-YTHE8_^CbYj&EwDtCHd z*(=Q-$eg%CqOgWmrtSJG2|xwbNxCG#l)dBFT`gjPwcfpU#^B<d!fNS?xs$tIM%p4; zL!(tCYbX&UUEf2(mbFBd)MYiIqPj85|4s99QrwlbR!5%|(Xw?u>1<Kd8P7MfO1-+# z-zsWKMRT?5DXK@w_L!&nSGrcwWG%CN9VmU<id|bv@c_eUHOE?`^$skymfN;>0Y$5I zf!1pMdkN{Yo!%6G$cZKNnlFgF-u0&z4<t1u7pnfGLK3GMWo8){*vA2t1W|k45YD<4 zwb$FxgGlW*|DNf6P^a~WMyIvWXASi#o|K|x)t8Eb+v}H=)HF<Guq_)rNAz0@d9P`? zHmKnG(DhTbZ+DOPc^kxNZPj$Qy0Z+`6m`^ALlTCSjI8=AiSk_$I7OrJI-1?7GNEbn zdXXSPN~7^wN9g)%DlRM<g37O(coWjrdQGqT_@TH;ZVT;<k@))Q6s1iB6<`lA3b2#3 zT?Yl&?H)U7!Tt~}*iBjsHnASB1-m;BZyaH#YRWM=lUN}~DC>W<k4&FL3AVFKCD;+J z2wMyGOF2ZtM(P@gLzsjb32diE+-u&4|LMYMrQO|W!yL5{(w_%7oVd%qc3ATlGzVW| zi95a7H^HSFdGpVy!}K=SQ+Gos$CNgS4YltphPJE0{)X)(`fL#_IBFN*T}z^58`aZ- zl1jw(T%U}e59@_mD&nYbj6Up!K++e;M`W;&<6EizT<-hs153e*`3^@)UJ^cciZ1M< zwk~X*S2l{S&mq!4(!)A}nd|8`0*$%_=n@3AVSlqoJpH(%C*3b)q@`<>*dH>9Wsdlq zb<cjyOwun!nZ8hZ#pVybq9-`KBh2gA!eUZ4{W;BF8Ov~QZ+*p17<Nwm(znTJPD^)+ zo};a$I=O4kJ;khHN8H1X5KT}UwtqK;Ll=p4AL1FhjV&Qz)SM2&s5fyWP>i=fe<OWK z+S68HT08UtJji3yjBtS!1t>j4X|;4hrsK(B@6>ce%*}b%;-8=E66y=xD~5=qVyPTL z$k)d*tV1livm?Hd_H=mV<2u_dBQ)SHxeTK%XNEGWlYdoK&y?J0oh#YkoD81Uyts6( zWY&9y$*i+IvwtB0&6;?1{Y4xk0C5`LnNEiwf~ovTtRdhYe8~XLa4p_UfaY`Yq~kE= z7Ew_2Oif$1H?O8`fj4t&8L^_rBYEp=keaq7jx~vdpe=vcqd6L^#C1W8b_;2${xGij zW7-K_LqhX=AdE20a^Fb8I7(bKY3KQP7`0|;xY2qYsqLE|#fLbKwH=M-YjOPC(R>Gv zTV%*4HHPbTVw4Wq7)8Cu7U_wNQF^B>()-qX-ZeIJv8i`CjbR!FFeVfpFc~OWg-~(k zC=F9hIykMZ-WvRcu7u_n=+4R7H|O}6327DAy1=?ylJ+a3$WhYsA7j+?=*I}PT<NiA zY*p8u<^wpp{93N$X?{*;RpJ|N>$>g`pDki~Kmye4Me8;EFkA1)(it1&*TfrCeqAlz zs4y35L@%ysJJUO6tF$R9?98n)`vB>q**krksiav%8q+dWqHdYQ->{Ypp?@@b_G<Qq zw~Tey&0H%qDU&}z#n<ncl9@?Gg0K=iq#xUrX`+r;ripr1xTa00##*l%v$km8c!ZjI zhMBw3UViwW_W0{%dMiuMsS~BKZWx@(w1?eznFe><jkkRBLNnHI(5_~z9MAisITzP) z-Y;{0j_9#4o}V7Sy%u4}Tokq<nAiu-Mz&}#WiMMan6h~K0&&+x(E(q2&G^f%L}86@ z2n9F=B~(2)McHpFtvt{Yx0QkgTB5en=s3}^D_P=^kaYt%OUFk29`<o<nbF@tYn&Zk zXzX%t+2mI%Un8H_rN{S|e3t5m#zzd*`TSaI6$y~f*Cn6d@Cu)7s%Mei<N!53{?}JX zc87MzZvQT_JNCsu(kUjx-%!-J2xL6uxNm!ohj*1@#7wrnjueqIC0X5!FYE95!J@Ws z#B}NC^!WT5vVOLw5ak5%W#Gr_a6#U*?XWw6oHKMqCLld~f*7EXbz3MVYY?cGo{8|O z3mJp!a$Tu~oQ!=}4k4llDx8!;QoeET>k+nQ+1NPc8&^N2yETE4biFa3%3^tJg8feX zcEmCqMSt<kuLAC|app<+-m4hJdBN{ef86`{?U%rQ4Bq6-fE+z%%t30oY;cAMD?B2A zbD@nEzSAYXVRcs}CYl7UQVlsOGQ*SH2goo@>3!ait-nT8_ugHtH8Mr}cj_(?o9oHh zdJde{NA)HdI-J2Zfec5zpWZ8{@W^EUfL0M^)P72HmsC<Yq}J+*Qav!HA8^#{!TxY& z49^Pw9<1g@h;xxCvQr|~7K1q6A0*Cw<QCya4|n~7FquH6v_u3lZ6bZVQrh-MKBnK7 zLZJS5m8j8@qRqWAGqt625Kj|!;^e6t%X@NHuHs?5VPtg6-Tsk}TX*?KdXBVkq=ssY z%tjcq&6<!C(d6H?ttkrCL0X*{Px;ntM~M1@6#P`eHxH!Qxzpcwtht491a>vcje^Hz zRH~o6+uUWPt4x&zQ<bOiRZ=}v%@nCFvau#=8yH7H;u^WJZwRxk>eQVXB1}!)nbAGA zCO?j5(J)&E-_({@w*4bYrbxU=Vk^6`wcK#lrC}#h(=a51S1~bTg63w5`492D6?!Y{ z`4!ABC=fi8FFa!eT(C=qIk#@kMl&%-a>FTJBQ?uMH!AvqjmXSrL}nr_3m=3w)aG@> zE2fB=?g1|ULxh!!ldL&cw;vq0<}ki*Z(*@ClXXpQll9rfMtbI|xv`IOtobuBpj;|# zD`FUt!z`XGNB?_?GMIRz7;+5b1*`8GBnI7x)kv?buZgsJd7JVpkq?BVT+&%r6AeYm z*XN~(37Q9dXIpy+Q9t(#j`7R_LqiiXGTBz@5W0CLW=<`NJa1P749x49Z4Bs1+FMpo zrq>*Wxu!UUA@fqi;91D#WYa)vK+37lN(&x%h3+_^p9XzQy@YGMy=#`IP~x!?ABp^i zbKSq<URk0{U2br!>96fiD0_djfmpF*TA%Bu06)9R6y8yL4@|~{DwMO^#9Z^C&J5kx z2yH||QK-LKfK0Rksrgc;evppW>g8oTR^<M-<+*xpYM@<cx3!kG$Gl$7R%#x}M+Xjc zZWN(&nRG?3d!3YL00mFcDm-@j|AvYgTT#z6O54(R*a59&tlo3X;n}A3j?)jgIpU|U z;*`k|zfM}$%{ZCN(4Nro3^@w*$A0AhD#!n+|4mqpj{ch~L*wo`(B`kGsvQ3y)W{l@ zxsM~GK~AyPI+QM~X6d!cv*Ibe$w){_E?5xm@t@nefH{_*Cwy<)<w-yH15Cd1vFs9k z%$-xwd)sm)Cp=>idSB4f_eG!~q|1KkVxbSsg3b-qAN8K@)|-e{sR|lHgSWqD*e5cz zU4wi_R3ft_&%nZ6iw2)H_9IW-D7tE-X6If<f}|5X5*0NSGi;wNak#Dfe?yFQQDyUJ zxrH00Jzsylb?dJM@m5%0UJ;~$-qH#2ef!-p&I__k@J2G2z9mVYS?`IlF81k2|ADwc zQlZ7CKnF`35Br>2Gqu&vczV(Hbf@vOU5x&ZrFGuy@psD|_MyjrEPMYq@<?h$ZXs8a z8@yRh3h8r2cYUK&z}P$4u-QZ6{Y26~@q%#+9JRl}2WT89+hDX+p^m8b_c5BCd$pu8 z?3mp8I`S6d4%64Qa)U4Df`v3ih8UDPvF6G7LRn{BDE)oFTat4@*%!)t8Y9{lL>0yv zWVy>)C)1z6PVMNk=yZchRz-tvqod|liOV1VVF|OkE!32<{vhS16gRe1l9QKkuyfMP z78JMlioQ^}bt79io6j+}uL;4^R^dn9s=p*WeV5~AFRd+ylUyRHlHb6b^ae+b?AaQ= zp&QFF2{5^rmRYzjr*80W$hSL&XsPM~QgmOyE{E4A#9Q~PK;X%6$z^?9H`b2f?DYxP zk;9qd{sY`|r90=b?>^nE=;gv1zNsQ^uP~OE(3hX%iFkz!XFIa~7D#%kryf3gvR!CB zHY?bjO0#|~%@C89-q>@&K$g(fcGovDuic{+EpoAws&-nHm$O|f-tINtnty?(PIpi; z<N}J;1?6=4zvPIjbrjE%wG`P2aMdo0IL$W@R!R~(XUCm^Gk40>Dhe5;cTc+7BcKn- zlkS5NSSxMw?{{sDgiw;rJ<X!pjlKlRbfx!O&uBgV55@*W=kX<B{!gt{Z<}sH_5$;; z3ukTnf^{vnvhnO4@1f%v#yy$W9Y5MeDuJX;45zNAL}g3;EI4jAr<emtcgvhccQ(G! z)|Jr6T(hyJfckOivfp#Eptu@M$B(OOrgJY?e<ywf=WhS@?DV%h{=a28a(7{U_g;n^ zvJ&UH-Q;9N|CZOSBx0^fi}LlbT4qXea`N57+XeE5%?s8~bXLF7;&R&KZkc8u!PGMI z`l}%nk>ly6CR0fBW(yX7U^#*3K+*;-C>=TA>Ce5$x47l#sX<sY#9AFn$oe@bg9PvY z5UFhYB52h|Du`TOf_=d{I~4g5_?_8;06o{tDdgbeX>Tu)zCu4MnQcES$%TaHCa!ab zrEwZ^PFPHMgKO2hPzI6vlZ~$ZU!mzJgWFZJf!KOQ^AV~gyeR_1mDec{ZJnNp)j44? z)yy@YL(`#3TZLJrg|(!1vR|$3!&{Q^6&ACyB_ZfeCa_7XMgg)fTI&er5yB$}`!@_x z4GN{XWI`%5hDkQ#ZHf#_eXWui!7kbQY&w^oPEim$)*tmWQi{4TC@xC}bKmscZ4d$$ zkKHPstV0+NM@^kWA$WC9v;E^t?=xKWo^b0iw$QXHVk@^)+L@hRKkG1w*c&D_prO@? z){_|jL;-s=C~4S{!X*C_`Zv}CdKhjVBhl<FVU~v!m&t-ZzUeAq92QY=RyG|DHZK^P z0Hv4xv6dm`<h}@bxO^c38l6kt0ip6K$ZL+rkj9dls6!0)1!aSigO7PI!C?QLHLsP% z)h++@WK{GWetI?9U{iG|*!fT#D{$)6n$wtk9e$d31+8A%^$ek8)7Ze_r^CGc>TZlV z{B#0x7A*C#gLjT`>Y#3VvOhB!x0<F;YIcX$WhVbtMDo5-){oB@+BBd&<bb!QwaS?C zG5LDHqch*qy(X>rIqQqR2LeYjS;ES$iwrvcVIKeVgkjevp!Sg0u_OGMgV7eoyB%vj zTG7w#e}?d-jTEP?Wme6zPO{K^5q%G@iJ`Lj*fH<vau*k&W_{8TFU8}m2}e$}LduA^ zr(2>~jQ)5g1$A-ltgm!A`r6seZ%TGWVe5y|S~yohC+=(+@K-8^kzmGPA|+`oS?XCI z?33ivzj3U265j}0^z1%E)Twtkf8M^nlirW@BHQ14yg63N&l#LdydJjrTdm$>B}qNR zjP%rBj%Ih}j=QY~7HcB$bil5bWWx#VgMu}WomqK^#Po0onP3C0vR-%<LlFu(`NM=+ z&j{td2Ng;Lk5i%yH<L)F$nQl{y1J;#kr)u%6MPdTK1*A0!XQo<)Z2}9T{rC|WqV-A zQqaJV8}wf}>J00l`;SzebnwjV^Q;T0?)60IL|vhFq4468Z#iw3)Q&D&$%V4+z0L#* zIoZ*rS}o^wiq5z|yZ!zc>y}@1;ks3NWow!pWhfsKP+w-Y&hOGmhZ@kqNy^q<I1}_} zMHdOy{I!}CSs0ng+<~tA=pBCRuU$EL3UkRD^Yo<EFs;Ym=UL0uq0~AX$K{09qO8g; zqw>f9ak`9`w=*~&R|`^lsh+DoX)k~sbBFrlJ%Uwf$le+pw{7$DuX8=tEJyR}SQeHQ zHOt4LvDs6|9bT>fmGyNkn}Hox#zy~ZtkwLnN%6S4ty!M0w6clcGmAeVqt>4ME^Pg| z8P*0nvg2!&9#L5ZUBzT18<RRX=|YE!Y?kR~b#RxO{J;BG?Gy%3>PI%*Xv06+aJLN) z+VEo=Mh-IJoHo43hSO}gz=pLp{DlqwXu~IM_<{}Jw_%$Nm&rRr{C;4=;j;71FU^K- z8_uzz*M>LQ@OB$MV8h)ueBXv&*|6uCCf*bqUSz|`HmtPaY8&2a!%a4P)P_53*l5Fp zHhkZPZ8q#S*reCThNs(bqz&CR%(LM<8!ootY8&2W!@F$wunqUx@MRkwvSF(Y!-tsk z2iWjD8|K(>o(-4T@Mas{Wy2?I_^b^N+R(CLn+;>_dOO{QBW;*r!z*pL)`q%r`P0X) zm!SD%@FJ%ueV6y74XpURZC+zw=Ww$>F!lomb?x5K|K@97zEaFGwC3`)azV2-!qBZL zGfbyj?KZGb6{;%y%v3YfBsD^=HtJu{JX)Qna#WUWEB-E1*(y^_QEqMPQ66=nTFAc( ziAQ2GzanM+4OdR`VE#F^o!DG&|C9XXs!`g0l(v)5dDzL%WkbQ;s+gP>lg>Q;R*IGW zU8c&_;x6o`;M<E^(D!uwRAAFN2AA@w`FvHl$!{`v89535#Jq@5!Jms*Dpe_d%r93J zU@lb1PV{dQe&=E1)Ak+XDIlJ9TT>ndH6{NFdP;s#Q>XJOWtV&f^J5@;%TT01=g#EA zn1vc9UGXRBNIV6^=OZUYb_gu_P13n<x0^xE#aC4)f3wI(kuLf1E;I05+`)G)`Crr_ z>~!3ZH%mT(=_<HP(o@RBFJ_5P$|3Pcz9l>(zvse*3oon+F;o%1;m%xsPC>5chcCkA zjw&h|Wej<+jmxl(au*jCFPv8#VwB6u7awPyQs^xg=jp{2-k^iaH{Vx9W+(f~bmWtL zi*&`iDk@8*zH<vI3q$o>Jg?GMP#LP=$pwqFk#rSlDdLy76>&;@e2WNwy&^7&M@=f8 zrwF5_7kGV@ML6)AR9R|c&}D(IvMOYPUd2U=iaS`$@EKEX`6BIWy3d9MUWrG-OBjVe zg&&2xB%#8>BO;@^MaOiH?GYE>(~*$at9PHIQ~D<NJGK9S(@r1g9CXH+gNK|oH0A7b zh7BJva#ZT*F=NM_d*1nJ7hITr(fEreWVj|~y0a!-;>n(TX-@8CQ}U)xn?3_^>Fg`6 zylT$X*UZf?m{(X-Trz(_=?|_gTezsa;=0NzuW#{^rPtqZ<Fe%|R;tYM%B-cO-n`24 z!eXi2h44}#bzcb=6swVNQkiaB(t;MjIi>h0rpJ&rU#a~$bvfdd%yWc)a%el#`Pb1; z&{g;;n>KdINnE90nF8;*w6CsWm`4AXs>bq9;v7LdE^=l15$R8yeC7O=9z^n)t5eJY zlTsCFyAqxAh1%}|N>l|_z+VX={h9PP(l<&wETz=*F)h;Vw^a9S9pe)BQqnBNy^Oy% z*#4yT#Ol^%;un8KxEE@7X|a-~lhmYNapJOwzt@vTNmbk`_$M)%5T&>*qCT8ZMoMX7 zU5KspluqsQTJmr5?xj^r>7^E{h_OujDOV-fNqkbL!IDY;)J~@nnobKzTl!S#bDS!L z5up%Mr8*l^3Gpq$EM=BFiH&fA&{IluBBd7TJPHSyF+j>E9M&<UTjxo7Q_0szUAw|h z!TKH(s_#XFl@b@@PpCDYvN}njg0M0oNvtOJGN37~*h;*{Wg$L;xo_u8Nv%D-(V_IZ z<}Zou_<EN#f^^R$-!m{v{YV`c7ei^GndEcizlA@7<q6U)HB^pZo`Ur2ssu$Lx*KW) z=`n_RNU*(0?HA})V#+10t*f}4ng@lCgL!JF?-+G{D868RzF&PVA+4@c?7B`39mddW z1oQv>)037ZZT7#C-npUlD&SGW1B;2Pk~n47Q3lmcY)Qek*-o)w{>O#l`~LZ#OU`Ak zw3Kwcv|*u8&?Fogti|@!g7rOGT@XsItNJddR;9j7PblrXT=y2zYZlW-O0QL{V+it5 z5SsFg?!-@$D~VD12h-<B|0TTB)ff<rtDT=lci<<<?}_m(gzC}@3MCfk`Y6zSo9QF2 zJ!v|@{Qg(?=lGOljwdwlNbPodx3^QN73np+^t;mEE+CAI7BX`V(%kgmLaF0p3&xk) zq5i%<zewzcM}==>oR<;*_!JC1QajY&_m5v@<}$Yr#$44Y?)LgjRqg$K3H4U4X(zpm zjFlCb1(#7kMmHHL4aH>iF{6VCBiwjAjbsfbzYJy8Te8z9zovj$$BE=we$}?w%xaWM zwasku=wIV8<DcDn{j0Fey==47Hutv84c{359Bk6RJlovQHY?kFs%>6>)cEgjo1M0q zldSsJ__c9A-8Qea%>!+716w0u;7;3|XPXDv=KMC}zSK5n*yi8_+G(3_u-%nyma~KM zYdd1X%P|f49k9*0y6ww+K>CCdT}PK=C-r1{y-YQXe@;e7X{pj8&5SY!Ojc^bB_<cK z_MB4UAF2QGZZUN&vCr2&WzHd^k%>X#yH<0+68@q<jbG<fvIuA9t%Ha?mbGoi*e(pw zD}@-O$0(x>$}eS+udECdv2r&Rrr7L@=%%`bCq!mtWkt#F+*INckIuBb+0ilT{M6K0 zdB~5QPR(L5`3v&-DYdj>DZdze@G@ge3?PPoV*Jk!3OG;rmqI^i{+;M{qK$`|`L=(x z>coG?`(LHn|AndV_pf6Nt5y5IaAZE;=U*_q^FKUrLjB7K_&>}6VXH#_j2is!{u``8 zfvdyX|AmKrzkk8-Cvx<^YV%z!KvL?%zhH`DYR407#sA-3V&kK;|L<4Yc3%mq9XD7Q zy=(igde!Qh+BG-*aBbZ>|IPJ3`tkZ(ZvDw^KmFOyZ@=RgzufSvJAb|LH+S8A&%O8E zzv;KX`~3rd_~V~8KltZ|9)9G}$F^*J{4Y=Z^~t9iwmrRl$1^*3?cVe3b9<kEVPE6^ z7hih$Z?C+1;I)IVzwzeZ-)egMop%qt_x?Yu<_}sv{OIFPT0i~gXP<v@_(<EAUwwTP zRowq=0nNz;FyBi+^S@pG|Lyeu+w}h~0olpjwSeq@yZlk?cgktq;O{ida<(b><ILP~ z=6cK>=Mq2aWd3m{^ZHI^&MO}m{?<<BpL8-m9Dcn2M>?4!$f(Sz8~Eb*E-4Pm8fTR* zDk@(x-CN)-MIMU%%&OwbDf50%T<FbSR8n5KP&>>bjQnuVDX8+g3caO^i}T7Wd=(*k zV`rjMxkxb!<`+*aUur_mME;k>EO0C<ijhbcQ3Y!P+JC!MSKm~<s+tL1#7)&Vt*-79 z6~&Bh&6+h3J~g#EuX-)Bvy`D}d9$jSuQ931%UerOXG-<jYC<Wdbqf|Oh>3|_T2Zm2 zqT+=4ob1e8#wYtXgYiG9z*|t}EUv69uXL6!a+VeN78NciuDsAWL=<PCX_Gmy{3aEY zmK7H{z2(mGisD7i;-$rfK5xOiGA#hdedZ!Dh<gcibQUaf7F6J|h%h1*he#uJJnjA} ziwlaJC6(n131Ol+bCB%qxX76Y8qEfB2}g%Q=3YLJ{DrE)d7ZDg^7_(6^PMF+V<)&* z6??rMoK=;#h~gFbD#}U=bwvgP+VSIF?(?491MU#%<nHa|Dx_fEVrPYsU^{(Pl8vE5 z%BqG+Qtfn{U+jg9rCw)Yc~P;myd)UHWN0KS#ie|~-zaAPRn*2P>O<C=qx5Q6c7~4s zWi73MVNFe$njrp#3k#?dYD2OD8HSFe{)P%xwV-%j0hVQ@i;Ai9G9>QicS1Z%7L<C6 zt11c#i=71}-r`E<&{4js%2D%57mX@jw0LMRa627z>g{|Yso}A-vV76P;ziz||Mql> zD;Jh7qH4$uRRJ@NxXxD&A*u5Y?DnmhChIdgL}S7)DfKRps;%-CRO;COrD)shOP9x{ z7w3aI(;1TJ{F`>vk*=Dc9sL&->niW)$7Yk6GbW8NJFFf3>y(F{In-HTmqNIuV`x%1 z(f^>Kkglw(e2L~iLU*d}lhpI^HP$JWF48HeobQtgt#YOmFQ#WGEpZkvtnglc_IIZ@ z4_2}}jRG=CyDSbdt1zT<Ve!IpdkgIhHH5Wql{$m@xWSy@o$Xj(Pj^rM)8Jpc`SFOK zT>6vWW<C<T?WdQ}b*jt@=SY8EHRp1e?D{$EFG<H<HK(d{VMST-++e>qr>L~bJI8z8 zxRDh_rsFeYI_Y1T947XTQN4@eRPS*;RPSky#`uOF6>p3&`|B?vF!_RS{RbwBufTgE zGzpsfjfg*Y;0}lC@9nAj7R3`soN|nft?bqm*%;0O-kVRqPtdT~NEJH{2|;DIim)DG zst36X>l3T`jB}_yV-i|>HpMl@HpEm!=Xc9X>=�?dYNUd4WaURX_A__M4W}D0!0n z7SR(e=lh+Vr^EqKYQV(ghEpn%^81ij&>v^w)H{5^yoQ|?r%v<sP^T5es?%n4SEmv0 zX=C~|^=(XQNOVLh$GB+a7-Pz==`viY{(Nr*)9KSq^(l%W&(V@+O(XGl?g;kT_=5hz z9Nm<oh`7c9iSOIW6HfSShL$G29d<e&gGY>NH+Pk{cX9uSFPLU`P2cV+c3QVkzP3P% zS)-Nul6VD%p~E{aEK!9y<CL=~Q8{NMDCfAI%2_#}_0*>1##0*lRD=zPQv-?|YQT)1 zY5;XPU|MqPDNTJEdo?6fB<gZ?r(7}0F|D0Wubj^@OPc)yEfj`dzmd?kXb1G&u1*Vk zQuS<ztLS0#LX$8vzcB6(M~D4V*Qd}>zJ8;+tJA%YsMCucR;Q19NSz+GStZ!vDhQXT z%NVU<$F!I6j0~l&=j$6xdti)87{~gnvYnrV2c=i~wtA5C*SeJ&m(?CuVz+SBZA^G- zke@#DF!#z<YK)zh$xpXXexxoR$9)H1uI=YFa1Je~g|^wW0~02(cO>m4TJ;{|&~+x^ z^DpJpJ6|yTufbp83x)3$sd|lzSG{iSkr$?U*5<JRv8LXr&jFR~br#I~lqpJG4K3HU zkO;qiBYLR*MN?J(8F{MzxGAcC*komD*|gaVG7~nShZ^8bh8Oz63#X_7VZBsRQ}4#a z2Hd2LdTE=qhki4nX`|g#zcEP-Vac&7nf8@T`$~pSlE-{I@0@;xQn&I2c}LfgH;#B| z|MVBM`&LO&$|3YQ$jP76uj273yBxp4d_LwQwmB>*MkRUqXn#rMDQQe%Lzt<@yu=gT z8iVxddo^=FzFr>+btqr|So*XCXhh!zP5a-f%aIor8KxrV;ohk&X!~B+_l=<+?5_IG z08+Po$Mmky@kyMTHgV9V2eg4k(+q9G26R^g?xLJciH(ki_=>pv9;va^Rifm9ez`yW za{n=XTMg|EuL!>$Ek}+^?5V*#Cv;N@-e~wAI3}(ktb4fXJ|-%)Uuq9Ea9oiZ7<Q#P zzNa;Hy&J-6+K>+PYBD20Y<`e7+g2#`8DA)!KJ<Y_Jyo9>@$`jps?V(n6`CG1V(A;` zALttr6T7KI%9uDtMw9lq9;#L9RlZMxdDd|eA3W5Dd`rI?rtKIT;GsU_aGPew4^KFV zQ{p%L7Z0DnE6`K(N+tZK`-m9bCc8^rO>7?z`u>Qf$d^aj0>cK!s=?#>slop|wKciv zl*T>{y($v(6Y?~_ObgF5?c0o5L0VkR0<oH}(#}8QU)DfxFX}0g`c6>2Gke||+Zxl< ztueA8IR4RX*!+@6{u7kr#U2%U+_d?tFZ|VeY|qNh;Zj549E9ts9Dk<VViy}O<x36g z8LoPciA}ZnTfFOj^klFzJ)YmB)P6pRQ($7>Sa_Floc^WnwBD^jP6(F0_;>ID-(T#q zo3`3vj2>e+H0b}8-z&A@0i|9G(&}`^jaz#(b#IJrh^mOpkH`y8mA+Z%)9<_<YRI_j zB8G&OM0CZYPUaoo#-nd<RjT*n?L2x?{=?4^z7YQ<(?`*VCBuKo@E`qE#kZw1a~HQw z_=0Vr-=G-PYlee9xu@z?sYkkeDU+@{X}|W|s6TU~{<IbP5yM}V;dZ;ck9N7C%XZlq zY4Z(vJAN)fzw4#nrH`}w-KHSTFMeIAxqLAnK~#RGj(XykwnF;-D%<Nw`qQi5P^y;i zOxu4X_`Pp3-?YtPN%W!cY|@{5R>bGW<(YOzd!vu<NBgwrW~SfAAAMSDucm}XLy6eD zlgznVWzH2A6|SPju_MquOm&w&wU^K`7Fq(wm>6`wy4t2gu>DukeujsuQ^V@a{1Q6# z8$w^}9S84@Rei%!RdBu`4JItEn~I~~h?{2Smth0r)Ie{d8d#J-zvxf{+sDhieq-X5 z)4PQE(PHLDKITX4iiTAvGfOo6Wd%YQoiF;9rqiVLm|wRuz+087aJJhyv0MMoppO$_ zwe9ym=erHf{&T+D(Bc1<^W6i(Iv!`N4?}L4Y2-0EtZ-+kVUg2|ML?EU;9W3Ft-#b# z+KAN4NFdcFm8s=Q_QA+mJQbzm@>N!{_zoVIjES06Q0kpjUOAmbe_62|b|F3&6<4yn z&MaS4RbEz{>8&iwVzJIy)>D+Ls;YGUB0Gi|<?TtT_az0%ekKyCU=r%oaBOqSi+p9p zlMvipR<Mv_sQV+PibSr1q_jPv(uiDNnYVP}_1@wc<+DnQiZd4!RH~oaB?|d-DRr&H zJ>6U6L0%;?!5A@%oHa`Xlt=@GJ{<~S{8g$CmD`r=7283lsm!wSs-Wr8tZA2J<%}IO zvZ$;K8AjN2Zzcb;$@g?m&Ma46wsv?m+*4doF{!eclwZ=gOT-fDpDJq+;+@ROQZK^8 zvgrs8L`1C8BXWuh78jpjUtvm7Ngd3%zCx&TbEkTDsTU%HlB#yfz7sif(E?raqO7Hb z96Tl!NKDd7JtQSRsdIQlc9pw$o^SsA;>x_r;wq`yvm&Q?%Pudi^!f_QW-dYsRHW2E zvCAnhzt&eV2|=$UK+#0Rk}NKn1r?k&7B2A?FZHS+VrPP8EmbYy*^3}RL0Rbyor~;R zR5ZP!bWvuxk90qVS|Z=dD=!tQspsUZbqDk7nzG09IkE_$+2sgmG-dy${TPnth=QhG zp754hB)BUxPpOL~#FVUD!Q&|Z<>ahLb1L$7b!FJ3vMPzPpo|mFSBZ%vjp+(8>1wVP zs&?S7=X6S@P0d&!66$QIHe37~R!}*Ts<Z`HQ4xejUV6INnD$_JkNO@LH4A3Z?L#e- zG>nTOkornek+vh;p?)CY*><3!Dx`?B)QeE8teDo?iQyU|r<WCTW_(mcPG)XF1sn{A zk=pi%Y2;KQWPFv>1Pzj3%@32JX0?l6O}MIA>TStKR}QLQdzmCIY2&m`XH>B9&L|JH zX!Tpu^7D!-wRC<_A^Za$Q1ic#SZ0(KUTc?oR|o3a-3jEa*5$vxievUON=c_mQwB`^ z*zO_3VwQ46<dhc_<&@5=<XAnWKB#$QTCu5^jXG|-dxInX+`&xcK$)wlMPJndiEN^; zqy$z|>NcTPhyJFB^XCgI3Mz|3v@I4N9cXlUL1n23EoZ3$<5D!GM50t`s+7Ynmh>a6 zn+&JZUbyRQIKu9`$o_wR|05Kr&Nt`kf{6vq$L;DT1YJ)KWv*{#7AN=9(M9~r_n+T? zDDWQ&{MRWEY;$AodTYcT!<2gdYUhh3FN@L#^Aq<|_=4?C_V)#6Nvo3iqWI$ZI47z1 z{iA_#d@(lcZo^ohxb@%*x=FkeR-l7V;+3vK?Btv+;!6FA{UAQEKbKF;F58@Gn;DXH zm}$2CbQ{V@An_x@)oC+5)$uF@I{6qz6x&7Y{F?krImCZ8pX7O!4OauDEH!-MUdt!> z;rxU?F?y$M{tZy_cMqSG^?p9__ZXj)=><M<f0a+%lOc-GD@ZfYf8#IVq(76W^Q6Cj zW2XKGqdxiJER%_o9}fB-%;dj0sgtsRJxZUH1)TrpjQ#IK|Nl5k<eh8gUt!^q(ygj{ z=%DjgU%z^gP0jn>GRSZ4HE`9hn~n;Wv7%bTP59q-_rbfJ#`%Q5tBx6~3>!Z3J^j0E z|BvE--(839I#s=Qmvt8#VV!=V_*eW!hnUKMGWFm!2c2r}!5<tP)5$me@k<B(-t?tX zqgR-asJ#hfcJP&A-%A*5L#GV~*f80KeQcOu!x$SX8@3%b_Z=)79<bqF8#dVR2^(&) z;lnoEY{Lg^xXFh1*l?o_H`wrY8{THa^)_5<!=*MXvtf}9gYnO?%`<G6W5Wy^rr9vX zhRHTeuwk4Hl?|;gO!*JkusZ{OSO+>c+V;C`*kHpgHr#B(O*Y(U!}T_-wqb=0XWKBt zhN(78wqb$|V{E8w*!H=}XR8e@8#dYSfDIdMxZ8#eHr!&vO*UL_!)hB=*f1D>zHQF4 zVTKJ;Y?y3AWkc&TlfO4?__7TfY<Rm3t8Lhk#vRE0e;lp7@c4CG=LG(@-GvU{MvILT zyUu?`q_J;|F)%OI!1Z={^Tr!9-G-jyy1N;3u>4{#ziOHM{TqLs%huW4IqA;soz4HM z|9>_7zdQcU`RQ!#oc@2z|8G*@yY88Uclt%xzhG$(gq!xd+lImRKGAN+Bk?F-uzy%@ z_Y-B)O}PIqTxtJqv*WF><Na5m@VDf%GoL^34>Ml;pMtX1l%LF#<fkr;k|pl{xgV>B zO1@<FnK>?^UgvwbcbIwu_yP;~8Q3=hxAx`?BKQ-)p?#16fTsX+_-+Rmcrgp>6z~k- zaD)q+PYKg7zCY`9>=S^e@`?Xc;1s_6USTQ^ID$od5qK)FhHvnxVd@^>+kAb%4*`d8 znL_MSfO~9wFYuky$$vlm0GACk@e3T|G-bI6IAD+oD=?E!^56#EZ`*GIzGmY^XOOqS z@Sx-k_)EUs;P(J`^1Tec8yGkX88)~YN<4g@gKq*p!?(UKet?HlNEdpx0k1jRlqDZH z@Enr|C-4>IHaYk?08AaO)B<pU@9;GxQ!d~&BiJRwJ|Ea0#*;c406d*DnmfRqz+dn+ zCWWaD!0=RLJbgHy1iX>6nJM7QfIs4svabiq^gIW9Iot8tIO<w(;MVi0FYqUTy)PhL z@BzU27m_ac0^l8d63+%;k95jTKI4Gr@JZRdz}xu5kHCj*T;NxHQjZB2u@l61fH*UN zv-z69^MM6?hrla<*YR24Uf{EQ66aoE$#_%V1;EewgjNC%O;GAX{0qD@1KA8T*$7N^ zQFr~JE%06z9jVxF0^XDb9l+5grZ)3Q{7sXPIe847=Kvq#lRQ5RJUbgc!+#p^YCiFw z4@{cOc_i$U1@h^-05<SRSb?8i3eVu@bD%HB*e?a<<{~?zy@(E`IzI7#Gw?1Oe*ze= zaW1H+v3vvYKMuH%PtvLY4xD0eC-6^s)H{AGV9%*0&WnI|AY7Y`{RZG$e3E|)*nfuc zGXVJU<&+UWt-wXI@B>}}{LIEb2VOth*e?S{BA}D@F7S_hyTLaD&%V;oa5!)&pOi~r z(N!E}kvM^$^QFQw0&kpS>hU(<4Odey*e?S%@JSg3-ggagVZRC3Iv0K$Kt6#z^9}DM z0IT>UEidpEJ}KjEz<_PfC3JN)-|fV+9{6{@P2f$yg@u#_yc+m}BFX|@2E3`*q`MaQ zw-WS~Vt)X5&H}rPz$xYMANF~`Yb!WIDPe)P^65MP`(J1L4*-6|Hyplg1rDv`zC3se za1o#6A9YtMs>;wd2KexD`eFPCoV>!slLH*Kl70jG;lLTyv^{Wv7N4XWxr#oMZxi-= zfnha<Zjrz`K508Q13k5d&H{U^;jts^<A9lbk{>s44WGoh7P!&I1y=mf#3OLyTGJ;8 zEMI5(w+dj1pRt3!dI50G&8FWLcpIP8ufV-FE^uW%yn+9OA0b!Zy9j&+@aRto4=(V9 zpTVo(jll4q8y-jnesu@=5I?|Me?dKh-v<2WFX?l@KL=KBPz*}&0C2~zX@lSb|9m&? z3;bcA^B&W03q0puV?P{N&nGn52+X^We1hi#WA5iXIJgt|555d=4ydR{_&nfSfUooA zfWHC!l27P4{I~S;zgMaZd-NHqhxjD^hk;K%K%WBM0DP5C{2u`J{DYxe0x<bc&<;NW zf5oTs1}xuf@Cx8&J_#$Z=0U?hwZPav8$1qJwiUi19)XuWPX9@tnFBoYFO&;>Fwn=B z555$5$xg$Q9^jjNQjbl*?Yr1-$IlL6-`yq;$-pIil82>&KT93qXFV`#uToEdCje*i zNnbr1_-h;A2z-@K%5?yE_VXqW!+|^br2p9sJmWR`Si%kl?&lNUei^vpAazY&Q4Rc@ zPx2t}j@PMo>~{e7zDa$73taye`v~9y@8OeiP2l7v({^%z(TAv7{KNoj_+(ymJ23Tq z`Yh}P9^-ohT>V3-QGAkaDzL)F1^(8?w*V6@`Vjp00p8urSO$I%u-^xSB@Y9Dv-r6D zpwMfnZV-ELxrZWmR^0dzDEB?Q@VP*_$04{txvwF91j@Yz!3D~_1HlE#{Q$uQF0gUA zBOvGd#a^JCsTW+}E*ls4iH*ydc{%Scegw*yR>1{k+jt&O&N_>|Ksoy>`4lMUdc|I# zoTn9BpqxDwT%epQ6<pxOHZEsNud#8c^q=4Npg^Sd6QLr2DX@J{U<FY22-gAu`e*z_ z>vhjY>}7qj1t{Sff#MF^R!0HxRNW0g^Q(>qrUC)_XW|LdH#j|A*wb26ei!x<c&Rwr zzhFFKTzeAx+fQP@=_K}BPGZ0NB=!eRVsCX}FLKy6>|<_a&IR!fnF6TR+Zgw;51NyI z#{4Fx-P~{|V<tomx~JTO`;c~X;~vZj?dGKi@lV`A|4o0#42^<j&s$-f0c$s>;O6AZ z;A6JH-;@7FjvT2jx#SWxYt}4PT3V`nKA)-<@72}(uU5C;e!IH={`=L|ty@(?LxXzt z)mPQAW5<*%U&WX9jG<Lbaq7o=tGUy+Ysr#*+PE+9$<gY#qf3@7TP7Yp3G6+(FR=Fr z&bu(jVEBZvn3pUOv$YQ;+}ez7K*jLqlfcmu?Y?ALYs`lP4(zneOZLUIN%)cy;+Nk_ z@xOOpNy$Fa*Jd4mNeNF_2k^5};y;SJ{P3gwOL+N}9l?B*^!M%5W)hM3-;(t8?+EFm z;C~<aBes$f$=}g^U%rLuuz1k<Uww4l-lKaDOB`Z8Hf>He9*&j~Kjx?>_VhV>!`^)q zp+x8tbKnoFdJ6&gwTbzgHDeNU_U^;S&3GsN-~M8Bn(?5`ZO`w!=ZpvTYQN%6xDQ<y z1=<K6r~U8S`@-Eb_O>0}SKT0H=o9#6=2LA)wX^t#zRerj0@_*AU!t&#v-sCa&<_}A z9ly?-L@x2IwSNuTsE!V7SlJX&J)xSVN{253Jd97X#z~;Ki@%QHB%ZFmmDmTWRTy6c zUo@YCZ(u<9Jb};2_g#EGZrnK5WoRUwK3&~#!woubK^|Yfe!cqL?|!Eqe)wU{<FCB( zihA$8_d<MLA;$wY(}!+;ELu4I#)=yQkCr^8RzCH~Qzh4ytCdty$y2<y_EgJUIN{or zAAd3TQIM5)zQ_AuUzaT3^WMyvGoLES8TWhO+-oOaHzg2wWNu(Z-O#75nmJdk4BY+H zBQqtwtv{0ZR|Wzf9XYaDX)eBzxz50WfrRLR0Tp3?lpWG_{RRDqfB77SPC}y$O(!~{ zZ}|-wGDHm<HVpj>scQWA@yg{wA8dBErrp%3Q`O~{U#_mW;tF;3)mN((MU&M0`SaBe ze((deaN$B#S&5!e`j6$ym#g3SCaB-vFkU^hB3;$Y&r&yEo2hOqcd1`iW~jfcx={V0 zI$Ql>)jajs?G<Y0k1th?cVDYgo(!nrPY2ZKodGprM?jtXY(QP~LO{)VKA<vRMqG9< zpr*bRP*r?0-wCLz{t-}xD36=>VL+`~wMy01)u~%<xkdf_=Ra3>+;NB6uwjGRxN)Pp z_uhMT{cdKW{KzAZ=)UZUC!SC*ZQra`e;QDav<B2O&pe~{?AfE9fBt#3fB$~<^2;x) zg9i_)H{X0yee&J`_0m5B>g~7R)_l?2+^jzT<OB8YmjTt<+NzEmIih(*$QnM1^>ZF) zaA2C4^~}XL!#p(ho~`g{pqCmS7_F`fOjXwhu2Z)MZc&c}9#k&}_6Pe@)ratB<T1Wh zC^ddP>x#|DE(kxrm9a9AsMZmF1L6Nj_y)qiNcck?!k<O>j69{TtYGf79vRVQ=A(pv zx|R7e;SUi0?}UGs@Xdt(gz$$ugdcSl>mL`qeiid#FY|ELXZu*ov~H&nzL=;22S%&F zn^RTb&~+;C!7VD#`k)FN-XF^Us6K>0gYc<@znJj3geR`nQo>)Kr~>OotH7_Os=%MF zQ-N)_5a)v`@ZSFR@Jv4PA_?D(@ZAX?OL+R9Rwgk4XD=1Fc(e-4nW_ReT&Ds*zeNQe zeNY8n-rpWx^;CJPFY}#2YCXE{HluxXADrKc?%qJ+l`1g0LItMYqypD%P=Q<itO5`2 zR)PI*bqMby{CR}WA^beTFD3ks2!9XZA0qsdgx^JY(!Avj!oNrO)=>E2XsfuC7)puZ zhs1C%G3+3Qw~3)OF`)iAI-owE8c>I?3#cQv1k{%g2GrO41EKK!2|t4H69_+z@P&k5 zO!&2gzaufA?i(FY4^IuKr>_gBeYXVE8xICl%l`K8F@zTiBoV$p;Rg}^EW!^b{Kbg@ zHG6bGT{ktLZoZDVZV9NT9t^01``g1G-!;rNzmArfnG;<TU2biab56>T!DpOt)+Hei zu8EVgv)%5=nG+_s+;c~y3>`XT@Fka=IoI~!&c>Pl*&uHB++k;nhf6MT+U}EcGqWa7 zAo{FK*My0#xx>Z7kRfLbvfZ<DGhCBhneI%&OU_0PA2#e_JCEXJa_;2dZ&Lr{zH>+7 zL1Gwu#vtdJWHMXgpFBBx!sNN9_3oF9J04PO4`<CK`~;UokU4p7|K7d(8F!t>!Dl$h zWOgY2xk-I`_r7$zj$oKB<sjV2zgxn)Cga|x_i2~fdCNIRvOxH`6I{8MO`e=JdG4ta zLBHg_eNTytiyM$5c@%e1>Yhs~b5A|a!(1VQxMybNW>21+o0U88I1jiFJx9ksG1omg zE7zSn>GV^R>?BBG?%63LawxyVpQ)1wQf=-<$z(xH&`-xdIz1N>=VndL)rHV`4AP(c z&vlQ^kSt8j&7FJdq)EMd_ofgb_qpeFo0~BzizF_?{q#wbbSVdf+%p|fj<lYsS(Dwl zP<hfoUCPrY+3YdlLYHeygd-|-!ra`sx!GB{CYN*}=9is0Zer%B$gtSUYzLuLwwvzC zcAtB}sD$p_!om_g<WRDhJ9z?()b8#&|J>BE-6LXpW#gDR5ndiQE;F;;eeT?et|{p~ zqod9vh0M7Ud$zkh{kfUKcT>{i!=p3AJ#zx=Iyo2|`u%_Hoe6Z6)wRbjRi1!VV&7{G z6q^tf0(lygA^`#k5-K=BwMB}y8ZinAVTepmAYrJWAVaklp-2V_n0phM1O#Q0D#cb2 zL~$rVM2#SVGBhf(-~V@VPrQTx0eo-0x0YwEopZl?zwewqpMCZ|_Xhq*!BWq^=)$gd zbi6U8t#qy8V}0&h=ctQX-`GKX>=N-Y{7-Xt=>1kLI<}RmM1JhXmwc~FlOlHM)Ur*b zk0ZvHpu2QvbL`Wyk7L`7#|$q2YHPB~>gJ^EP;jwEkW&t46VGL9jLKkD#d0};luGg3 z$>S6s&)t0U%`P4pm2quF>@jax`@n=godVMbbqp*S(<!iE#;8E64T>q`=Q_V-f$oYO zh#7{df8vQJ0yAgM49uD}E0C9$7nn0=j*Ar*FJA28!4)f31c(*3u9+8@sd!_7VukhV z*9TsG^;H)e?Alop*tv6OVArl)fjxWn1U~)r)4&&>?{l%ip+koP-+c2;VA{Vduu!qW z>t9Fs*~Erg=vrx^lU+{jrG;*|7P=`~=;j74vL%5lZB^ixwjnUkwgjfxdx3@aq1Nwj z*O@?~7Q}ARdR~j|)c@4;SL^vyJ%62^zfI2%)br!@{471cNYDRG&zDrJGvCK4V&C_1 z%KytarGB8i)vsS)Mx<P7J^t2@zAP~@u^F#o>(`I2->_Ls)P)yPQ>_;lf7xYCE=#;9 zs&3N@bX~t;qb5ys??q8Di3y1bfd+BS;u9~alX#JCxbT7te%7GjW$}sU*NOjG_>I`u z_-2W<YW*-?&ouqfg%{M1zPMT9`L$}*sa><?51ZDlTmRgDtKaOB^J~@Njl`&!AD>s_ zyg1#Pn0QI;nvDOG=pX#MuFh{%r*`cG?E@NK_S173=u<s%iLNz&LWBQk(kLM@F`<d@ z*Zj>A5-v?hXqe#WYoHdZ*07<w3}n|;?c_Y&s94!S4fRzu-uL%#zn%-kxSU`>;d$Ur zL5)DH{+?C)fu2^x9#F(y0X6lSng2K1iKsu>+~9k@;KwmBF%8uNmkJu!u3cL@ApP8y z<CH>Zm5T%y2t3F2@;hnphjF#LsaAu(Q3BLIcJ}Pqw`$#4xo_XTk3ReCvyZj*?A*I| z?}zG34jw$XPy5nc@4ffl!k1rud7{qwBqS#%OY@Pw`>F`zXm{o0b~^k+)-23FYTUSS zBlYl#^m27t^li7@mU6Y4ZvLtAh*PwWw$-aw+s7Y&Y+6rEc^48?R#H-8+J76Liw4sk z{GX+zrJsn__cw3e{M6dDYqPJp=9(572RStmTr9Xq04~V2P8fI%kNNB;f=dJ!D_7B? ztgP%Sz1G56ZT#zr->=CAf6f@KTD58ne!|P)zj5P6Q;yVxpDka$+~KVpl6~~iN49Cx zCR0wq-N!SE5qN)>o|(OH;lh#2mMt5pu&>kDv17Xq7%(7h^5n_g6jy^=Q$fPT7hl{$ zxs9GzU3C?_i%v^Ri)UQDJ}vwY95`T#Wu`T1)TpI+IC=N(-KLyw1)pDg?KOM*?YAAC zl8?h3+3eV{!`^-OU3U#l9u)Jq*V4IzpMU;&ne^^!jamBDS6|r|Uwm<3>(;H$eel5t zC7SC?o)Mjo$=+HDhsiv9y7()eGR;*1;O_yxdO#)~z#m@G``26po(_8O@gSVdgJf<V z{CmDX6Z~I%@x@7!W1Mti9JH)kx6aXkekk8$$Uu1}r!U}$O~{5_zh%o71F#L`L63c4 zJ3RBsE3Y^jkfH3~kb`pdq;M;muD{m%NBCSee3fXZuKm_KeE6_w8FKocl$6vMJqD10 z@@BSj<w}#xO);~xVPt?zlvi^A?i)62Fl=Spwr%b;G~ff!H|zu%f!k93KhKPJ%u-%8 z`}yC@68~zJp#RN$#Tv7lH<}fGXm;rE;VrTi?7uqA;lFCts%e*AdTC3=@RQ{)P4aLw z;B$}xe1#rl0q(p;{@b^2cff0S4!^+{U4RzwhX3ej{-<VXZ<?iUHfyUCd@I!qT5J#v z>&=>phQ=?L#jP-#{GMt9M~-l6p*qdsFJEsSz~6(Hh40VAPOt;?<<{+H*KX5yIkt-b z&>$IH{fgODq9OAw)jN(T-~GB-^Hol*_E!ga-BV9_QgnGzixw^7qzmJqLvnERcsl6e zC3*z^tD*zG!*gVW-k|^ZUG3Q%LS2Rb_3xI`aE-n{*<QG|5e>>G+W^r8{(ZKXUHW{v zSyUH)tr_P1Kl-or$N(=7dhqvpj{YML^a|bZv|!`t8G4Ux_#V5U-SWQKO`_pC>Hjap zZ)j+@$*lE1%4ujWTTq_d;#a%d@uSsg^}t`gc$#wjEhUG^*cra1Dmu{jNSS!OqKE%{ z&bq*}_?gJoeV1$$8vbe4MKp904GZ>0-f_a$pX-wuCm^QYmtTHqT4#;{Xz<|as7fZD zmPk6j{`zZs{kd88ml4<5jDackME_KWSkI5le*J;jFL#*T2n}zC?O8gL?Clw!Bzwju zHI^M<&zDP|u<4_!vsFQZ!(Z~Aq})ZE{Q5X(!5`9l8tBn`^tv(~Ucb<FbgAU;OKjfI zWGfil&YsF@?`VL4-+p5Dn=lRCO3ZE$PMt+Vg*`(<*q*PzC&{N?CZE($G{h_~_pKUc zbR`-b{&8_}75-mqJnQ^%^1yys54=3E2d=%HfWQ2nt@+d4795^zbBDIGe9<sVG|<xJ zKW`TeJ>=tmwbKk5ygfsMw`Y9Pl`o6$FPb%l2Jt`kIkT?vQ);hPg}?m0(|_68Wa1%g z&eP#(K?bY`kuveL(1SmI^4ZZHtoXsURwx?&A{z1@D91l*pV^&zL_?|Bt)c;Y#wT4T zpXBWs8oWJ2gSTgVQv6DX|Gz5ZkDal;D9)+?Xz);(4sR=wbnqG)Xv?x&+oBO|toXm$ z+S9{C!;p4%X#Z||OXds>cZden*zDE_d&VbW&mCk7_@pHHB-Ur|lbWnHYgCSZWxrGp z{1x9%YT2@7oMM!5(1Bm1M`xgen1>!(c#pN#$7OuRdP~eeTanY+mX2y|3q?bbXqYb= zo`15x9o#47sYd%mboP@>l31TbgO4$qtSW!FGXL=xUjN&)Y10^4c)(u48{EL%(}M5E z-?Oj5Z?aagw$WCNNwVie!?UB>*n$ylEhHK$+w&jglcx3SV3Y2@#wPUXXk+i~XxVqC z*~Gy;ZTnlB3>qS13}?^sNwli)m%n%VFMKA0J9yE96L@0}@Y%}*A0HVX6AwWn`v2mD z_V$8kSS}itj1&#B1?(9buxEVIlk%(3Fcli^yT-=%77h2L*{HiaIU2x|7=!iM#~3ZO zzNsCj|M(2nFyaVc{`~nC3<iz3)Pt7?{mJY^d0E@^RJyGl+sd9FEgEDCi$%jTVSC0W z<qd9cvj(-d=>t;i@yt}4(zk<66b%oFhB2aHq-da3jxl~G+fX~s|A4=A!Rf#BdK|Po z^w2{V3WXd!o(B38(E&~97SEQxzS!1{Yh`Oh!%ETM>{&G6le|6W$|wDKP>TI&K&m|^ z8YYW|M?}N#rAMPP(j21rqz(}=#$wsM+Hw9L{Js9SZQHgnIDn^4g;dahTq5Z>87<#@ zbHv_XJH!4usiUnPn`A4)_KZ*R_B=;E2^waGY50TmX!89X?BPD;G=Qj!F%)m#Aebe8 zb=2&YO1jTwJ!G!+cbd*IT$h=dxe;8kM{Ho!s8NoFNd2lzOJ$jGjZeT9PSxI8UtAGm zV9$?+?YYu(Cyjr=AK7>A+!;C8(@#I`VlQGE<p*rYkRcT`oQ#f>$pn1xNlWlar?O|! zK&yh+RlQXYKIyE@TKP_E(xi#qamO8|vl&KQmz9-e4?OUIO`0^x*|kzW&hHQlRYeQD zXKlb&5epHIvLB#f&#%oLY)8J*exqQBTc0Cij3>kPJXN+ps|s2Fo^lm+73=>>*AD;7 zFTeb19qq}~zu?}ZINHe}KR@5PcI|39TV#(u`lzX<WRE}oxWkA2J^Y3S)&kZE^a@}P z0}c37^pLd>9<864W}D}M|6$uWXUMlPhHQZt1AE3N%@}qg=$~@`rQF}cDus?lf28Zv zwC``Jb1)&<u<0|?|HL!dgmHcS_1C+&N9SRj{{(k%MMluzf%o7yy2n0;*bZ4>57@M` zXUT!}+1oQdDbk+*zHBye;7rf!ll84zw|-n_dR!iaxx=<>I-_VhlVr+iS<|LXO|iAZ z1w4p1A^{pacsl4A4?w5<*!b3e%(}~-|9z^~=kgeX^*K1Qqb+;vUVHbIrFQtxp)Hbk zwet@;OKIcAjXR(-N;YQ9m_t2#_O!lz`#QdBU+HuS8n6rUKHvr&m1!Xd!8(lI6C+_O z<ReyVKgoN<NURgkQbiLBzTA$yPB;I<ShC$*<tR%YeDJ}e;Hh(?4zOuYL$hYhOlQ}e z99T2Zd14<=2l#?NIuD)f4d}54Yy^AoGNDHYiB0_4!`_?yv-IV(@}Jli`Y&C|(|NHs zuv1mUZN!KXP7ct3UsZ0|di3bw-bV(|-~k%^zLz~EF*bS+p7iJtw0ZsFePSwNZuycw zDED-=&KXW&4{;{=qxS&1M7|lCz>S=<&fYou?bxxSrKYBuPNz6I@Hx+T8tA=Vd6{@S z!9Kv<_vjIO2K0(J5ZU?shVZA{_CrB+n)9Ecdy+~3apK`P?D>TkUT`$PAM%E>4@X0K zdb-_k!wpWiRFil3!)tgBE#QqE;D30ZJp%eeti4)xfDK?1jEfHz?ngDwxajEURLMPG zd8bk#P0fe8PIa1#AG{6{|9HNFPf1CM!$-0;#TJ|@cJ?57oAk};0BaO{=6--{Xuyxc zQ~dv;MT@MsxY(_M&ph*tdyX7|_*5$2_FJuyBZT`py*FM+Q}?KD{iYuH693@;Wsj4& z#@^_`1-auFq^B;HP@Tm2R@u5+-|#i)H#!IY*a3ElOwbc#Kt7Aled9IbA|vF%dM<kZ zBE0dN)CsHG9R6NU=_7R*8a#j-bfH7o!uavyO+L$5rz0D<dEgoR48Dkl{;($kz#Y0~ z&z?<=F;`!UKV96R(c$mofAM=9G<d)0Y4J4B!*6_()^4{?K&M!1Bl!!iT!TNd@i7E- z9rPYug6G(fe8zO)aVEG|;2){~_=re(R3#JWBFBFF?YEoG<vRWLJdf<T4_!jnd7m`^ z+<kpSd!$)sfxE+>IsE=tYtLl#k~IiAutE5Q|G?L=9!1Io-Y#9b)Mm_>;q)1Pdw_0q z2iqZT;u@V{Jk|pF%z66hgfrzkxYO!^Pvp7?{vM#g!^vdA7&;T}#zDt;2HL<E-C8Z* z2`wIX#iw)6P~Xe3{`RlS|H!`F{#WbwIB0?Y^qvlSPX|3b#lK(+0J7md<bdzQPLUbD zh*|<QC}@H2n&V9T%(oaH`^w?(^<S|<WB3G|OeVzl#6QqQT@FCE=wEv2CFghH0rrZ% zgFkj4eVn7|&sJw5DX0fOeg0E^q9XqT4XmBSFZe(7fc1#A6CShYg!jmSSisAHYkWSw z7C)vvg{y0b=I<JJ=y3WUsT-B`++TaUjqK5NuDJ(Up!4t<8qsy>(NV<+rIHovDrYQC zXKez%Q?(!I2F@V-PXcpr_JMO6XWcAEi_7YvLyrW`v!f|Phwjk#bM}|_dgZRayZ)T; zcs0VkzWt*4)XuW^<N5I;@Xld)U9SoEJI<!h4&!O%eT{H`PPjiW+}92FG2uQX+-HY- zEAMO2#|xiWL8{;k&uN{jM~QC%^!bFbq9i?9pe(o@7DP6#si;)W2Wq$~8*@c#FW6jb z{&g7{8NXD#pQfCD2fg21K+OGPL4}?&_CL$ahN#xl`OWeg8@XU=3RkJNbGvfGZ+_uW zIvEbo+Ms65nys|A8z`GD!=EYUJS2bniPnNo<(J-3e4ej7*?o$E({%rpf;hz+`|eeZ zgE|?x&{XAbsd-Z`e&c}IYs$*$`$)9UbpMIkCGz0~nzIc5iH~Hz1P*|&VT5D;qw=c< z<a4*kZ?0fqYNpg1sdG_ZAtz3KXzM|<O`^RTwcZ%~wDJn+$~|=l2Vy7oo~)1fb=D$$ zHL)yl3ZL<scAIKd)I6!RQRCtK0yQe?JJkKDvC&RMyxxyt51>70ruGZ>vHr5IvCm~* z;%Imhrr*U*<s+8=rC!!kxm)Ue)XJ9ZkNmXC*A%fL^})^0evlXe00#j74!{%Eue~3> zWAny#cXbK!;k3K<s@}D`yl#4naG>tX83=Ow)O@`@QtzeCn5=&5u{s&Unxg${y5ijK z;NfvW{=~rG!uqrF$$l=UP0g8{yq_N&ekUBLds07l`Y0TzwNc|iAE{AM>!eQj8`+53 zhOkUxSjUxj$<+7n?qh8RJPyPh@Pyd9cvMGM>!UtH9+Ae}0JT@@$JG2H^^vnI)M%*n zQDZ_M6JBtS9`^GS2l@IU>nd@YkKa5lJV9QWTwsCnnbdssT{;^r8;isNee7OIA9a4; z*#u{4(8o%3x)|nHJtbXvh3=7fFgJQmPov&Ojf8q3b*iO*8gR;*;qI@@29>DhDI7S@ zgH2GgrFr^^D~1mro|&DUeIGF>;PD`D0xxLf*Qqs8<DgbXor(Gebuwy9)HbM*QC}L- zs~nyf)5pNU>7(kdzV^*{k@MpN0Ad>;5)W`e{%gml81=42!hxJ7xp8VN=p%J5>MPV5 zU5zU||H!+4!BoyBygs%QAJi)3Pi&?-M7q9r*&ScNexLXpy1@k=&~Gm2<LZXgtEk;l zGo<!BJ6tcsCa8~4E6h=i%JYE9B7HQqTeS-P$F}s{-c0%b`>;j)4*LT3cJKt>13wOy zzHJ*H>*neN<fqX`YWU=)y-iSOqSi;9EIW(?lXWX8ujAjYx!?O2?^O7p7~)HG5IZF1 zrw0!JegNPBpOC}J+Lm?CxSA=ox^cpRdTFJ0od09~i4!NLKlRj8-Kh-`kAnw1XJ5^p zn!G7^zzh5lpV6q_at^@TL{<98ePLazs*54UR=y%r`Idh0Vak*#&hO!OS^x0==mPve z7nvJeXxPMOJKwOqJKvN|RMJP;1o}v;YGSYd?8nJ-kkf_7?5|{tZoh?Xf|Hj|q->DI zU#E4m{kz_<eILB}tv<>os9&RxGe`Y~>8o7-<y(ojW0+sHi1$-ci0X#A+O&RC!5(?! z5x2hsC;TFI03PrF`M{e4rSI6QdH36MV>`IB0A3&ShyTJB{c(Wp*`?s*TU|Sb4ei^v zZ=rneaOhASv;SRp-Sx7*zis#5f4|EE>x`t!UHH8ZJcl3fpZy)W06)OLa$`*0w^_Os zxz-*tKNqTt{aSYK_JOSR)McnGDb6yT`*w8u{TFxu@B=(5%Le>dx9}b8OEvt}0^+-q zwHWrGia&N!OQbHL@0l9;S8y0OaG>Km{(yCmvAqs37k<Ips@91ks>|FfUCvUBbX1da z=IK;>su*}B-cRk_yZ1}fc*xP~3;%{JsIO^VcJmMqz<1^ch{=f2e6O|YEAjI|jWt{K zioKeft-z_8(?4vGv54*9H@RGNkX$--4eSFveeMbw;1_rfT;K(M8=ncDt5>g{qKPj& z)#Uoz*}v+y>G~dBcjjhH<O~k_odDDC3fN6I-Q;is2Y`F90q#R@h?DRaoJ&+LJWu1Y zSEx>N{ulqFbM*HyUWsz@toisHY76?!0#{?kF2IilAAF9Nc$u0Cal2^vvnH+X+~DWt z_xcQ90q_8rkM&5uk>Gp-XH}scokL#m8oKex%Dv1z&AHwD%p+gp{C`z=_!wB<IWT?S z(dCMX3&}a5k7qHrn;&}p`im|>FJl7uJZuizhE8;h^E;fq(DwqIe>g+BnVS{^{gwG1 z$$w-3;Cu0X$XUM$f&T4PKI~zQLH^`S8{ajFIzzy|PUYWDh}V%AeP_2u#rJh%a>NTk z4MCt9z<vIi7(D`{=sgeFdJR}k6~DofbKLiKV*@8@I;+LlRW|8k$Jw)IFHw!=uzb{K zIv4VXxpU_p<9Ad8*rzf27Zw(}_jS*?1qB6Nl+RvOR8-{T>DMsiET8^n<Yd&-bpDw< z>(?4%hxG3tcF5iseJ$1=<QBzsoNG+c-fE`yfojYA7~G3a6T|s<#@iIW><;al*fWts z*sQST=Q`J^=Huf4^#kU@*6>RJ`pUDkbZt-A11~EN$=rM4KZn#W#W!I`;7aU(Zf|;i zj!o-d9vk)w@88%zvVUc-z+R=f_DW9*FKVsq$-y1{XWpkrb#XDy0qwzN3TMV(FV5bJ zTm<_*_MJ)EcaozfrUGyL7L7d&d#J^K9B7OY+4jiAlG7oNz@82MAt%-#;vm|}hdQ}< zi~R?C5B5I9y6iVXe}32)gMD~s;eq`0+cU1tjSqtlJJ#pf(wuf~KS}IP+|Is%z0=5y zYuy~Tl$g!ezE<D!w(RU|cSeM|8nQ%RJpbLz`m<^60vGp>)ZQoDAof}Kr**;kEoyR{ zAK+Q9a|=hcx7|CoIDWE+`h6ca|3R-m=pMcvzk@9G-F3%Pd^NJ%zAoPujk(sH=bkm} zdfT{S9@9VTpVxO+T&#xwLT~Wf#9YV&e;SDkuUX6ev-I5W<qz+C+*P7=lKEMW*e5VH zepzdOcI5N;Y4Bzoc%jdoJ+Wq!PvTkj*{t2F#T@f2<BU2l)FDa`I42AN^(O*<5BCFg zxwnQAnX$1^>d$q*xTfEij4Hq4_tt)(&$y?S`?a-m^jY~8zqNL*e$j}lSoce7HN$u6 zO85L*_|91OD{JQklGC%YGWy-scX;fuetk2u+QkhXl-VY$SMQ8|=~<We>(gsc|E&J^ zJaBoh{{7mdXZ5>c$dz%i{n9i0+>?>z|Ep)axGS${9@qYYI<c|I4-6Wd<^IoYHAibv z{+yo7%IGy%{}yw&8z)vRc~Hi{!I~xG?rwwn4AFmLyf-7O;={;~I}OvL{KwN9GKOUI zjqS_dc5&%hT{4ICzdvJ8T<qXJ9eVZBzw~SucTalXtc<w!$%z$XANz2{_z`y;H+yp8 zF}NltRuHYnlM_8Z+jr~GtwUN`mz%Eb(Ifog`|IzHANq+O_vPN@`D^kw<Zsgd_}QP| zydbFny=Mb6KX-ZVhTLtrrMYFfweq6#;`5U7I_LGs>zy|&Z$jSmy!m;{^ETvd%PY+* z%i{+g-@s^dqjGbeo?1A)Ft>1i;ex{Dg=-2o6mBZqR=A_Ev~Yi6Sz#bpD;O1w4#o!K zgUy3U!PH>qV7Fk8;GMzV!2!Wx!JOcP;MCysU~X`Ja6xc+a7}PSa8qzwa7VB#7zou0 zMTMe6v7z`-^H5SKHPkuOEz~1)XQ+2*KxkMfCo~~6H8eex8=4<l5LzBu6WS2k6xtTr z5h@Ms50!-iMYW2eilU2Ri{gu#7bO*?7IiLKUbL;KtSGuTsd!lN)Z*#IxyAE~7Zk54 z7A>jz?OSyN@`vT;<WI<-o}ZgPKYu~K=hwFU9pYJ8exRUMK~zC>L2N;MLGyxc1w9Jx eEa+V@pkP=*PQiqNsRh%;(eK;$9QeP+f&T_bxyt<j literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/util.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/util.py new file mode 100644 index 0000000..9d4bfd3 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/version.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/version.py new file mode 100644 index 0000000..3eebe18 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/version.py @@ -0,0 +1,736 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Implementation of a flexible versioning scheme providing support for PEP-440, +setuptools-compatible and semantic versioning. +""" + +import logging +import re + +from .compat import string_types +from .util import parse_requirement + +__all__ = ['NormalizedVersion', 'NormalizedMatcher', + 'LegacyVersion', 'LegacyMatcher', + 'SemanticVersion', 'SemanticMatcher', + 'UnsupportedVersionError', 'get_scheme'] + +logger = logging.getLogger(__name__) + + +class UnsupportedVersionError(ValueError): + """This is an unsupported version.""" + pass + + +class Version(object): + def __init__(self, s): + self._string = s = s.strip() + self._parts = parts = self.parse(s) + assert isinstance(parts, tuple) + assert len(parts) > 0 + + def parse(self, s): + raise NotImplementedError('please implement in a subclass') + + def _check_compatible(self, other): + if type(self) != type(other): + raise TypeError('cannot compare %r and %r' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + def __lt__(self, other): + self._check_compatible(other) + return self._parts < other._parts + + def __gt__(self, other): + return not (self.__lt__(other) or self.__eq__(other)) + + def __le__(self, other): + return self.__lt__(other) or self.__eq__(other) + + def __ge__(self, other): + return self.__gt__(other) or self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self._parts) + + def __repr__(self): + return "%s('%s')" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + @property + def is_prerelease(self): + raise NotImplementedError('Please implement in subclasses.') + + +class Matcher(object): + version_class = None + + # value is either a callable or the name of a method + _operators = { + '<': lambda v, c, p: v < c, + '>': lambda v, c, p: v > c, + '<=': lambda v, c, p: v == c or v < c, + '>=': lambda v, c, p: v == c or v > c, + '==': lambda v, c, p: v == c, + '===': lambda v, c, p: v == c, + # by default, compatible => >=. + '~=': lambda v, c, p: v == c or v > c, + '!=': lambda v, c, p: v != c, + } + + # this is a method only to support alternative implementations + # via overriding + def parse_requirement(self, s): + return parse_requirement(s) + + def __init__(self, s): + if self.version_class is None: + raise ValueError('Please specify a version class') + self._string = s = s.strip() + r = self.parse_requirement(s) + if not r: + raise ValueError('Not valid: %r' % s) + self.name = r.name + self.key = self.name.lower() # for case-insensitive comparisons + clist = [] + if r.constraints: + # import pdb; pdb.set_trace() + for op, s in r.constraints: + if s.endswith('.*'): + if op not in ('==', '!='): + raise ValueError('\'.*\' not allowed for ' + '%r constraints' % op) + # Could be a partial version (e.g. for '2.*') which + # won't parse as a version, so keep it as a string + vn, prefix = s[:-2], True + # Just to check that vn is a valid version + self.version_class(vn) + else: + # Should parse as a version, so we can create an + # instance for the comparison + vn, prefix = self.version_class(s), False + clist.append((op, vn, prefix)) + self._parts = tuple(clist) + + def match(self, version): + """ + Check if the provided version matches the constraints. + + :param version: The version to match against this instance. + :type version: String or :class:`Version` instance. + """ + if isinstance(version, string_types): + version = self.version_class(version) + for operator, constraint, prefix in self._parts: + f = self._operators.get(operator) + if isinstance(f, string_types): + f = getattr(self, f) + if not f: + msg = ('%r not implemented ' + 'for %s' % (operator, self.__class__.__name__)) + raise NotImplementedError(msg) + if not f(version, constraint, prefix): + return False + return True + + @property + def exact_version(self): + result = None + if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='): + result = self._parts[0][1] + return result + + def _check_compatible(self, other): + if type(self) != type(other) or self.name != other.name: + raise TypeError('cannot compare %s and %s' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self.key == other.key and self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self.key) + hash(self._parts) + + def __repr__(self): + return "%s(%r)" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + +PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|b|c|rc)(\d+))?' + r'(\.(post)(\d+))?(\.(dev)(\d+))?' + r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$') + + +def _pep_440_key(s): + s = s.strip() + m = PEP440_VERSION_RE.match(s) + if not m: + raise UnsupportedVersionError('Not a valid version: %s' % s) + groups = m.groups() + nums = tuple(int(v) for v in groups[1].split('.')) + while len(nums) > 1 and nums[-1] == 0: + nums = nums[:-1] + + if not groups[0]: + epoch = 0 + else: + epoch = int(groups[0]) + pre = groups[4:6] + post = groups[7:9] + dev = groups[10:12] + local = groups[13] + if pre == (None, None): + pre = () + else: + pre = pre[0], int(pre[1]) + if post == (None, None): + post = () + else: + post = post[0], int(post[1]) + if dev == (None, None): + dev = () + else: + dev = dev[0], int(dev[1]) + if local is None: + local = () + else: + parts = [] + for part in local.split('.'): + # to ensure that numeric compares as > lexicographic, avoid + # comparing them directly, but encode a tuple which ensures + # correct sorting + if part.isdigit(): + part = (1, int(part)) + else: + part = (0, part) + parts.append(part) + local = tuple(parts) + if not pre: + # either before pre-release, or final release and after + if not post and dev: + # before pre-release + pre = ('a', -1) # to sort before a0 + else: + pre = ('z',) # to sort after all pre-releases + # now look at the state of post and dev. + if not post: + post = ('_',) # sort before 'a' + if not dev: + dev = ('final',) + + #print('%s -> %s' % (s, m.groups())) + return epoch, nums, pre, post, dev, local + + +_normalized_key = _pep_440_key + + +class NormalizedVersion(Version): + """A rational version. + + Good: + 1.2 # equivalent to "1.2.0" + 1.2.0 + 1.2a1 + 1.2.3a2 + 1.2.3b1 + 1.2.3c1 + 1.2.3.4 + TODO: fill this out + + Bad: + 1 # minimum two numbers + 1.2a # release level must have a release serial + 1.2.3b + """ + def parse(self, s): + result = _normalized_key(s) + # _normalized_key loses trailing zeroes in the release + # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0 + # However, PEP 440 prefix matching needs it: for example, + # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0). + m = PEP440_VERSION_RE.match(s) # must succeed + groups = m.groups() + self._release_clause = tuple(int(v) for v in groups[1].split('.')) + return result + + PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev']) + + @property + def is_prerelease(self): + return any(t[0] in self.PREREL_TAGS for t in self._parts if t) + + +def _match_prefix(x, y): + x = str(x) + y = str(y) + if x == y: + return True + if not x.startswith(y): + return False + n = len(y) + return x[n] == '.' + + +class NormalizedMatcher(Matcher): + version_class = NormalizedVersion + + # value is either a callable or the name of a method + _operators = { + '~=': '_match_compatible', + '<': '_match_lt', + '>': '_match_gt', + '<=': '_match_le', + '>=': '_match_ge', + '==': '_match_eq', + '===': '_match_arbitrary', + '!=': '_match_ne', + } + + def _adjust_local(self, version, constraint, prefix): + if prefix: + strip_local = '+' not in constraint and version._parts[-1] + else: + # both constraint and version are + # NormalizedVersion instances. + # If constraint does not have a local component, + # ensure the version doesn't, either. + strip_local = not constraint._parts[-1] and version._parts[-1] + if strip_local: + s = version._string.split('+', 1)[0] + version = self.version_class(s) + return version, constraint + + def _match_lt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version >= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_gt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version <= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_le(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version <= constraint + + def _match_ge(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version >= constraint + + def _match_eq(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version == constraint) + else: + result = _match_prefix(version, constraint) + return result + + def _match_arbitrary(self, version, constraint, prefix): + return str(version) == str(constraint) + + def _match_ne(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version != constraint) + else: + result = not _match_prefix(version, constraint) + return result + + def _match_compatible(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version == constraint: + return True + if version < constraint: + return False +# if not prefix: +# return True + release_clause = constraint._release_clause + if len(release_clause) > 1: + release_clause = release_clause[:-1] + pfx = '.'.join([str(i) for i in release_clause]) + return _match_prefix(version, pfx) + +_REPLACEMENTS = ( + (re.compile('[.+-]$'), ''), # remove trailing puncts + (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start + (re.compile('^[.-]'), ''), # remove leading puncts + (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses + (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha + (re.compile(r'\b(pre-alpha|prealpha)\b'), + 'pre.alpha'), # standardise + (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses +) + +_SUFFIX_REPLACEMENTS = ( + (re.compile('^[:~._+-]+'), ''), # remove leading puncts + (re.compile('[,*")([\\]]'), ''), # remove unwanted chars + (re.compile('[~:+_ -]'), '.'), # replace illegal chars + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\.$'), ''), # trailing '.' +) + +_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)') + + +def _suggest_semantic_version(s): + """ + Try to suggest a semantic form for a version for which + _suggest_normalized_version couldn't come up with anything. + """ + result = s.strip().lower() + for pat, repl in _REPLACEMENTS: + result = pat.sub(repl, result) + if not result: + result = '0.0.0' + + # Now look for numeric prefix, and separate it out from + # the rest. + #import pdb; pdb.set_trace() + m = _NUMERIC_PREFIX.match(result) + if not m: + prefix = '0.0.0' + suffix = result + else: + prefix = m.groups()[0].split('.') + prefix = [int(i) for i in prefix] + while len(prefix) < 3: + prefix.append(0) + if len(prefix) == 3: + suffix = result[m.end():] + else: + suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():] + prefix = prefix[:3] + prefix = '.'.join([str(i) for i in prefix]) + suffix = suffix.strip() + if suffix: + #import pdb; pdb.set_trace() + # massage the suffix. + for pat, repl in _SUFFIX_REPLACEMENTS: + suffix = pat.sub(repl, suffix) + + if not suffix: + result = prefix + else: + sep = '-' if 'dev' in suffix else '+' + result = prefix + sep + suffix + if not is_semver(result): + result = None + return result + + +def _suggest_normalized_version(s): + """Suggest a normalized version close to the given version string. + + If you have a version string that isn't rational (i.e. NormalizedVersion + doesn't like it) then you might be able to get an equivalent (or close) + rational version from this function. + + This does a number of simple normalizations to the given string, based + on observation of versions currently in use on PyPI. Given a dump of + those version during PyCon 2009, 4287 of them: + - 2312 (53.93%) match NormalizedVersion without change + with the automatic suggestion + - 3474 (81.04%) match when using this suggestion method + + @param s {str} An irrational version string. + @returns A rational version string, or None, if couldn't determine one. + """ + try: + _normalized_key(s) + return s # already rational + except UnsupportedVersionError: + pass + + rs = s.lower() + + # part of this could use maketrans + for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), + ('beta', 'b'), ('rc', 'c'), ('-final', ''), + ('-pre', 'c'), + ('-release', ''), ('.release', ''), ('-stable', ''), + ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), + ('final', '')): + rs = rs.replace(orig, repl) + + # if something ends with dev or pre, we add a 0 + rs = re.sub(r"pre$", r"pre0", rs) + rs = re.sub(r"dev$", r"dev0", rs) + + # if we have something like "b-2" or "a.2" at the end of the + # version, that is probably beta, alpha, etc + # let's remove the dash or dot + rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) + + # 1.0-dev-r371 -> 1.0.dev371 + # 0.1-dev-r79 -> 0.1.dev79 + rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) + + # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 + rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) + + # Clean: v0.3, v1.0 + if rs.startswith('v'): + rs = rs[1:] + + # Clean leading '0's on numbers. + #TODO: unintended side-effect on, e.g., "2003.05.09" + # PyPI stats: 77 (~2%) better + rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) + + # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers + # zero. + # PyPI stats: 245 (7.56%) better + rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) + + # the 'dev-rNNN' tag is a dev tag + rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) + + # clean the - when used as a pre delimiter + rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) + + # a terminal "dev" or "devel" can be changed into ".dev0" + rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) + + # a terminal "dev" can be changed into ".dev0" + rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) + + # a terminal "final" or "stable" can be removed + rs = re.sub(r"(final|stable)$", "", rs) + + # The 'r' and the '-' tags are post release tags + # 0.4a1.r10 -> 0.4a1.post10 + # 0.9.33-17222 -> 0.9.33.post17222 + # 0.9.33-r17222 -> 0.9.33.post17222 + rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) + + # Clean 'r' instead of 'dev' usage: + # 0.9.33+r17222 -> 0.9.33.dev17222 + # 1.0dev123 -> 1.0.dev123 + # 1.0.git123 -> 1.0.dev123 + # 1.0.bzr123 -> 1.0.dev123 + # 0.1a0dev.123 -> 0.1a0.dev123 + # PyPI stats: ~150 (~4%) better + rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) + + # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: + # 0.2.pre1 -> 0.2c1 + # 0.2-c1 -> 0.2c1 + # 1.0preview123 -> 1.0c123 + # PyPI stats: ~21 (0.62%) better + rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) + + # Tcl/Tk uses "px" for their post release markers + rs = re.sub(r"p(\d+)$", r".post\1", rs) + + try: + _normalized_key(rs) + except UnsupportedVersionError: + rs = None + return rs + +# +# Legacy version processing (distribute-compatible) +# + +_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I) +_VERSION_REPLACE = { + 'pre': 'c', + 'preview': 'c', + '-': 'final-', + 'rc': 'c', + 'dev': '@', + '': None, + '.': None, +} + + +def _legacy_key(s): + def get_parts(s): + result = [] + for p in _VERSION_PART.split(s.lower()): + p = _VERSION_REPLACE.get(p, p) + if p: + if '0' <= p[:1] <= '9': + p = p.zfill(8) + else: + p = '*' + p + result.append(p) + result.append('*final') + return result + + result = [] + for p in get_parts(s): + if p.startswith('*'): + if p < '*final': + while result and result[-1] == '*final-': + result.pop() + while result and result[-1] == '00000000': + result.pop() + result.append(p) + return tuple(result) + + +class LegacyVersion(Version): + def parse(self, s): + return _legacy_key(s) + + @property + def is_prerelease(self): + result = False + for x in self._parts: + if (isinstance(x, string_types) and x.startswith('*') and + x < '*final'): + result = True + break + return result + + +class LegacyMatcher(Matcher): + version_class = LegacyVersion + + _operators = dict(Matcher._operators) + _operators['~='] = '_match_compatible' + + numeric_re = re.compile(r'^(\d+(\.\d+)*)') + + def _match_compatible(self, version, constraint, prefix): + if version < constraint: + return False + m = self.numeric_re.match(str(constraint)) + if not m: + logger.warning('Cannot compute compatible match for version %s ' + ' and constraint %s', version, constraint) + return True + s = m.groups()[0] + if '.' in s: + s = s.rsplit('.', 1)[0] + return _match_prefix(version, s) + +# +# Semantic versioning +# + +_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' + r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' + r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) + + +def is_semver(s): + return _SEMVER_RE.match(s) + + +def _semantic_key(s): + def make_tuple(s, absent): + if s is None: + result = (absent,) + else: + parts = s[1:].split('.') + # We can't compare ints and strings on Python 3, so fudge it + # by zero-filling numeric values so simulate a numeric comparison + result = tuple([p.zfill(8) if p.isdigit() else p for p in parts]) + return result + + m = is_semver(s) + if not m: + raise UnsupportedVersionError(s) + groups = m.groups() + major, minor, patch = [int(i) for i in groups[:3]] + # choose the '|' and '*' so that versions sort correctly + pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*') + return (major, minor, patch), pre, build + + +class SemanticVersion(Version): + def parse(self, s): + return _semantic_key(s) + + @property + def is_prerelease(self): + return self._parts[1][0] != '|' + + +class SemanticMatcher(Matcher): + version_class = SemanticVersion + + +class VersionScheme(object): + def __init__(self, key, matcher, suggester=None): + self.key = key + self.matcher = matcher + self.suggester = suggester + + def is_valid_version(self, s): + try: + self.matcher.version_class(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_matcher(self, s): + try: + self.matcher(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_constraint_list(self, s): + """ + Used for processing some metadata fields + """ + return self.is_valid_matcher('dummy_name (%s)' % s) + + def suggest(self, s): + if self.suggester is None: + result = None + else: + result = self.suggester(s) + return result + +_SCHEMES = { + 'normalized': VersionScheme(_normalized_key, NormalizedMatcher, + _suggest_normalized_version), + 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s), + 'semantic': VersionScheme(_semantic_key, SemanticMatcher, + _suggest_semantic_version), +} + +_SCHEMES['default'] = _SCHEMES['normalized'] + + +def get_scheme(name): + if name not in _SCHEMES: + raise ValueError('unknown scheme name: %r' % name) + return _SCHEMES[name] diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/w32.exe b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/w64.exe b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/wheel.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distlib/wheel.py new file mode 100644 index 0000000..b04bfae --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distro.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distro.py new file mode 100644 index 0000000..3306163 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/distro.py @@ -0,0 +1,1216 @@ +# 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 the recommended replacement 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.8 will remove it altogether. +Its predecessor function :py:func:`platform.dist` was already +deprecated since Python 2.6 and will also be removed in Python 3.8. +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 = { + 'ol': 'oracle', # Oracle Enterprise Linux +} + +#: 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`. + """ + try: + # Handle os_release specially since distros might purposefully set + # this to empty string to have no codename + return self._os_release_info['codename'] + except KeyError: + return 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`. + """ + return self._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 + else: + # Ignore any tokens that are not variable assignments + pass + + if 'version_codename' in props: + # os-release added a version_codename field. Use that in + # preference to anything else Note that some distros purposefully + # do not have code names. They should be setting + # version_codename="" + props['codename'] = props['version_codename'] + elif 'ubuntu_codename' in props: + # Same as above but a non-standard field name used on older Ubuntus + props['codename'] = props['ubuntu_codename'] + elif 'version' in props: + # If there is no version_codename, parse it from the version + codename = re.search(r'(\(\D+\))|,(\s+)?\D+', props['version']) + if codename: + codename = codename.group() + codename = codename.strip('()') + codename = codename.strip(',') + codename = codename.strip() + # codename appears within paranthese. + props['codename'] = codename + + 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 'name' in distro_info \ + and 'cloudlinux' in distro_info['name'].lower(): + distro_info['id'] = 'cloudlinux' + elif 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) + if 'cloudlinux' in distro_info['name'].lower(): + distro_info['id'] = 'cloudlinux' + 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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__init__.py new file mode 100644 index 0000000..0491234 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__init__.py @@ -0,0 +1,35 @@ +""" +HTML parsing library based on the `WHATWG HTML specification +<https://whatwg.org/html>`_. The parser is designed to be compatible with +existing HTML found in the wild and implements well-defined error recovery that +is largely compatible with modern desktop web browsers. + +Example usage:: + + from pip._vendor import html5lib + with open("my_document.html", "rb") as f: + tree = html5lib.parse(f) + +For convenience, this module re-exports the following names: + +* :func:`~.html5parser.parse` +* :func:`~.html5parser.parseFragment` +* :class:`~.html5parser.HTMLParser` +* :func:`~.treebuilders.getTreeBuilder` +* :func:`~.treewalkers.getTreeWalker` +* :func:`~.serializer.serialize` +""" + +from __future__ import absolute_import, division, unicode_literals + +from .html5parser import HTMLParser, parse, parseFragment +from .treebuilders import getTreeBuilder +from .treewalkers import getTreeWalker +from .serializer import serialize + +__all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder", + "getTreeWalker", "serialize"] + +# this has to be at the top level, see how setup.py parses this +#: Distribution version number. +__version__ = "1.0.1" diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11f1ed61bf9d5d82e64087d0a2f93dd24a080f5a GIT binary patch literal 1317 zcmaJ>-D>1E6!!dNX5yJiQb_Mbu6D}C-mn`A!|t*zbh{UADRdxU3L4pxJtC52BzZiO zi+zB7ioIRvd-NTATPW-+^r}a4nkFe!#>dj}@%g^<=jZcz_~*ypfBi5Ff<J<LYXti@ zaGMPX8YBVj(Z1-(e$tnNWFUvhuout)9f|`vN=9;=jO8Smc-?_GlwlJ3{YXsZESdTJ zSj^>7as>McJ)|L>(ixo>qvV(#B`5Uwmtb*1e(MK8_-^&%52zyA@UlRHr<&+JN{L|< zsS?=@L+h(|->j~_N8Zv@EaN%Ph~=sbUv8|e%rcIf4Y5rTDP6=HE5++Ij?fCeb&i=v z+#t#fFG}!g6-pV(l&ru<Di~_G-Gpq%jdc_}O0MdXBHrOQTu?;ZSyqBcR$7A^Cd4^q zId>kJ)=DGIGPPwu-U62p5Czc%6Z^+dNGi&7=?Gn0Re`G%rCK$>(?ntT-HtdIR2x#T z<uVKrtXwOJDqcl+%SsAhKt*YbT&$OnG;ieMK&oQplQX%;RAsf}8abP@r|3+lXA49O z%9q~SxwV=x^y<z_<g@i8UxeXXz{peyXq=T9dkR58M8LcTYMPz1ox?Z2KDiP?H7<80 zk<0+)uh25D%WS!R@6j*2Ds=AG|NHi>CWT||tujH3dF;g1=VxEl2cBFgX$_TfSuB`c z!TH<n{2#l9i0gZ1SN{0G3TnZL;5ST1ciVON8O9@64BBIo8YODWa94(QLiv^(Xvp@Y zE_nv^#e!R=i7=mg-8a6^JKpVq&qq7=kAEUw^xC6`yg@U+)pQg=ad<~ZyQ$S<CnioD zIuSZC1#xq55j~48ep-Cdj<M?njN1_7ytcJw7;BikKo6XNpFz-0eIt23`jO*yc0aWq zrky&~Z5BOd8~)47<2zI$1fWha^ejxbDlz^P=u?O3#9unDG~W`-;w{lJG?6P^oL$FO zT;%C)OJA6;@nx3ouP>hGH;v4m!79pl6~iE$^U_!VIDaA84K+LCl>WY*5dRx+qY-1w iOKvfas(m|o*|qTNFM)wM0Ws{K_D_2=cl9T|$?$KUhM~9s literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05761f2fb23eda7400c0770c98b7f22f4f0cc628 GIT binary patch literal 13861 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2ba81cea069fd1a34c3393247aeb27c822a3838 GIT binary patch literal 22729 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20ee461282c6b8fa05a514d7f6623934d4fbbf19 GIT binary patch literal 42165 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82388be0612051239c9a9d297122033d74783fcd GIT binary patch literal 3287 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65180d33c04a6325bd0186fddb25d1e540559310 GIT binary patch literal 66433 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 B5Y_+y literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb213bcbf508c117083f773f8a0396ddac2e9d7a GIT binary patch literal 99766 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 z%0D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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49b45141d20868f97d9ee447dbcfb2c5035a7334 GIT binary patch literal 10935 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_ihatexml.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_ihatexml.py new file mode 100644 index 0000000..4c77717 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_ihatexml.py @@ -0,0 +1,288 @@ +from __future__ import absolute_import, division, unicode_literals + +import re +import warnings + +from .constants import DataLossWarning + +baseChar = """ +[#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | +[#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | +[#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | +[#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | +[#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | +[#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | +[#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | +[#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | +[#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | +[#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | +[#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | +[#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | +[#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | +[#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | +[#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | +[#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | +[#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | +[#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | +[#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | +[#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | +[#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | +[#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | +[#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | +[#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | +[#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | +[#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | +[#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | +[#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | +[#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | +[#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | +#x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | +#x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | +#x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | +[#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | +[#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | +#x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | +[#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | +[#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | +[#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | +[#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | +[#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | +#x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | +[#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | +[#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | +[#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | +[#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]""" + +ideographic = """[#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]""" + +combiningCharacter = """ +[#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | +[#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | +[#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | +[#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | +#x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | +[#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | +[#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | +#x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | +[#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | +[#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | +#x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | +[#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | +[#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | +[#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | +[#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | +[#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | +#x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | +[#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | +#x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | +[#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | +[#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | +#x3099 | #x309A""" + +digit = """ +[#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | +[#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | +[#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | +[#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]""" + +extender = """ +#x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | +#[#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]""" + +letter = " | ".join([baseChar, ideographic]) + +# Without the +name = " | ".join([letter, digit, ".", "-", "_", combiningCharacter, + extender]) +nameFirst = " | ".join([letter, "_"]) + +reChar = re.compile(r"#x([\d|A-F]{4,4})") +reCharRange = re.compile(r"\[#x([\d|A-F]{4,4})-#x([\d|A-F]{4,4})\]") + + +def charStringToList(chars): + charRanges = [item.strip() for item in chars.split(" | ")] + rv = [] + for item in charRanges: + foundMatch = False + for regexp in (reChar, reCharRange): + match = regexp.match(item) + if match is not None: + rv.append([hexToInt(item) for item in match.groups()]) + if len(rv[-1]) == 1: + rv[-1] = rv[-1] * 2 + foundMatch = True + break + if not foundMatch: + assert len(item) == 1 + + rv.append([ord(item)] * 2) + rv = normaliseCharList(rv) + return rv + + +def normaliseCharList(charList): + charList = sorted(charList) + for item in charList: + assert item[1] >= item[0] + rv = [] + i = 0 + while i < len(charList): + j = 1 + rv.append(charList[i]) + while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1: + rv[-1][1] = charList[i + j][1] + j += 1 + i += j + return rv + +# We don't really support characters above the BMP :( +max_unicode = int("FFFF", 16) + + +def missingRanges(charList): + rv = [] + if charList[0] != 0: + rv.append([0, charList[0][0] - 1]) + for i, item in enumerate(charList[:-1]): + rv.append([item[1] + 1, charList[i + 1][0] - 1]) + if charList[-1][1] != max_unicode: + rv.append([charList[-1][1] + 1, max_unicode]) + return rv + + +def listToRegexpStr(charList): + rv = [] + for item in charList: + if item[0] == item[1]: + rv.append(escapeRegexp(chr(item[0]))) + else: + rv.append(escapeRegexp(chr(item[0])) + "-" + + escapeRegexp(chr(item[1]))) + return "[%s]" % "".join(rv) + + +def hexToInt(hex_str): + return int(hex_str, 16) + + +def escapeRegexp(string): + specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}", + "[", "]", "|", "(", ")", "-") + for char in specialCharacters: + string = string.replace(char, "\\" + char) + + return string + +# output from the above +nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +# Simpler things +nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\\-'()+,./:=?;!*#@$_%]") + + +class InfosetFilter(object): + replacementRegexp = re.compile(r"U[\dA-F]{5,5}") + + def __init__(self, + dropXmlnsLocalName=False, + dropXmlnsAttrNs=False, + preventDoubleDashComments=False, + preventDashAtCommentEnd=False, + replaceFormFeedCharacters=True, + preventSingleQuotePubid=False): + + self.dropXmlnsLocalName = dropXmlnsLocalName + self.dropXmlnsAttrNs = dropXmlnsAttrNs + + self.preventDoubleDashComments = preventDoubleDashComments + self.preventDashAtCommentEnd = preventDashAtCommentEnd + + self.replaceFormFeedCharacters = replaceFormFeedCharacters + + self.preventSingleQuotePubid = preventSingleQuotePubid + + self.replaceCache = {} + + def coerceAttribute(self, name, namespace=None): + if self.dropXmlnsLocalName and name.startswith("xmlns:"): + warnings.warn("Attributes cannot begin with xmlns", DataLossWarning) + return None + elif (self.dropXmlnsAttrNs and + namespace == "http://www.w3.org/2000/xmlns/"): + warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning) + return None + else: + return self.toXmlName(name) + + def coerceElement(self, name): + return self.toXmlName(name) + + def coerceComment(self, data): + if self.preventDoubleDashComments: + while "--" in data: + warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning) + data = data.replace("--", "- -") + if data.endswith("-"): + warnings.warn("Comments cannot end in a dash", DataLossWarning) + data += " " + return data + + def coerceCharacters(self, data): + if self.replaceFormFeedCharacters: + for _ in range(data.count("\x0C")): + warnings.warn("Text cannot contain U+000C", DataLossWarning) + data = data.replace("\x0C", " ") + # Other non-xml characters + return data + + def coercePubid(self, data): + dataOutput = data + for char in nonPubidCharRegexp.findall(data): + warnings.warn("Coercing non-XML pubid", DataLossWarning) + replacement = self.getReplacementCharacter(char) + dataOutput = dataOutput.replace(char, replacement) + if self.preventSingleQuotePubid and dataOutput.find("'") >= 0: + warnings.warn("Pubid cannot contain single quote", DataLossWarning) + dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'")) + return dataOutput + + def toXmlName(self, name): + nameFirst = name[0] + nameRest = name[1:] + m = nonXmlNameFirstBMPRegexp.match(nameFirst) + if m: + warnings.warn("Coercing non-XML name", DataLossWarning) + nameFirstOutput = self.getReplacementCharacter(nameFirst) + else: + nameFirstOutput = nameFirst + + nameRestOutput = nameRest + replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest)) + for char in replaceChars: + warnings.warn("Coercing non-XML name", DataLossWarning) + replacement = self.getReplacementCharacter(char) + nameRestOutput = nameRestOutput.replace(char, replacement) + return nameFirstOutput + nameRestOutput + + def getReplacementCharacter(self, char): + if char in self.replaceCache: + replacement = self.replaceCache[char] + else: + replacement = self.escapeChar(char) + return replacement + + def fromXmlName(self, name): + for item in set(self.replacementRegexp.findall(name)): + name = name.replace(item, self.unescapeChar(item)) + return name + + def escapeChar(self, char): + replacement = "U%05X" % ord(char) + self.replaceCache[char] = replacement + return replacement + + def unescapeChar(self, charcode): + return chr(int(charcode[1:], 16)) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_inputstream.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_inputstream.py new file mode 100644 index 0000000..a65e55f --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_inputstream.py @@ -0,0 +1,923 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import text_type, binary_type +from pip._vendor.six.moves import http_client, urllib + +import codecs +import re + +from pip._vendor import webencodings + +from .constants import EOF, spaceCharacters, asciiLetters, asciiUppercase +from .constants import _ReparseException +from . import _utils + +from io import StringIO + +try: + from io import BytesIO +except ImportError: + BytesIO = StringIO + +# Non-unicode versions of constants for use in the pre-parser +spaceCharactersBytes = frozenset([item.encode("ascii") for item in spaceCharacters]) +asciiLettersBytes = frozenset([item.encode("ascii") for item in asciiLetters]) +asciiUppercaseBytes = frozenset([item.encode("ascii") for item in asciiUppercase]) +spacesAngleBrackets = spaceCharactersBytes | frozenset([b">", b"<"]) + + +invalid_unicode_no_surrogate = "[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uFDD0-\uFDEF\uFFFE\uFFFF\U0001FFFE\U0001FFFF\U0002FFFE\U0002FFFF\U0003FFFE\U0003FFFF\U0004FFFE\U0004FFFF\U0005FFFE\U0005FFFF\U0006FFFE\U0006FFFF\U0007FFFE\U0007FFFF\U0008FFFE\U0008FFFF\U0009FFFE\U0009FFFF\U000AFFFE\U000AFFFF\U000BFFFE\U000BFFFF\U000CFFFE\U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF]" # noqa + +if _utils.supports_lone_surrogates: + # Use one extra step of indirection and create surrogates with + # eval. Not using this indirection would introduce an illegal + # unicode literal on platforms not supporting such lone + # surrogates. + assert invalid_unicode_no_surrogate[-1] == "]" and invalid_unicode_no_surrogate.count("]") == 1 + invalid_unicode_re = re.compile(invalid_unicode_no_surrogate[:-1] + + eval('"\\uD800-\\uDFFF"') + # pylint:disable=eval-used + "]") +else: + invalid_unicode_re = re.compile(invalid_unicode_no_surrogate) + +non_bmp_invalid_codepoints = set([0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, + 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, + 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, + 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, + 0x10FFFE, 0x10FFFF]) + +ascii_punctuation_re = re.compile("[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005C\u005B-\u0060\u007B-\u007E]") + +# Cache for charsUntil() +charsUntilRegEx = {} + + +class BufferedStream(object): + """Buffering for streams that do not have buffering of their own + + The buffer is implemented as a list of chunks on the assumption that + joining many strings will be slow since it is O(n**2) + """ + + def __init__(self, stream): + self.stream = stream + self.buffer = [] + self.position = [-1, 0] # chunk number, offset + + def tell(self): + pos = 0 + for chunk in self.buffer[:self.position[0]]: + pos += len(chunk) + pos += self.position[1] + return pos + + def seek(self, pos): + assert pos <= self._bufferedBytes() + offset = pos + i = 0 + while len(self.buffer[i]) < offset: + offset -= len(self.buffer[i]) + i += 1 + self.position = [i, offset] + + def read(self, bytes): + if not self.buffer: + return self._readStream(bytes) + elif (self.position[0] == len(self.buffer) and + self.position[1] == len(self.buffer[-1])): + return self._readStream(bytes) + else: + return self._readFromBuffer(bytes) + + def _bufferedBytes(self): + return sum([len(item) for item in self.buffer]) + + def _readStream(self, bytes): + data = self.stream.read(bytes) + self.buffer.append(data) + self.position[0] += 1 + self.position[1] = len(data) + return data + + def _readFromBuffer(self, bytes): + remainingBytes = bytes + rv = [] + bufferIndex = self.position[0] + bufferOffset = self.position[1] + while bufferIndex < len(self.buffer) and remainingBytes != 0: + assert remainingBytes > 0 + bufferedData = self.buffer[bufferIndex] + + if remainingBytes <= len(bufferedData) - bufferOffset: + bytesToRead = remainingBytes + self.position = [bufferIndex, bufferOffset + bytesToRead] + else: + bytesToRead = len(bufferedData) - bufferOffset + self.position = [bufferIndex, len(bufferedData)] + bufferIndex += 1 + rv.append(bufferedData[bufferOffset:bufferOffset + bytesToRead]) + remainingBytes -= bytesToRead + + bufferOffset = 0 + + if remainingBytes: + rv.append(self._readStream(remainingBytes)) + + return b"".join(rv) + + +def HTMLInputStream(source, **kwargs): + # Work around Python bug #20007: read(0) closes the connection. + # http://bugs.python.org/issue20007 + if (isinstance(source, http_client.HTTPResponse) or + # Also check for addinfourl wrapping HTTPResponse + (isinstance(source, urllib.response.addbase) and + isinstance(source.fp, http_client.HTTPResponse))): + isUnicode = False + elif hasattr(source, "read"): + isUnicode = isinstance(source.read(0), text_type) + else: + isUnicode = isinstance(source, text_type) + + if isUnicode: + encodings = [x for x in kwargs if x.endswith("_encoding")] + if encodings: + raise TypeError("Cannot set an encoding with a unicode input, set %r" % encodings) + + return HTMLUnicodeInputStream(source, **kwargs) + else: + return HTMLBinaryInputStream(source, **kwargs) + + +class HTMLUnicodeInputStream(object): + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + _defaultChunkSize = 10240 + + def __init__(self, source): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + """ + + if not _utils.supports_lone_surrogates: + # Such platforms will have already checked for such + # surrogate errors, so no need to do this checking. + self.reportCharacterErrors = None + elif len("\U0010FFFF") == 1: + self.reportCharacterErrors = self.characterErrorsUCS4 + else: + self.reportCharacterErrors = self.characterErrorsUCS2 + + # List of where new lines occur + self.newLines = [0] + + self.charEncoding = (lookupEncoding("utf-8"), "certain") + self.dataStream = self.openStream(source) + + self.reset() + + def reset(self): + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + self.errors = [] + + # number of (complete) lines in previous chunks + self.prevNumLines = 0 + # number of columns in the last line of the previous chunk + self.prevNumCols = 0 + + # Deal with CR LF and surrogates split over chunk boundaries + self._bufferedCharacter = None + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = StringIO(source) + + return stream + + def _position(self, offset): + chunk = self.chunk + nLines = chunk.count('\n', 0, offset) + positionLine = self.prevNumLines + nLines + lastLinePos = chunk.rfind('\n', 0, offset) + if lastLinePos == -1: + positionColumn = self.prevNumCols + offset + else: + positionColumn = offset - (lastLinePos + 1) + return (positionLine, positionColumn) + + def position(self): + """Returns (line, col) of the current position in the stream.""" + line, col = self._position(self.chunkOffset) + return (line + 1, col) + + def char(self): + """ Read one character from the stream or queue if available. Return + EOF when EOF is reached. + """ + # Read a new chunk from the input stream if necessary + if self.chunkOffset >= self.chunkSize: + if not self.readChunk(): + return EOF + + chunkOffset = self.chunkOffset + char = self.chunk[chunkOffset] + self.chunkOffset = chunkOffset + 1 + + return char + + def readChunk(self, chunkSize=None): + if chunkSize is None: + chunkSize = self._defaultChunkSize + + self.prevNumLines, self.prevNumCols = self._position(self.chunkSize) + + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + + data = self.dataStream.read(chunkSize) + + # Deal with CR LF and surrogates broken across chunks + if self._bufferedCharacter: + data = self._bufferedCharacter + data + self._bufferedCharacter = None + elif not data: + # We have no more data, bye-bye stream + return False + + if len(data) > 1: + lastv = ord(data[-1]) + if lastv == 0x0D or 0xD800 <= lastv <= 0xDBFF: + self._bufferedCharacter = data[-1] + data = data[:-1] + + if self.reportCharacterErrors: + self.reportCharacterErrors(data) + + # Replace invalid characters + data = data.replace("\r\n", "\n") + data = data.replace("\r", "\n") + + self.chunk = data + self.chunkSize = len(data) + + return True + + def characterErrorsUCS4(self, data): + for _ in range(len(invalid_unicode_re.findall(data))): + self.errors.append("invalid-codepoint") + + def characterErrorsUCS2(self, data): + # Someone picked the wrong compile option + # You lose + skip = False + for match in invalid_unicode_re.finditer(data): + if skip: + continue + codepoint = ord(match.group()) + pos = match.start() + # Pretty sure there should be endianness issues here + if _utils.isSurrogatePair(data[pos:pos + 2]): + # We have a surrogate pair! + char_val = _utils.surrogatePairToCodepoint(data[pos:pos + 2]) + if char_val in non_bmp_invalid_codepoints: + self.errors.append("invalid-codepoint") + skip = True + elif (codepoint >= 0xD800 and codepoint <= 0xDFFF and + pos == len(data) - 1): + self.errors.append("invalid-codepoint") + else: + skip = False + self.errors.append("invalid-codepoint") + + def charsUntil(self, characters, opposite=False): + """ Returns a string of characters from the stream up to but not + including any character in 'characters' or EOF. 'characters' must be + a container that supports the 'in' method and iteration over its + characters. + """ + + # Use a cache of regexps to find the required characters + try: + chars = charsUntilRegEx[(characters, opposite)] + except KeyError: + if __debug__: + for c in characters: + assert(ord(c) < 128) + regex = "".join(["\\x%02x" % ord(c) for c in characters]) + if not opposite: + regex = "^%s" % regex + chars = charsUntilRegEx[(characters, opposite)] = re.compile("[%s]+" % regex) + + rv = [] + + while True: + # Find the longest matching prefix + m = chars.match(self.chunk, self.chunkOffset) + if m is None: + # If nothing matched, and it wasn't because we ran out of chunk, + # then stop + if self.chunkOffset != self.chunkSize: + break + else: + end = m.end() + # If not the whole chunk matched, return everything + # up to the part that didn't match + if end != self.chunkSize: + rv.append(self.chunk[self.chunkOffset:end]) + self.chunkOffset = end + break + # If the whole remainder of the chunk matched, + # use it all and read the next chunk + rv.append(self.chunk[self.chunkOffset:]) + if not self.readChunk(): + # Reached EOF + break + + r = "".join(rv) + return r + + def unget(self, char): + # Only one character is allowed to be ungotten at once - it must + # be consumed again before any further call to unget + if char is not None: + if self.chunkOffset == 0: + # unget is called quite rarely, so it's a good idea to do + # more work here if it saves a bit of work in the frequently + # called char and charsUntil. + # So, just prepend the ungotten character onto the current + # chunk: + self.chunk = char + self.chunk + self.chunkSize += 1 + else: + self.chunkOffset -= 1 + assert self.chunk[self.chunkOffset] == char + + +class HTMLBinaryInputStream(HTMLUnicodeInputStream): + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + def __init__(self, source, override_encoding=None, transport_encoding=None, + same_origin_parent_encoding=None, likely_encoding=None, + default_encoding="windows-1252", useChardet=True): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + """ + # Raw Stream - for unicode objects this will encode to utf-8 and set + # self.charEncoding as appropriate + self.rawStream = self.openStream(source) + + HTMLUnicodeInputStream.__init__(self, self.rawStream) + + # Encoding Information + # Number of bytes to use when looking for a meta element with + # encoding information + self.numBytesMeta = 1024 + # Number of bytes to use when using detecting encoding using chardet + self.numBytesChardet = 100 + # Things from args + self.override_encoding = override_encoding + self.transport_encoding = transport_encoding + self.same_origin_parent_encoding = same_origin_parent_encoding + self.likely_encoding = likely_encoding + self.default_encoding = default_encoding + + # Determine encoding + self.charEncoding = self.determineEncoding(useChardet) + assert self.charEncoding[0] is not None + + # Call superclass + self.reset() + + def reset(self): + self.dataStream = self.charEncoding[0].codec_info.streamreader(self.rawStream, 'replace') + HTMLUnicodeInputStream.reset(self) + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = BytesIO(source) + + try: + stream.seek(stream.tell()) + except: # pylint:disable=bare-except + stream = BufferedStream(stream) + + return stream + + def determineEncoding(self, chardet=True): + # BOMs take precedence over everything + # This will also read past the BOM if present + charEncoding = self.detectBOM(), "certain" + if charEncoding[0] is not None: + return charEncoding + + # If we've been overriden, we've been overriden + charEncoding = lookupEncoding(self.override_encoding), "certain" + if charEncoding[0] is not None: + return charEncoding + + # Now check the transport layer + charEncoding = lookupEncoding(self.transport_encoding), "certain" + if charEncoding[0] is not None: + return charEncoding + + # Look for meta elements with encoding information + charEncoding = self.detectEncodingMeta(), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Parent document encoding + charEncoding = lookupEncoding(self.same_origin_parent_encoding), "tentative" + if charEncoding[0] is not None and not charEncoding[0].name.startswith("utf-16"): + return charEncoding + + # "likely" encoding + charEncoding = lookupEncoding(self.likely_encoding), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Guess with chardet, if available + if chardet: + try: + from pip._vendor.chardet.universaldetector import UniversalDetector + except ImportError: + pass + else: + buffers = [] + detector = UniversalDetector() + while not detector.done: + buffer = self.rawStream.read(self.numBytesChardet) + assert isinstance(buffer, bytes) + if not buffer: + break + buffers.append(buffer) + detector.feed(buffer) + detector.close() + encoding = lookupEncoding(detector.result['encoding']) + self.rawStream.seek(0) + if encoding is not None: + return encoding, "tentative" + + # Try the default encoding + charEncoding = lookupEncoding(self.default_encoding), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Fallback to html5lib's default if even that hasn't worked + return lookupEncoding("windows-1252"), "tentative" + + def changeEncoding(self, newEncoding): + assert self.charEncoding[1] != "certain" + newEncoding = lookupEncoding(newEncoding) + if newEncoding is None: + return + if newEncoding.name in ("utf-16be", "utf-16le"): + newEncoding = lookupEncoding("utf-8") + assert newEncoding is not None + elif newEncoding == self.charEncoding[0]: + self.charEncoding = (self.charEncoding[0], "certain") + else: + self.rawStream.seek(0) + self.charEncoding = (newEncoding, "certain") + self.reset() + raise _ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding)) + + def detectBOM(self): + """Attempts to detect at BOM at the start of the stream. If + an encoding can be determined from the BOM return the name of the + encoding otherwise return None""" + bomDict = { + codecs.BOM_UTF8: 'utf-8', + codecs.BOM_UTF16_LE: 'utf-16le', codecs.BOM_UTF16_BE: 'utf-16be', + codecs.BOM_UTF32_LE: 'utf-32le', codecs.BOM_UTF32_BE: 'utf-32be' + } + + # Go to beginning of file and read in 4 bytes + string = self.rawStream.read(4) + assert isinstance(string, bytes) + + # Try detecting the BOM using bytes from the string + encoding = bomDict.get(string[:3]) # UTF-8 + seek = 3 + if not encoding: + # Need to detect UTF-32 before UTF-16 + encoding = bomDict.get(string) # UTF-32 + seek = 4 + if not encoding: + encoding = bomDict.get(string[:2]) # UTF-16 + seek = 2 + + # Set the read position past the BOM if one was found, otherwise + # set it to the start of the stream + if encoding: + self.rawStream.seek(seek) + return lookupEncoding(encoding) + else: + self.rawStream.seek(0) + return None + + def detectEncodingMeta(self): + """Report the encoding declared by the meta element + """ + buffer = self.rawStream.read(self.numBytesMeta) + assert isinstance(buffer, bytes) + parser = EncodingParser(buffer) + self.rawStream.seek(0) + encoding = parser.getEncoding() + + if encoding is not None and encoding.name in ("utf-16be", "utf-16le"): + encoding = lookupEncoding("utf-8") + + return encoding + + +class EncodingBytes(bytes): + """String-like object with an associated position and various extra methods + If the position is ever greater than the string length then an exception is + raised""" + def __new__(self, value): + assert isinstance(value, bytes) + return bytes.__new__(self, value.lower()) + + def __init__(self, value): + # pylint:disable=unused-argument + self._position = -1 + + def __iter__(self): + return self + + def __next__(self): + p = self._position = self._position + 1 + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + return self[p:p + 1] + + def next(self): + # Py2 compat + return self.__next__() + + def previous(self): + p = self._position + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + self._position = p = p - 1 + return self[p:p + 1] + + def setPosition(self, position): + if self._position >= len(self): + raise StopIteration + self._position = position + + def getPosition(self): + if self._position >= len(self): + raise StopIteration + if self._position >= 0: + return self._position + else: + return None + + position = property(getPosition, setPosition) + + def getCurrentByte(self): + return self[self.position:self.position + 1] + + currentByte = property(getCurrentByte) + + def skip(self, chars=spaceCharactersBytes): + """Skip past a list of characters""" + p = self.position # use property for the error-checking + while p < len(self): + c = self[p:p + 1] + if c not in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def skipUntil(self, chars): + p = self.position + while p < len(self): + c = self[p:p + 1] + if c in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def matchBytes(self, bytes): + """Look for a sequence of bytes at the start of a string. If the bytes + are found return True and advance the position to the byte after the + match. Otherwise return False and leave the position alone""" + p = self.position + data = self[p:p + len(bytes)] + rv = data.startswith(bytes) + if rv: + self.position += len(bytes) + return rv + + def jumpTo(self, bytes): + """Look for the next sequence of bytes matching a given sequence. If + a match is found advance the position to the last byte of the match""" + newPosition = self[self.position:].find(bytes) + if newPosition > -1: + # XXX: This is ugly, but I can't see a nicer way to fix this. + if self._position == -1: + self._position = 0 + self._position += (newPosition + len(bytes) - 1) + return True + else: + raise StopIteration + + +class EncodingParser(object): + """Mini parser for detecting character encoding from meta elements""" + + def __init__(self, data): + """string - the data to work on for encoding detection""" + self.data = EncodingBytes(data) + self.encoding = None + + def getEncoding(self): + methodDispatch = ( + (b"<!--", self.handleComment), + (b"<meta", self.handleMeta), + (b"</", self.handlePossibleEndTag), + (b"<!", self.handleOther), + (b"<?", self.handleOther), + (b"<", self.handlePossibleStartTag)) + for _ in self.data: + keepParsing = True + for key, method in methodDispatch: + if self.data.matchBytes(key): + try: + keepParsing = method() + break + except StopIteration: + keepParsing = False + break + if not keepParsing: + break + + return self.encoding + + def handleComment(self): + """Skip over comments""" + return self.data.jumpTo(b"-->") + + def handleMeta(self): + if self.data.currentByte not in spaceCharactersBytes: + # if we have <meta not followed by a space so just keep going + return True + # We have a valid meta element we want to search for attributes + hasPragma = False + pendingEncoding = None + while True: + # Try to find the next attribute after the current position + attr = self.getAttribute() + if attr is None: + return True + else: + if attr[0] == b"http-equiv": + hasPragma = attr[1] == b"content-type" + if hasPragma and pendingEncoding is not None: + self.encoding = pendingEncoding + return False + elif attr[0] == b"charset": + tentativeEncoding = attr[1] + codec = lookupEncoding(tentativeEncoding) + if codec is not None: + self.encoding = codec + return False + elif attr[0] == b"content": + contentParser = ContentAttrParser(EncodingBytes(attr[1])) + tentativeEncoding = contentParser.parse() + if tentativeEncoding is not None: + codec = lookupEncoding(tentativeEncoding) + if codec is not None: + if hasPragma: + self.encoding = codec + return False + else: + pendingEncoding = codec + + def handlePossibleStartTag(self): + return self.handlePossibleTag(False) + + def handlePossibleEndTag(self): + next(self.data) + return self.handlePossibleTag(True) + + def handlePossibleTag(self, endTag): + data = self.data + if data.currentByte not in asciiLettersBytes: + # If the next byte is not an ascii letter either ignore this + # fragment (possible start tag case) or treat it according to + # handleOther + if endTag: + data.previous() + self.handleOther() + return True + + c = data.skipUntil(spacesAngleBrackets) + if c == b"<": + # return to the first step in the overall "two step" algorithm + # reprocessing the < byte + data.previous() + else: + # Read all attributes + attr = self.getAttribute() + while attr is not None: + attr = self.getAttribute() + return True + + def handleOther(self): + return self.data.jumpTo(b">") + + def getAttribute(self): + """Return a name,value pair for the next attribute in the stream, + if one is found, or None""" + data = self.data + # Step 1 (skip chars) + c = data.skip(spaceCharactersBytes | frozenset([b"/"])) + assert c is None or len(c) == 1 + # Step 2 + if c in (b">", None): + return None + # Step 3 + attrName = [] + attrValue = [] + # Step 4 attribute name + while True: + if c == b"=" and attrName: + break + elif c in spaceCharactersBytes: + # Step 6! + c = data.skip() + break + elif c in (b"/", b">"): + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrName.append(c.lower()) + elif c is None: + return None + else: + attrName.append(c) + # Step 5 + c = next(data) + # Step 7 + if c != b"=": + data.previous() + return b"".join(attrName), b"" + # Step 8 + next(data) + # Step 9 + c = data.skip() + # Step 10 + if c in (b"'", b'"'): + # 10.1 + quoteChar = c + while True: + # 10.2 + c = next(data) + # 10.3 + if c == quoteChar: + next(data) + return b"".join(attrName), b"".join(attrValue) + # 10.4 + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + # 10.5 + else: + attrValue.append(c) + elif c == b">": + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + # Step 11 + while True: + c = next(data) + if c in spacesAngleBrackets: + return b"".join(attrName), b"".join(attrValue) + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + + +class ContentAttrParser(object): + def __init__(self, data): + assert isinstance(data, bytes) + self.data = data + + def parse(self): + try: + # Check if the attr name is charset + # otherwise return + self.data.jumpTo(b"charset") + self.data.position += 1 + self.data.skip() + if not self.data.currentByte == b"=": + # If there is no = sign keep looking for attrs + return None + self.data.position += 1 + self.data.skip() + # Look for an encoding between matching quote marks + if self.data.currentByte in (b'"', b"'"): + quoteMark = self.data.currentByte + self.data.position += 1 + oldPosition = self.data.position + if self.data.jumpTo(quoteMark): + return self.data[oldPosition:self.data.position] + else: + return None + else: + # Unquoted value + oldPosition = self.data.position + try: + self.data.skipUntil(spaceCharactersBytes) + return self.data[oldPosition:self.data.position] + except StopIteration: + # Return the whole remaining value + return self.data[oldPosition:] + except StopIteration: + return None + + +def lookupEncoding(encoding): + """Return the python codec name corresponding to an encoding or None if the + string doesn't correspond to a valid encoding.""" + if isinstance(encoding, binary_type): + try: + encoding = encoding.decode("ascii") + except UnicodeDecodeError: + return None + + if encoding is not None: + try: + return webencodings.lookup(encoding) + except AttributeError: + return None + else: + return None diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_tokenizer.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_tokenizer.py new file mode 100644 index 0000000..178f6e7 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_tokenizer.py @@ -0,0 +1,1721 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import unichr as chr + +from collections import deque + +from .constants import spaceCharacters +from .constants import entities +from .constants import asciiLetters, asciiUpper2Lower +from .constants import digits, hexDigits, EOF +from .constants import tokenTypes, tagTokenTypes +from .constants import replacementCharacters + +from ._inputstream import HTMLInputStream + +from ._trie import Trie + +entitiesTrie = Trie(entities) + + +class HTMLTokenizer(object): + """ This class takes care of tokenizing HTML. + + * self.currentToken + Holds the token that is currently being processed. + + * self.state + Holds a reference to the method to be invoked... XXX + + * self.stream + Points to HTMLInputStream object. + """ + + def __init__(self, stream, parser=None, **kwargs): + + self.stream = HTMLInputStream(stream, **kwargs) + self.parser = parser + + # Setup the initial tokenizer state + self.escapeFlag = False + self.lastFourChars = [] + self.state = self.dataState + self.escape = False + + # The current token being created + self.currentToken = None + super(HTMLTokenizer, self).__init__() + + def __iter__(self): + """ This is where the magic happens. + + We do our usually processing through the states and when we have a token + to return we yield the token which pauses processing until the next token + is requested. + """ + self.tokenQueue = deque([]) + # Start processing. When EOF is reached self.state will return False + # instead of True and the loop will terminate. + while self.state(): + while self.stream.errors: + yield {"type": tokenTypes["ParseError"], "data": self.stream.errors.pop(0)} + while self.tokenQueue: + yield self.tokenQueue.popleft() + + def consumeNumberEntity(self, isHex): + """This function returns either U+FFFD or the character based on the + decimal or hexadecimal representation. It also discards ";" if present. + If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked. + """ + + allowed = digits + radix = 10 + if isHex: + allowed = hexDigits + radix = 16 + + charStack = [] + + # Consume all the characters that are in range while making sure we + # don't hit an EOF. + c = self.stream.char() + while c in allowed and c is not EOF: + charStack.append(c) + c = self.stream.char() + + # Convert the set of characters consumed to an int. + charAsInt = int("".join(charStack), radix) + + # Certain characters get replaced with others + if charAsInt in replacementCharacters: + char = replacementCharacters[charAsInt] + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + elif ((0xD800 <= charAsInt <= 0xDFFF) or + (charAsInt > 0x10FFFF)): + char = "\uFFFD" + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + else: + # Should speed up this check somehow (e.g. move the set to a constant) + if ((0x0001 <= charAsInt <= 0x0008) or + (0x000E <= charAsInt <= 0x001F) or + (0x007F <= charAsInt <= 0x009F) or + (0xFDD0 <= charAsInt <= 0xFDEF) or + charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, + 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, + 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, + 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, + 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, + 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, + 0xFFFFF, 0x10FFFE, 0x10FFFF])): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + try: + # Try/except needed as UCS-2 Python builds' unichar only works + # within the BMP. + char = chr(charAsInt) + except ValueError: + v = charAsInt - 0x10000 + char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF)) + + # Discard the ; if present. Otherwise, put it back on the queue and + # invoke parseError on parser. + if c != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "numeric-entity-without-semicolon"}) + self.stream.unget(c) + + return char + + def consumeEntity(self, allowedChar=None, fromAttribute=False): + # Initialise to the default output for when no entity is matched + output = "&" + + charStack = [self.stream.char()] + if (charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&") or + (allowedChar is not None and allowedChar == charStack[0])): + self.stream.unget(charStack[0]) + + elif charStack[0] == "#": + # Read the next character to see if it's hex or decimal + hex = False + charStack.append(self.stream.char()) + if charStack[-1] in ("x", "X"): + hex = True + charStack.append(self.stream.char()) + + # charStack[-1] should be the first digit + if (hex and charStack[-1] in hexDigits) \ + or (not hex and charStack[-1] in digits): + # At least one digit found, so consume the whole number + self.stream.unget(charStack[-1]) + output = self.consumeNumberEntity(hex) + else: + # No digits found + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "expected-numeric-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + else: + # At this point in the process might have named entity. Entities + # are stored in the global variable "entities". + # + # Consume characters and compare to these to a substring of the + # entity names in the list until the substring no longer matches. + while (charStack[-1] is not EOF): + if not entitiesTrie.has_keys_with_prefix("".join(charStack)): + break + charStack.append(self.stream.char()) + + # At this point we have a string that starts with some characters + # that may match an entity + # Try to find the longest entity the string will match to take care + # of ¬i for instance. + try: + entityName = entitiesTrie.longest_prefix("".join(charStack[:-1])) + entityLength = len(entityName) + except KeyError: + entityName = None + + if entityName is not None: + if entityName[-1] != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "named-entity-without-semicolon"}) + if (entityName[-1] != ";" and fromAttribute and + (charStack[entityLength] in asciiLetters or + charStack[entityLength] in digits or + charStack[entityLength] == "=")): + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + else: + output = entities[entityName] + self.stream.unget(charStack.pop()) + output += "".join(charStack[entityLength:]) + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-named-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + if fromAttribute: + self.currentToken["data"][-1][1] += output + else: + if output in spaceCharacters: + tokenType = "SpaceCharacters" + else: + tokenType = "Characters" + self.tokenQueue.append({"type": tokenTypes[tokenType], "data": output}) + + def processEntityInAttribute(self, allowedChar): + """This method replaces the need for "entityInAttributeValueState". + """ + self.consumeEntity(allowedChar=allowedChar, fromAttribute=True) + + def emitCurrentToken(self): + """This method is a generic handler for emitting the tags. It also sets + the state to "data" because that's what's needed after a token has been + emitted. + """ + token = self.currentToken + # Add token to the queue to be yielded + if (token["type"] in tagTokenTypes): + token["name"] = token["name"].translate(asciiUpper2Lower) + if token["type"] == tokenTypes["EndTag"]: + if token["data"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "attributes-in-end-tag"}) + if token["selfClosing"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "self-closing-flag-on-end-tag"}) + self.tokenQueue.append(token) + self.state = self.dataState + + # Below are the various tokenizer states worked out. + def dataState(self): + data = self.stream.char() + if data == "&": + self.state = self.entityDataState + elif data == "<": + self.state = self.tagOpenState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\u0000"}) + elif data is EOF: + # Tokenization ends. + return False + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any <!-- or --> sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def entityDataState(self): + self.consumeEntity() + self.state = self.dataState + return True + + def rcdataState(self): + data = self.stream.char() + if data == "&": + self.state = self.characterReferenceInRcdata + elif data == "<": + self.state = self.rcdataLessThanSignState + elif data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any <!-- or --> sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def characterReferenceInRcdata(self): + self.consumeEntity() + self.state = self.rcdataState + return True + + def rawtextState(self): + data = self.stream.char() + if data == "<": + self.state = self.rawtextLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataState(self): + data = self.stream.char() + if data == "<": + self.state = self.scriptDataLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def plaintextState(self): + data = self.stream.char() + if data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + self.stream.charsUntil("\u0000")}) + return True + + def tagOpenState(self): + data = self.stream.char() + if data == "!": + self.state = self.markupDeclarationOpenState + elif data == "/": + self.state = self.closeTagOpenState + elif data in asciiLetters: + self.currentToken = {"type": tokenTypes["StartTag"], + "name": data, "data": [], + "selfClosing": False, + "selfClosingAcknowledged": False} + self.state = self.tagNameState + elif data == ">": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-right-bracket"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"}) + self.state = self.dataState + elif data == "?": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-question-mark"}) + self.stream.unget(data) + self.state = self.bogusCommentState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.dataState + return True + + def closeTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.currentToken = {"type": tokenTypes["EndTag"], "name": data, + "data": [], "selfClosing": False} + self.state = self.tagNameState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-right-bracket"}) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-eof"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.state = self.dataState + else: + # XXX data can be _'_... + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-char", + "datavars": {"data": data}}) + self.stream.unget(data) + self.state = self.bogusCommentState + return True + + def tagNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == ">": + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-tag-name"}) + self.state = self.dataState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + else: + self.currentToken["name"] += data + # (Don't use charsUntil here, because tag names are + # very short and it's faster to not do anything fancy) + return True + + def rcdataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rcdataEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rcdataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rawtextLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rawtextEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def rawtextEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rawtextEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def rawtextEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def scriptDataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEndTagOpenState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<!"}) + self.state = self.scriptDataEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.scriptDataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapeStartState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapeStartDashState + else: + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapeStartDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashDashState + else: + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashState + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.state = self.dataState + else: + chars = self.stream.charsUntil(("<", "-", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashDashState + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataEscapedState + elif data == EOF: + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataEscapedState + elif data == EOF: + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEscapedEndTagOpenState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data}) + self.temporaryBuffer = data + self.state = self.scriptDataDoubleEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer = data + self.state = self.scriptDataEscapedEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapeStartState(self): + data = self.stream.char() + if data in (spaceCharacters | frozenset(("/", ">"))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataDoubleEscapedState + else: + self.state = self.scriptDataEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + return True + + def scriptDataDoubleEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"}) + self.temporaryBuffer = "" + self.state = self.scriptDataDoubleEscapeEndState + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapeEndState(self): + data = self.stream.char() + if data in (spaceCharacters | frozenset(("/", ">"))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataEscapedState + else: + self.state = self.scriptDataDoubleEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def beforeAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data in ("'", '"', "=", "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-name-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def attributeNameState(self): + data = self.stream.char() + leavingThisState = True + emitToken = False + if data == "=": + self.state = self.beforeAttributeValueState + elif data in asciiLetters: + self.currentToken["data"][-1][0] += data +\ + self.stream.charsUntil(asciiLetters, True) + leavingThisState = False + elif data == ">": + # XXX If we emit here the attributes are converted to a dict + # without being checked and when the code below runs we error + # because data is a dict not a list + emitToken = True + elif data in spaceCharacters: + self.state = self.afterAttributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][0] += "\uFFFD" + leavingThisState = False + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"][-1][0] += data + leavingThisState = False + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-attribute-name"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][0] += data + leavingThisState = False + + if leavingThisState: + # Attributes are not dropped at this stage. That happens when the + # start tag token is emitted so values can still be safely appended + # to attributes, but we do want to report the parse error in time. + self.currentToken["data"][-1][0] = ( + self.currentToken["data"][-1][0].translate(asciiUpper2Lower)) + for name, _ in self.currentToken["data"][:-1]: + if self.currentToken["data"][-1][0] == name: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "duplicate-attribute"}) + break + # XXX Fix for above XXX + if emitToken: + self.emitCurrentToken() + return True + + def afterAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "=": + self.state = self.beforeAttributeValueState + elif data == ">": + self.emitCurrentToken() + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-after-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-end-of-tag-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def beforeAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "\"": + self.state = self.attributeValueDoubleQuotedState + elif data == "&": + self.state = self.attributeValueUnQuotedState + self.stream.unget(data) + elif data == "'": + self.state = self.attributeValueSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-right-bracket"}) + self.emitCurrentToken() + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + self.state = self.attributeValueUnQuotedState + elif data in ("=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "equals-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + return True + + def attributeValueDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute('"') + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-double-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("\"", "&", "\u0000")) + return True + + def attributeValueSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute("'") + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-single-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("'", "&", "\u0000")) + return True + + def attributeValueUnQuotedState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == "&": + self.processEntityInAttribute(">") + elif data == ">": + self.emitCurrentToken() + elif data in ('"', "'", "=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-no-quotes"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.stream.charsUntil( + frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters) + return True + + def afterAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-EOF-after-attribute-value"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-attribute-value"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def selfClosingStartTagState(self): + data = self.stream.char() + if data == ">": + self.currentToken["selfClosing"] = True + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "unexpected-EOF-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def bogusCommentState(self): + # Make a new comment token and give it as value all the characters + # until the first > or EOF (charsUntil checks for EOF automatically) + # and emit it. + data = self.stream.charsUntil(">") + data = data.replace("\u0000", "\uFFFD") + self.tokenQueue.append( + {"type": tokenTypes["Comment"], "data": data}) + + # Eat the character directly after the bogus comment which is either a + # ">" or an EOF. + self.stream.char() + self.state = self.dataState + return True + + def markupDeclarationOpenState(self): + charStack = [self.stream.char()] + if charStack[-1] == "-": + charStack.append(self.stream.char()) + if charStack[-1] == "-": + self.currentToken = {"type": tokenTypes["Comment"], "data": ""} + self.state = self.commentStartState + return True + elif charStack[-1] in ('d', 'D'): + matched = True + for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'), + ('y', 'Y'), ('p', 'P'), ('e', 'E')): + charStack.append(self.stream.char()) + if charStack[-1] not in expected: + matched = False + break + if matched: + self.currentToken = {"type": tokenTypes["Doctype"], + "name": "", + "publicId": None, "systemId": None, + "correct": True} + self.state = self.doctypeState + return True + elif (charStack[-1] == "[" and + self.parser is not None and + self.parser.tree.openElements and + self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace): + matched = True + for expected in ["C", "D", "A", "T", "A", "["]: + charStack.append(self.stream.char()) + if charStack[-1] != expected: + matched = False + break + if matched: + self.state = self.cdataSectionState + return True + + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-dashes-or-doctype"}) + + while charStack: + self.stream.unget(charStack.pop()) + self.state = self.bogusCommentState + return True + + def commentStartState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentStartDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + self.state = self.commentState + return True + + def commentStartDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + \ + self.stream.charsUntil(("-", "\u0000")) + return True + + def commentEndDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentEndState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--\uFFFD" + self.state = self.commentState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-bang-after-double-dash-in-comment"}) + self.state = self.commentEndBangState + elif data == "-": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-dash-after-double-dash-in-comment"}) + self.currentToken["data"] += data + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-double-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-comment"}) + self.currentToken["data"] += "--" + data + self.state = self.commentState + return True + + def commentEndBangState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "-": + self.currentToken["data"] += "--!" + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--!\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-bang-state"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "--!" + data + self.state = self.commentState + return True + + def doctypeState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "need-space-after-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeNameState + return True + + def beforeDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-right-bracket"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] = "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] = data + self.state = self.doctypeNameState + return True + + def doctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.state = self.afterDoctypeNameState + elif data == ">": + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype-name"}) + self.currentToken["correct"] = False + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] += data + return True + + def afterDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.currentToken["correct"] = False + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + if data in ("p", "P"): + matched = True + for expected in (("u", "U"), ("b", "B"), ("l", "L"), + ("i", "I"), ("c", "C")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypePublicKeywordState + return True + elif data in ("s", "S"): + matched = True + for expected in (("y", "Y"), ("s", "S"), ("t", "T"), + ("e", "E"), ("m", "M")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypeSystemKeywordState + return True + + # All the characters read before the current 'data' will be + # [a-zA-Z], so they're garbage in the bogus doctype and can be + # discarded; only the latest character might be '>' or EOF + # and needs to be ungetted + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-space-or-right-bracket-in-doctype", "datavars": + {"data": data}}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + + return True + + def afterDoctypePublicKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypePublicIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + return True + + def beforeDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypePublicIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def doctypePublicIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def afterDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.betweenDoctypePublicAndSystemIdentifiersState + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def betweenDoctypePublicAndSystemIdentifiersState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def afterDoctypeSystemKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeSystemIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + return True + + def beforeDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypeSystemIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def doctypeSystemIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def afterDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.state = self.bogusDoctypeState + return True + + def bogusDoctypeState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + # XXX EMIT + self.stream.unget(data) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + pass + return True + + def cdataSectionState(self): + data = [] + while True: + data.append(self.stream.charsUntil("]")) + data.append(self.stream.charsUntil(">")) + char = self.stream.char() + if char == EOF: + break + else: + assert char == ">" + if data[-1][-2:] == "]]": + data[-1] = data[-1][:-2] + break + else: + data.append(char) + + data = "".join(data) # pylint:disable=redefined-variable-type + # Deal with null here rather than in the parser + nullCount = data.count("\u0000") + if nullCount > 0: + for _ in range(nullCount): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + data = data.replace("\u0000", "\uFFFD") + if data: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": data}) + self.state = self.dataState + return True diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__init__.py new file mode 100644 index 0000000..a5ba4bf --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__init__.py @@ -0,0 +1,14 @@ +from __future__ import absolute_import, division, unicode_literals + +from .py import Trie as PyTrie + +Trie = PyTrie + +# pylint:disable=wrong-import-position +try: + from .datrie import Trie as DATrie +except ImportError: + pass +else: + Trie = DATrie +# pylint:enable=wrong-import-position diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cba353f72aa34181387ab0e5f0340eede2c90bf0 GIT binary patch literal 430 zcmYk1!Ab)$5QZn&?OLnV9()0hd(c?g;zdM3K`$a&P!}O=n^Z%S-6hGc-9C+1pTu|A zt04Fao=o=Sg!wZ0XPC^4`u*Pb`{(mM0{DV|w&mh8=jP6V0YefLN|3?{RzVUVV3-9m zRGlP3z@wy74_alzDP05)knM%QH<vwqg}|RD$f8H!-K4|9dx$$ft}nzvvzyLLE=$X) zP(`k7(`BL(M&wyDC^Iq78K+WMu2X4#+>{WbCY)-)Z{l9lqjXW)Qgcc*b~zn*gbocZ zY909?x~+YA60y{__r<w?H(S^3f0tV4`UA9IxW(^^6k1fN<)lhAS>%#&ZOD8{tQ;<8 ztBQ@yF`dk3^>R2`tl!l9$k|Iqrlb(Xfyj(ar92obzGh}+yx2Oec*b%~UagW7DQ1NF kaR{X%6PD7$qHek;DrcqSr+!bf<FJRfaTs7UKszYHe^b(S1ONa4 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea6a125fcfdad8274730ee3b66f9e10f792885ac GIT binary patch literal 1513 zcmZuxL2uhO6ecOzmK`VUl3;6wt}w7(bf}f0DFzfluwmVH7?w){6c9ELvPdV2DN7+~ z*D=(~oS{AM7Yw`Ym+U|2I$%KmLQi{-PBVKe0X|XWBj5LZ?~zY7H#>j-_UDhkdxZQ& zR+<mvFQJ<QFoFoGNKRv#vzX;x>`|O!%Fi2dgOcxv@PvO&gfANlFK&v)2??8TVJ8W_ z`c5)1g_>B&v%D;{tpkxwGm{nL`tD?$rG=1OWmf7$nUL14ACj`n#%C#Rf8P)eHuDUO zBrz2vW`f3^*mzBb)P--yzG#T%HHjOdB?9<1MO$>>+j>oW5(faPTl=Rvlk?BM8W^jS z)b<96k-bzU#`K1T?path$0>8s2mx7cyV-{yODwI(f?co$dBxs<45L6luwKO$^n^Gp zRIuxyV$TWAgx+yVZw|vlk;o2o^C_5fQjwpwU(t$QkT>A2{fhp|F8veo2LUBI#wOaD zmzg~eS<U+UHJ!n9v($2!&2$S+csGekolO%fqiLd}VWEW7CQ3(<RgZ^**;E{uFZk1R za5Z}TWH^7Br~A;(#?fh1X62)73?Y<ybdbxrFf)UbuJfrJi$X`|HdjwoHi$S16LD0l zUtYay9~x=XA}^2bA{k`XB=h^IZGR-MO#e_7Ddh90f9n|fb;C?bsdW>)YaiWe4~~Hn z@r_hNy#e$34j3TW=G-NP^N=nVy6;!pFfaia!nRmI12%8p#{FO7zDDPVU}g_0azPg4 zIV#R7b^)q`;vE4=y6n7wYIeyw{WfF{gT@G<r$2&^15kT_*onS0h^O8?PYg#U9J9oi znc0SwB|y4GI|y*k0sN5f8el9A2lx~Q71Y_Nsk;>boISH}1)=f)vY?+p{Q-@KKm+bU z#Wu(<Y!6BaynCxNK&<zISnyiVpTQFdvg5Z{jUahLC*w0&drFS$;Cp%Xjn;);<4d#u zvfWYz>@oI+=N|Gz83+xi&+gG}y3OW0j_bPT8cV!Wj^)QNz@#8POi2Y?_Q((uL60Hr zctzF_wbV-KuVi6oJsO9{B>x;X8~1EL3g-7d0Lr;xq;?%}K2CDUdEMbWFT_OQxXbzF zBvCgjEzU)ea=xsNT{zwW)c0XjZ{Cz^DwP5kyqeAc3#<n1iWlo1yXk;I#kSf(E9kiU za2&QU_Hbe+8e(g_Q5u!f$f4dy3#DXg;n6g@fzx=<zj0Q?2o9G7jxf<qfnC=1{sAxm BV0{1p literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5d97125a563ed6235af24fea4d335386562922d GIT binary patch literal 2032 zcmb7F%WfMt6eZ`S(O9+>+X?JG-6txvu^J>nfg&j4CPh)8@TNu$2rh_`NZBLLLnbLj zHpZLCU(r>!{gVCzw*?C17rN@b9NCc#BaJEWlDZ`CIrl-%!^OqupFjTE|J@_xZ!*{5 zKY0pW{S1N=PE(T64$Yj7lerz2qRvUZ%<lwt?xwXY?1V7)Kwk%aM9GhY`#d-&JP^^; z?fAU*3u%R~z#?h6W;yPvA{}YLl5AK=Z9<-m6O|OXX^!%wS8&17L<<?Gszr^rD-!`@ zU5klk`eZ0xQ83g)YZuLh$y4a+R}g}9C?_3<Q|_FTj>}!{!RS?-kPQ#vf57WJg0aTe zc!MvV(@w~j_%dkfyvgst81WUp3gZG_0RDHS55{{A2y6j#4AwK~Y79b?DLHc{-<EVh zr{p>LZR^a{PU&iQ>Zs4P$LW;5q?3E43u{YfUg-?{(wkCBj=$O?$IU&W1MUoJr89+{ zC1K&@1F%)MwpR9?Gxy9d{gMpA(tSdX_xB(bK+D}ZUEfaA%_DK5HnWk^n_aP~v`q2? zWk@SBt`gdKxNIVba;|io_k=|LroIc|{6We>8aL+L1kblI+Qu6cNp5_`V;vhGa*?T4 zU_2$#zVRw$?=Y6ixM0_KI5++{PDkQTBG<w4zvK2$CgWI(_BfX9evxt^Rl9f8*6D+O zcQWRW)Hm#LuX}Rz;9>vtMb`To+CkplZ4Z;-eakXU??1}KDOVGPO5533<h+pWL!G6M z)1=#G;HhW>B^b7bCnjVp$rH_3gn3y3L1;jiXhcKkD^8QH(9=b9a_eH}WlAx%*lkMj zd<kh7kfQ*?Om|vTHbK{NBwCesQJ|}p*npX7FxD$_9Rq#F?tw<xYN4lhW`M6(dsxHR zaJ&Ml34lTcRG^M=Q;}E5v_ifHT4M}$Fop~+@ES8byKn^x;V%8dl6?txW#*q*-6`}> z*)SEE$hF|MFu-l=?=@76Gh9)|-kXEHjH_LFLtG)MCEd8d{olAQFm@m`mLX#w&fzs@ zZeA|#+>F_PGnmN%Enf%LqDoBjETtwGO3_ay*RpE2d_0F*x2SlbZi{Bt4r9geBzuwQ zLssEkRMba+aUC0RKbyneu-G?Qxiy!iw8#&H(r>}y6JYSg9E(-U;_CTZ<F8&lkL8rT zDHNXqfiLGstlvPQG6HwCfe%3*XM!;kF_sm4l;Rw2=<z5{s}=bUn3M0Kcpn9pmfS>v zRUt9<5?z-FJ(n4K74W**FG3wA_Mr)B*a+R~7unIS@3a<>LVu)35-3Q#?9xSnpAYy9 z*|*DXl}n&8%kbE3%^tcf1@&m3YM*suB}{Gm`)BC*O>|87q;m8-yyYqcvF0>r!)dtx E0Tm6sqyPW_ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fb0094134ea3a70831b4f3bfc8977c61fa27548 GIT binary patch literal 2237 zcma)7&2Aev5GJ`lTCHVUNmIv0+th8*7AhJkLH;g5kTh)y6ooD|T0lratVGIQdv_(1 zlp_nPOO*#Hdg~kX4f+ne7ATNY?>TjbYbmi21mR+b<Z#I0eDlLw>+A8qzyJO8zmSlB z$ZO4q@k99ak3a+wG$T3f(VX>I?)5y1JeK)+&<oty%fh_YtHIb8K^EopUQEgNM1-RD zoQRr?7hbO}qMt~s{sK-UEzfQyeLc!1M)EWtkCd^INKaCojtbkH6zO0jB+pVKRg&oz zwRIz>hMUu|gvnYz)pB5XCWqz)#q+53_f#qec=)n;Fn9>RegZ_29u=g=1QqN#>3PBv zKJ;*15ken`nuwqeMP0<u*F;k^#QJmEi^PW51WsM7!Syex2o4)CAlR@+HIL!fKL9a+ z6)Gs{AzhGf$$~DZzGj&47W6k-(von`_|@tHXMym6h9WSv5@d%AW|1JED(nu>G;F8_ zU83>d22zq=n{#SFjiC$nGoj>|xlOd&Vm1aC3vH5OAXNa;z+&wimQMd9ssZztsxwyU zNn&K@BvGB=C=*iY&futHvYW&H^hDg&_xPPb|MckQt>NrhKDYsGzv%3B#_9OFJ3Gs+ z-_GSs=&44g`}v71#7K1xOrG7z(td{<@JVNU+8&?2tl!_4g`AGngEh3GGHJGpUTbrn z7OCO9eLouwz~2wrE8*Gpqb%D!lBaq%pJ=n&m%AEHE%vn~%DKL7y(G)5k21Et2NCj} zQX^#pE)tX2P(yG@0n<u=50b%wgfpy{$-*|O`FNBTMgvg3mf6tyxYc1*k#)GTjh5Gp z(EtRJ&@CFVkZ#bB&eqSFaxO&BSQjF=6NBK89EIRw@D^3?0k6f>4s_OoJ6=@V;CwJD zOaicTj=~N*LT8uG6uw$r1q=dnPAP;6frzA)Ql_qgK&6>F%@>u{I3!oW`POUt8fW_4 z!aJ+7J|^+obRn)F!Z|{)G;W2aTX_qbfMrQ{FkvpDsXjy_(NC{AagFnRX+U4jIj%4D zHP4J&Ep}HrYaoVc<UIHn3`(dZN0Hu!o*psi;SLR=J~hs>2r?u%B=R97z3M{mKV@?^ z_e_A2;D1(n3*RSme;yRgC3nFp4rDZ$hox^qlwN=aby7mKOuu%!gB=2AgDce^Wq4Ry z@)nemG7#(@nFq(yUr-B_n$j-=S5kaDq2+beCfr}4MXgA^51sY2G&Y86p^Sc(ngfL{ zS6E~eyb8oc3S^iNty&eM;aJIGI<+htS$2@x!0oj(RhLlyJl>A?G4S;@AcStym^Elj zw^-BVjn6LACT+ktX0y8U0jB8+d>(y@1Iwd(?)ga7N4-pm7&^?+j-ssfWQ5=eb`r zpyWEvg3bLiWCMrno?zfDT=M}}D9|oNyzbr;Fc*_eeTL)$CJ3AZrWI7#^EooUK=LJ$ z7LxNo*eeH#b|r`-%De*cE(q$&KnP&sJ7g}i2HSw~Y{#MTrd=56F_xnu$tCAD<~$#X zNrq#n7RQq$t5(zpc#)5gApB|<$tOshtG>d~t82OuRyy~_)nTAFfJ8K^M_%>CSKV5- zwT4QE6EjhuRAH%69uj<|>?S-2?X$<At<$M{glt$n+AgY~8ut?|-C?%&=$prA>zl4( Uqx+R<53r<Ze0;A!xWMQA4|PZCVE_OC literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/_base.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/_base.py new file mode 100644 index 0000000..a1158bb --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/_base.py @@ -0,0 +1,37 @@ +from __future__ import absolute_import, division, unicode_literals + +from collections import Mapping + + +class Trie(Mapping): + """Abstract base class for tries""" + + def keys(self, prefix=None): + # pylint:disable=arguments-differ + keys = super(Trie, self).keys() + + if prefix is None: + return set(keys) + + return {x for x in keys if x.startswith(prefix)} + + def has_keys_with_prefix(self, prefix): + for key in self.keys(): + if key.startswith(prefix): + return True + + return False + + def longest_prefix(self, prefix): + if prefix in self: + return prefix + + for i in range(1, len(prefix) + 1): + if prefix[:-i] in self: + return prefix[:-i] + + raise KeyError(prefix) + + def longest_prefix_item(self, prefix): + lprefix = self.longest_prefix(prefix) + return (lprefix, self[lprefix]) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/datrie.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/datrie.py new file mode 100644 index 0000000..e2e5f86 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/datrie.py @@ -0,0 +1,44 @@ +from __future__ import absolute_import, division, unicode_literals + +from datrie import Trie as DATrie +from pip._vendor.six import text_type + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + chars = set() + for key in data.keys(): + if not isinstance(key, text_type): + raise TypeError("All keys must be strings") + for char in key: + chars.add(char) + + self._data = DATrie("".join(chars)) + for key, value in data.items(): + self._data[key] = value + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + raise NotImplementedError() + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + return self._data.keys(prefix) + + def has_keys_with_prefix(self, prefix): + return self._data.has_keys_with_prefix(prefix) + + def longest_prefix(self, prefix): + return self._data.longest_prefix(prefix) + + def longest_prefix_item(self, prefix): + return self._data.longest_prefix_item(prefix) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/py.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/py.py new file mode 100644 index 0000000..c178b21 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/py.py @@ -0,0 +1,67 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from bisect import bisect_left + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + if not all(isinstance(x, text_type) for x in data.keys()): + raise TypeError("All keys must be strings") + + self._data = data + self._keys = sorted(data.keys()) + self._cachestr = "" + self._cachepoints = (0, len(data)) + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + return iter(self._data) + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + if prefix is None or prefix == "" or not self._keys: + return set(self._keys) + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + start = i = bisect_left(self._keys, prefix, lo, hi) + else: + start = i = bisect_left(self._keys, prefix) + + keys = set() + if start == len(self._keys): + return keys + + while self._keys[i].startswith(prefix): + keys.add(self._keys[i]) + i += 1 + + self._cachestr = prefix + self._cachepoints = (start, i) + + return keys + + def has_keys_with_prefix(self, prefix): + if prefix in self._data: + return True + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + i = bisect_left(self._keys, prefix, lo, hi) + else: + i = bisect_left(self._keys, prefix) + + if i == len(self._keys): + return False + + return self._keys[i].startswith(prefix) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_utils.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_utils.py new file mode 100644 index 0000000..0703afb --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/_utils.py @@ -0,0 +1,124 @@ +from __future__ import absolute_import, division, unicode_literals + +from types import ModuleType + +from pip._vendor.six import text_type + +try: + import xml.etree.cElementTree as default_etree +except ImportError: + import xml.etree.ElementTree as default_etree + + +__all__ = ["default_etree", "MethodDispatcher", "isSurrogatePair", + "surrogatePairToCodepoint", "moduleFactoryFactory", + "supports_lone_surrogates"] + + +# Platforms not supporting lone surrogates (\uD800-\uDFFF) should be +# caught by the below test. In general this would be any platform +# using UTF-16 as its encoding of unicode strings, such as +# Jython. This is because UTF-16 itself is based on the use of such +# surrogates, and there is no mechanism to further escape such +# escapes. +try: + _x = eval('"\\uD800"') # pylint:disable=eval-used + if not isinstance(_x, text_type): + # We need this with u"" because of http://bugs.jython.org/issue2039 + _x = eval('u"\\uD800"') # pylint:disable=eval-used + assert isinstance(_x, text_type) +except: # pylint:disable=bare-except + supports_lone_surrogates = False +else: + supports_lone_surrogates = True + + +class MethodDispatcher(dict): + """Dict with 2 special properties: + + On initiation, keys that are lists, sets or tuples are converted to + multiple keys so accessing any one of the items in the original + list-like object returns the matching value + + md = MethodDispatcher({("foo", "bar"):"baz"}) + md["foo"] == "baz" + + A default value which can be set through the default attribute. + """ + + def __init__(self, items=()): + # Using _dictEntries instead of directly assigning to self is about + # twice as fast. Please do careful performance testing before changing + # anything here. + _dictEntries = [] + for name, value in items: + if isinstance(name, (list, tuple, frozenset, set)): + for item in name: + _dictEntries.append((item, value)) + else: + _dictEntries.append((name, value)) + dict.__init__(self, _dictEntries) + assert len(self) == len(_dictEntries) + self.default = None + + def __getitem__(self, key): + return dict.get(self, key, self.default) + + +# Some utility functions to deal with weirdness around UCS2 vs UCS4 +# python builds + +def isSurrogatePair(data): + return (len(data) == 2 and + ord(data[0]) >= 0xD800 and ord(data[0]) <= 0xDBFF and + ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF) + + +def surrogatePairToCodepoint(data): + char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 + + (ord(data[1]) - 0xDC00)) + return char_val + +# Module Factory Factory (no, this isn't Java, I know) +# Here to stop this being duplicated all over the place. + + +def moduleFactoryFactory(factory): + moduleCache = {} + + def moduleFactory(baseModule, *args, **kwargs): + if isinstance(ModuleType.__name__, type("")): + name = "_%s_factory" % baseModule.__name__ + else: + name = b"_%s_factory" % baseModule.__name__ + + kwargs_tuple = tuple(kwargs.items()) + + try: + return moduleCache[name][args][kwargs_tuple] + except KeyError: + mod = ModuleType(name) + objs = factory(baseModule, *args, **kwargs) + mod.__dict__.update(objs) + if "name" not in moduleCache: + moduleCache[name] = {} + if "args" not in moduleCache[name]: + moduleCache[name][args] = {} + if "kwargs" not in moduleCache[name][args]: + moduleCache[name][args][kwargs_tuple] = {} + moduleCache[name][args][kwargs_tuple] = mod + return mod + + return moduleFactory + + +def memoize(func): + cache = {} + + def wrapped(*args, **kwargs): + key = (tuple(args), tuple(kwargs.items())) + if key not in cache: + cache[key] = func(*args, **kwargs) + return cache[key] + + return wrapped diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/constants.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/constants.py new file mode 100644 index 0000000..1ff8041 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/constants.py @@ -0,0 +1,2947 @@ +from __future__ import absolute_import, division, unicode_literals + +import string + +EOF = None + +E = { + "null-character": + "Null character in input stream, replaced with U+FFFD.", + "invalid-codepoint": + "Invalid codepoint in stream.", + "incorrectly-placed-solidus": + "Solidus (/) incorrectly placed in tag.", + "incorrect-cr-newline-entity": + "Incorrect CR newline entity, replaced with LF.", + "illegal-windows-1252-entity": + "Entity used with illegal number (windows-1252 reference).", + "cant-convert-numeric-entity": + "Numeric entity couldn't be converted to character " + "(codepoint U+%(charAsInt)08x).", + "illegal-codepoint-for-numeric-entity": + "Numeric entity represents an illegal codepoint: " + "U+%(charAsInt)08x.", + "numeric-entity-without-semicolon": + "Numeric entity didn't end with ';'.", + "expected-numeric-entity-but-got-eof": + "Numeric entity expected. Got end of file instead.", + "expected-numeric-entity": + "Numeric entity expected but none found.", + "named-entity-without-semicolon": + "Named entity didn't end with ';'.", + "expected-named-entity": + "Named entity expected. Got none.", + "attributes-in-end-tag": + "End tag contains unexpected attributes.", + 'self-closing-flag-on-end-tag': + "End tag contains unexpected self-closing flag.", + "expected-tag-name-but-got-right-bracket": + "Expected tag name. Got '>' instead.", + "expected-tag-name-but-got-question-mark": + "Expected tag name. Got '?' instead. (HTML doesn't " + "support processing instructions.)", + "expected-tag-name": + "Expected tag name. Got something else instead", + "expected-closing-tag-but-got-right-bracket": + "Expected closing tag. Got '>' instead. Ignoring '</>'.", + "expected-closing-tag-but-got-eof": + "Expected closing tag. Unexpected end of file.", + "expected-closing-tag-but-got-char": + "Expected closing tag. Unexpected character '%(data)s' found.", + "eof-in-tag-name": + "Unexpected end of file in the tag name.", + "expected-attribute-name-but-got-eof": + "Unexpected end of file. Expected attribute name instead.", + "eof-in-attribute-name": + "Unexpected end of file in attribute name.", + "invalid-character-in-attribute-name": + "Invalid character in attribute name", + "duplicate-attribute": + "Dropped duplicate attribute on tag.", + "expected-end-of-tag-name-but-got-eof": + "Unexpected end of file. Expected = or end of tag.", + "expected-attribute-value-but-got-eof": + "Unexpected end of file. Expected attribute value.", + "expected-attribute-value-but-got-right-bracket": + "Expected attribute value. Got '>' instead.", + 'equals-in-unquoted-attribute-value': + "Unexpected = in unquoted attribute", + 'unexpected-character-in-unquoted-attribute-value': + "Unexpected character in unquoted attribute", + "invalid-character-after-attribute-name": + "Unexpected character after attribute name.", + "unexpected-character-after-attribute-value": + "Unexpected character after attribute value.", + "eof-in-attribute-value-double-quote": + "Unexpected end of file in attribute value (\").", + "eof-in-attribute-value-single-quote": + "Unexpected end of file in attribute value (').", + "eof-in-attribute-value-no-quotes": + "Unexpected end of file in attribute value.", + "unexpected-EOF-after-solidus-in-tag": + "Unexpected end of file in tag. Expected >", + "unexpected-character-after-solidus-in-tag": + "Unexpected character after / in tag. Expected >", + "expected-dashes-or-doctype": + "Expected '--' or 'DOCTYPE'. Not found.", + "unexpected-bang-after-double-dash-in-comment": + "Unexpected ! after -- in comment", + "unexpected-space-after-double-dash-in-comment": + "Unexpected space after -- in comment", + "incorrect-comment": + "Incorrect comment.", + "eof-in-comment": + "Unexpected end of file in comment.", + "eof-in-comment-end-dash": + "Unexpected end of file in comment (-)", + "unexpected-dash-after-double-dash-in-comment": + "Unexpected '-' after '--' found in comment.", + "eof-in-comment-double-dash": + "Unexpected end of file in comment (--).", + "eof-in-comment-end-space-state": + "Unexpected end of file in comment.", + "eof-in-comment-end-bang-state": + "Unexpected end of file in comment.", + "unexpected-char-in-comment": + "Unexpected character in comment found.", + "need-space-after-doctype": + "No space after literal string 'DOCTYPE'.", + "expected-doctype-name-but-got-right-bracket": + "Unexpected > character. Expected DOCTYPE name.", + "expected-doctype-name-but-got-eof": + "Unexpected end of file. Expected DOCTYPE name.", + "eof-in-doctype-name": + "Unexpected end of file in DOCTYPE name.", + "eof-in-doctype": + "Unexpected end of file in DOCTYPE.", + "expected-space-or-right-bracket-in-doctype": + "Expected space or '>'. Got '%(data)s'", + "unexpected-end-of-doctype": + "Unexpected end of DOCTYPE.", + "unexpected-char-in-doctype": + "Unexpected character in DOCTYPE.", + "eof-in-innerhtml": + "XXX innerHTML EOF", + "unexpected-doctype": + "Unexpected DOCTYPE. Ignored.", + "non-html-root": + "html needs to be the first start tag.", + "expected-doctype-but-got-eof": + "Unexpected End of file. Expected DOCTYPE.", + "unknown-doctype": + "Erroneous DOCTYPE.", + "expected-doctype-but-got-chars": + "Unexpected non-space characters. Expected DOCTYPE.", + "expected-doctype-but-got-start-tag": + "Unexpected start tag (%(name)s). Expected DOCTYPE.", + "expected-doctype-but-got-end-tag": + "Unexpected end tag (%(name)s). Expected DOCTYPE.", + "end-tag-after-implied-root": + "Unexpected end tag (%(name)s) after the (implied) root element.", + "expected-named-closing-tag-but-got-eof": + "Unexpected end of file. Expected end tag (%(name)s).", + "two-heads-are-not-better-than-one": + "Unexpected start tag head in existing head. Ignored.", + "unexpected-end-tag": + "Unexpected end tag (%(name)s). Ignored.", + "unexpected-start-tag-out-of-my-head": + "Unexpected start tag (%(name)s) that can be in head. Moved.", + "unexpected-start-tag": + "Unexpected start tag (%(name)s).", + "missing-end-tag": + "Missing end tag (%(name)s).", + "missing-end-tags": + "Missing end tags (%(name)s).", + "unexpected-start-tag-implies-end-tag": + "Unexpected start tag (%(startName)s) " + "implies end tag (%(endName)s).", + "unexpected-start-tag-treated-as": + "Unexpected start tag (%(originalName)s). Treated as %(newName)s.", + "deprecated-tag": + "Unexpected start tag %(name)s. Don't use it!", + "unexpected-start-tag-ignored": + "Unexpected start tag %(name)s. Ignored.", + "expected-one-end-tag-but-got-another": + "Unexpected end tag (%(gotName)s). " + "Missing end tag (%(expectedName)s).", + "end-tag-too-early": + "End tag (%(name)s) seen too early. Expected other end tag.", + "end-tag-too-early-named": + "Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).", + "end-tag-too-early-ignored": + "End tag (%(name)s) seen too early. Ignored.", + "adoption-agency-1.1": + "End tag (%(name)s) violates step 1, " + "paragraph 1 of the adoption agency algorithm.", + "adoption-agency-1.2": + "End tag (%(name)s) violates step 1, " + "paragraph 2 of the adoption agency algorithm.", + "adoption-agency-1.3": + "End tag (%(name)s) violates step 1, " + "paragraph 3 of the adoption agency algorithm.", + "adoption-agency-4.4": + "End tag (%(name)s) violates step 4, " + "paragraph 4 of the adoption agency algorithm.", + "unexpected-end-tag-treated-as": + "Unexpected end tag (%(originalName)s). Treated as %(newName)s.", + "no-end-tag": + "This element (%(name)s) has no end tag.", + "unexpected-implied-end-tag-in-table": + "Unexpected implied end tag (%(name)s) in the table phase.", + "unexpected-implied-end-tag-in-table-body": + "Unexpected implied end tag (%(name)s) in the table body phase.", + "unexpected-char-implies-table-voodoo": + "Unexpected non-space characters in " + "table context caused voodoo mode.", + "unexpected-hidden-input-in-table": + "Unexpected input with type hidden in table context.", + "unexpected-form-in-table": + "Unexpected form in table context.", + "unexpected-start-tag-implies-table-voodoo": + "Unexpected start tag (%(name)s) in " + "table context caused voodoo mode.", + "unexpected-end-tag-implies-table-voodoo": + "Unexpected end tag (%(name)s) in " + "table context caused voodoo mode.", + "unexpected-cell-in-table-body": + "Unexpected table cell start tag (%(name)s) " + "in the table body phase.", + "unexpected-cell-end-tag": + "Got table cell end tag (%(name)s) " + "while required end tags are missing.", + "unexpected-end-tag-in-table-body": + "Unexpected end tag (%(name)s) in the table body phase. Ignored.", + "unexpected-implied-end-tag-in-table-row": + "Unexpected implied end tag (%(name)s) in the table row phase.", + "unexpected-end-tag-in-table-row": + "Unexpected end tag (%(name)s) in the table row phase. Ignored.", + "unexpected-select-in-select": + "Unexpected select start tag in the select phase " + "treated as select end tag.", + "unexpected-input-in-select": + "Unexpected input start tag in the select phase.", + "unexpected-start-tag-in-select": + "Unexpected start tag token (%(name)s in the select phase. " + "Ignored.", + "unexpected-end-tag-in-select": + "Unexpected end tag (%(name)s) in the select phase. Ignored.", + "unexpected-table-element-start-tag-in-select-in-table": + "Unexpected table element start tag (%(name)s) in the select in table phase.", + "unexpected-table-element-end-tag-in-select-in-table": + "Unexpected table element end tag (%(name)s) in the select in table phase.", + "unexpected-char-after-body": + "Unexpected non-space characters in the after body phase.", + "unexpected-start-tag-after-body": + "Unexpected start tag token (%(name)s)" + " in the after body phase.", + "unexpected-end-tag-after-body": + "Unexpected end tag token (%(name)s)" + " in the after body phase.", + "unexpected-char-in-frameset": + "Unexpected characters in the frameset phase. Characters ignored.", + "unexpected-start-tag-in-frameset": + "Unexpected start tag token (%(name)s)" + " in the frameset phase. Ignored.", + "unexpected-frameset-in-frameset-innerhtml": + "Unexpected end tag token (frameset) " + "in the frameset phase (innerHTML).", + "unexpected-end-tag-in-frameset": + "Unexpected end tag token (%(name)s)" + " in the frameset phase. Ignored.", + "unexpected-char-after-frameset": + "Unexpected non-space characters in the " + "after frameset phase. Ignored.", + "unexpected-start-tag-after-frameset": + "Unexpected start tag (%(name)s)" + " in the after frameset phase. Ignored.", + "unexpected-end-tag-after-frameset": + "Unexpected end tag (%(name)s)" + " in the after frameset phase. Ignored.", + "unexpected-end-tag-after-body-innerhtml": + "Unexpected end tag after body(innerHtml)", + "expected-eof-but-got-char": + "Unexpected non-space characters. Expected end of file.", + "expected-eof-but-got-start-tag": + "Unexpected start tag (%(name)s)" + ". Expected end of file.", + "expected-eof-but-got-end-tag": + "Unexpected end tag (%(name)s)" + ". Expected end of file.", + "eof-in-table": + "Unexpected end of file. Expected table content.", + "eof-in-select": + "Unexpected end of file. Expected select content.", + "eof-in-frameset": + "Unexpected end of file. Expected frameset content.", + "eof-in-script-in-script": + "Unexpected end of file. Expected script content.", + "eof-in-foreign-lands": + "Unexpected end of file. Expected foreign content", + "non-void-element-with-trailing-solidus": + "Trailing solidus not allowed on element %(name)s", + "unexpected-html-element-in-foreign-content": + "Element %(name)s not allowed in a non-html context", + "unexpected-end-tag-before-html": + "Unexpected end tag (%(name)s) before html.", + "unexpected-inhead-noscript-tag": + "Element %(name)s not allowed in a inhead-noscript context", + "eof-in-head-noscript": + "Unexpected end of file. Expected inhead-noscript content", + "char-in-head-noscript": + "Unexpected non-space character. Expected inhead-noscript content", + "XXX-undefined-error": + "Undefined error (this sucks and should be fixed)", +} + +namespaces = { + "html": "http://www.w3.org/1999/xhtml", + "mathml": "http://www.w3.org/1998/Math/MathML", + "svg": "http://www.w3.org/2000/svg", + "xlink": "http://www.w3.org/1999/xlink", + "xml": "http://www.w3.org/XML/1998/namespace", + "xmlns": "http://www.w3.org/2000/xmlns/" +} + +scopingElements = frozenset([ + (namespaces["html"], "applet"), + (namespaces["html"], "caption"), + (namespaces["html"], "html"), + (namespaces["html"], "marquee"), + (namespaces["html"], "object"), + (namespaces["html"], "table"), + (namespaces["html"], "td"), + (namespaces["html"], "th"), + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext"), + (namespaces["mathml"], "annotation-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title"), +]) + +formattingElements = frozenset([ + (namespaces["html"], "a"), + (namespaces["html"], "b"), + (namespaces["html"], "big"), + (namespaces["html"], "code"), + (namespaces["html"], "em"), + (namespaces["html"], "font"), + (namespaces["html"], "i"), + (namespaces["html"], "nobr"), + (namespaces["html"], "s"), + (namespaces["html"], "small"), + (namespaces["html"], "strike"), + (namespaces["html"], "strong"), + (namespaces["html"], "tt"), + (namespaces["html"], "u") +]) + +specialElements = frozenset([ + (namespaces["html"], "address"), + (namespaces["html"], "applet"), + (namespaces["html"], "area"), + (namespaces["html"], "article"), + (namespaces["html"], "aside"), + (namespaces["html"], "base"), + (namespaces["html"], "basefont"), + (namespaces["html"], "bgsound"), + (namespaces["html"], "blockquote"), + (namespaces["html"], "body"), + (namespaces["html"], "br"), + (namespaces["html"], "button"), + (namespaces["html"], "caption"), + (namespaces["html"], "center"), + (namespaces["html"], "col"), + (namespaces["html"], "colgroup"), + (namespaces["html"], "command"), + (namespaces["html"], "dd"), + (namespaces["html"], "details"), + (namespaces["html"], "dir"), + (namespaces["html"], "div"), + (namespaces["html"], "dl"), + (namespaces["html"], "dt"), + (namespaces["html"], "embed"), + (namespaces["html"], "fieldset"), + (namespaces["html"], "figure"), + (namespaces["html"], "footer"), + (namespaces["html"], "form"), + (namespaces["html"], "frame"), + (namespaces["html"], "frameset"), + (namespaces["html"], "h1"), + (namespaces["html"], "h2"), + (namespaces["html"], "h3"), + (namespaces["html"], "h4"), + (namespaces["html"], "h5"), + (namespaces["html"], "h6"), + (namespaces["html"], "head"), + (namespaces["html"], "header"), + (namespaces["html"], "hr"), + (namespaces["html"], "html"), + (namespaces["html"], "iframe"), + # Note that image is commented out in the spec as "this isn't an + # element that can end up on the stack, so it doesn't matter," + (namespaces["html"], "image"), + (namespaces["html"], "img"), + (namespaces["html"], "input"), + (namespaces["html"], "isindex"), + (namespaces["html"], "li"), + (namespaces["html"], "link"), + (namespaces["html"], "listing"), + (namespaces["html"], "marquee"), + (namespaces["html"], "menu"), + (namespaces["html"], "meta"), + (namespaces["html"], "nav"), + (namespaces["html"], "noembed"), + (namespaces["html"], "noframes"), + (namespaces["html"], "noscript"), + (namespaces["html"], "object"), + (namespaces["html"], "ol"), + (namespaces["html"], "p"), + (namespaces["html"], "param"), + (namespaces["html"], "plaintext"), + (namespaces["html"], "pre"), + (namespaces["html"], "script"), + (namespaces["html"], "section"), + (namespaces["html"], "select"), + (namespaces["html"], "style"), + (namespaces["html"], "table"), + (namespaces["html"], "tbody"), + (namespaces["html"], "td"), + (namespaces["html"], "textarea"), + (namespaces["html"], "tfoot"), + (namespaces["html"], "th"), + (namespaces["html"], "thead"), + (namespaces["html"], "title"), + (namespaces["html"], "tr"), + (namespaces["html"], "ul"), + (namespaces["html"], "wbr"), + (namespaces["html"], "xmp"), + (namespaces["svg"], "foreignObject") +]) + +htmlIntegrationPointElements = frozenset([ + (namespaces["mathml"], "annotation-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title") +]) + +mathmlTextIntegrationPointElements = frozenset([ + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext") +]) + +adjustSVGAttributes = { + "attributename": "attributeName", + "attributetype": "attributeType", + "basefrequency": "baseFrequency", + "baseprofile": "baseProfile", + "calcmode": "calcMode", + "clippathunits": "clipPathUnits", + "contentscripttype": "contentScriptType", + "contentstyletype": "contentStyleType", + "diffuseconstant": "diffuseConstant", + "edgemode": "edgeMode", + "externalresourcesrequired": "externalResourcesRequired", + "filterres": "filterRes", + "filterunits": "filterUnits", + "glyphref": "glyphRef", + "gradienttransform": "gradientTransform", + "gradientunits": "gradientUnits", + "kernelmatrix": "kernelMatrix", + "kernelunitlength": "kernelUnitLength", + "keypoints": "keyPoints", + "keysplines": "keySplines", + "keytimes": "keyTimes", + "lengthadjust": "lengthAdjust", + "limitingconeangle": "limitingConeAngle", + "markerheight": "markerHeight", + "markerunits": "markerUnits", + "markerwidth": "markerWidth", + "maskcontentunits": "maskContentUnits", + "maskunits": "maskUnits", + "numoctaves": "numOctaves", + "pathlength": "pathLength", + "patterncontentunits": "patternContentUnits", + "patterntransform": "patternTransform", + "patternunits": "patternUnits", + "pointsatx": "pointsAtX", + "pointsaty": "pointsAtY", + "pointsatz": "pointsAtZ", + "preservealpha": "preserveAlpha", + "preserveaspectratio": "preserveAspectRatio", + "primitiveunits": "primitiveUnits", + "refx": "refX", + "refy": "refY", + "repeatcount": "repeatCount", + "repeatdur": "repeatDur", + "requiredextensions": "requiredExtensions", + "requiredfeatures": "requiredFeatures", + "specularconstant": "specularConstant", + "specularexponent": "specularExponent", + "spreadmethod": "spreadMethod", + "startoffset": "startOffset", + "stddeviation": "stdDeviation", + "stitchtiles": "stitchTiles", + "surfacescale": "surfaceScale", + "systemlanguage": "systemLanguage", + "tablevalues": "tableValues", + "targetx": "targetX", + "targety": "targetY", + "textlength": "textLength", + "viewbox": "viewBox", + "viewtarget": "viewTarget", + "xchannelselector": "xChannelSelector", + "ychannelselector": "yChannelSelector", + "zoomandpan": "zoomAndPan" +} + +adjustMathMLAttributes = {"definitionurl": "definitionURL"} + +adjustForeignAttributes = { + "xlink:actuate": ("xlink", "actuate", namespaces["xlink"]), + "xlink:arcrole": ("xlink", "arcrole", namespaces["xlink"]), + "xlink:href": ("xlink", "href", namespaces["xlink"]), + "xlink:role": ("xlink", "role", namespaces["xlink"]), + "xlink:show": ("xlink", "show", namespaces["xlink"]), + "xlink:title": ("xlink", "title", namespaces["xlink"]), + "xlink:type": ("xlink", "type", namespaces["xlink"]), + "xml:base": ("xml", "base", namespaces["xml"]), + "xml:lang": ("xml", "lang", namespaces["xml"]), + "xml:space": ("xml", "space", namespaces["xml"]), + "xmlns": (None, "xmlns", namespaces["xmlns"]), + "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"]) +} + +unadjustForeignAttributes = dict([((ns, local), qname) for qname, (prefix, local, ns) in + adjustForeignAttributes.items()]) + +spaceCharacters = frozenset([ + "\t", + "\n", + "\u000C", + " ", + "\r" +]) + +tableInsertModeElements = frozenset([ + "table", + "tbody", + "tfoot", + "thead", + "tr" +]) + +asciiLowercase = frozenset(string.ascii_lowercase) +asciiUppercase = frozenset(string.ascii_uppercase) +asciiLetters = frozenset(string.ascii_letters) +digits = frozenset(string.digits) +hexDigits = frozenset(string.hexdigits) + +asciiUpper2Lower = dict([(ord(c), ord(c.lower())) + for c in string.ascii_uppercase]) + +# Heading elements need to be ordered +headingElements = ( + "h1", + "h2", + "h3", + "h4", + "h5", + "h6" +) + +voidElements = frozenset([ + "base", + "command", + "event-source", + "link", + "meta", + "hr", + "br", + "img", + "embed", + "param", + "area", + "col", + "input", + "source", + "track" +]) + +cdataElements = frozenset(['title', 'textarea']) + +rcdataElements = frozenset([ + 'style', + 'script', + 'xmp', + 'iframe', + 'noembed', + 'noframes', + 'noscript' +]) + +booleanAttributes = { + "": frozenset(["irrelevant", "itemscope"]), + "style": frozenset(["scoped"]), + "img": frozenset(["ismap"]), + "audio": frozenset(["autoplay", "controls"]), + "video": frozenset(["autoplay", "controls"]), + "script": frozenset(["defer", "async"]), + "details": frozenset(["open"]), + "datagrid": frozenset(["multiple", "disabled"]), + "command": frozenset(["hidden", "disabled", "checked", "default"]), + "hr": frozenset(["noshade"]), + "menu": frozenset(["autosubmit"]), + "fieldset": frozenset(["disabled", "readonly"]), + "option": frozenset(["disabled", "readonly", "selected"]), + "optgroup": frozenset(["disabled", "readonly"]), + "button": frozenset(["disabled", "autofocus"]), + "input": frozenset(["disabled", "readonly", "required", "autofocus", "checked", "ismap"]), + "select": frozenset(["disabled", "readonly", "autofocus", "multiple"]), + "output": frozenset(["disabled", "readonly"]), + "iframe": frozenset(["seamless"]), +} + +# entitiesWindows1252 has to be _ordered_ and needs to have an index. It +# therefore can't be a frozenset. +entitiesWindows1252 = ( + 8364, # 0x80 0x20AC EURO SIGN + 65533, # 0x81 UNDEFINED + 8218, # 0x82 0x201A SINGLE LOW-9 QUOTATION MARK + 402, # 0x83 0x0192 LATIN SMALL LETTER F WITH HOOK + 8222, # 0x84 0x201E DOUBLE LOW-9 QUOTATION MARK + 8230, # 0x85 0x2026 HORIZONTAL ELLIPSIS + 8224, # 0x86 0x2020 DAGGER + 8225, # 0x87 0x2021 DOUBLE DAGGER + 710, # 0x88 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT + 8240, # 0x89 0x2030 PER MILLE SIGN + 352, # 0x8A 0x0160 LATIN CAPITAL LETTER S WITH CARON + 8249, # 0x8B 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 338, # 0x8C 0x0152 LATIN CAPITAL LIGATURE OE + 65533, # 0x8D UNDEFINED + 381, # 0x8E 0x017D LATIN CAPITAL LETTER Z WITH CARON + 65533, # 0x8F UNDEFINED + 65533, # 0x90 UNDEFINED + 8216, # 0x91 0x2018 LEFT SINGLE QUOTATION MARK + 8217, # 0x92 0x2019 RIGHT SINGLE QUOTATION MARK + 8220, # 0x93 0x201C LEFT DOUBLE QUOTATION MARK + 8221, # 0x94 0x201D RIGHT DOUBLE QUOTATION MARK + 8226, # 0x95 0x2022 BULLET + 8211, # 0x96 0x2013 EN DASH + 8212, # 0x97 0x2014 EM DASH + 732, # 0x98 0x02DC SMALL TILDE + 8482, # 0x99 0x2122 TRADE MARK SIGN + 353, # 0x9A 0x0161 LATIN SMALL LETTER S WITH CARON + 8250, # 0x9B 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 339, # 0x9C 0x0153 LATIN SMALL LIGATURE OE + 65533, # 0x9D UNDEFINED + 382, # 0x9E 0x017E LATIN SMALL LETTER Z WITH CARON + 376 # 0x9F 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS +) + +xmlEntities = frozenset(['lt;', 'gt;', 'amp;', 'apos;', 'quot;']) + +entities = { + "AElig": "\xc6", + "AElig;": "\xc6", + "AMP": "&", + "AMP;": "&", + "Aacute": "\xc1", + "Aacute;": "\xc1", + "Abreve;": "\u0102", + "Acirc": "\xc2", + "Acirc;": "\xc2", + "Acy;": "\u0410", + "Afr;": "\U0001d504", + "Agrave": "\xc0", + "Agrave;": "\xc0", + "Alpha;": "\u0391", + "Amacr;": "\u0100", + "And;": "\u2a53", + "Aogon;": "\u0104", + "Aopf;": "\U0001d538", + "ApplyFunction;": "\u2061", + "Aring": "\xc5", + "Aring;": "\xc5", + "Ascr;": "\U0001d49c", + "Assign;": "\u2254", + "Atilde": "\xc3", + "Atilde;": "\xc3", + "Auml": "\xc4", + "Auml;": "\xc4", + "Backslash;": "\u2216", + "Barv;": "\u2ae7", + "Barwed;": "\u2306", + "Bcy;": "\u0411", + "Because;": "\u2235", + "Bernoullis;": "\u212c", + "Beta;": "\u0392", + "Bfr;": "\U0001d505", + "Bopf;": "\U0001d539", + "Breve;": "\u02d8", + "Bscr;": "\u212c", + "Bumpeq;": "\u224e", + "CHcy;": "\u0427", + "COPY": "\xa9", + "COPY;": "\xa9", + "Cacute;": "\u0106", + "Cap;": "\u22d2", + "CapitalDifferentialD;": "\u2145", + "Cayleys;": "\u212d", + "Ccaron;": "\u010c", + "Ccedil": "\xc7", + "Ccedil;": "\xc7", + "Ccirc;": "\u0108", + "Cconint;": "\u2230", + "Cdot;": "\u010a", + "Cedilla;": "\xb8", + "CenterDot;": "\xb7", + "Cfr;": "\u212d", + "Chi;": "\u03a7", + "CircleDot;": "\u2299", + "CircleMinus;": "\u2296", + "CirclePlus;": "\u2295", + "CircleTimes;": "\u2297", + "ClockwiseContourIntegral;": "\u2232", + "CloseCurlyDoubleQuote;": "\u201d", + "CloseCurlyQuote;": "\u2019", + "Colon;": "\u2237", + "Colone;": "\u2a74", + "Congruent;": "\u2261", + "Conint;": "\u222f", + "ContourIntegral;": "\u222e", + "Copf;": "\u2102", + "Coproduct;": "\u2210", + "CounterClockwiseContourIntegral;": "\u2233", + "Cross;": "\u2a2f", + "Cscr;": "\U0001d49e", + "Cup;": "\u22d3", + "CupCap;": "\u224d", + "DD;": "\u2145", + "DDotrahd;": "\u2911", + "DJcy;": "\u0402", + "DScy;": "\u0405", + "DZcy;": "\u040f", + "Dagger;": "\u2021", + "Darr;": "\u21a1", + "Dashv;": "\u2ae4", + "Dcaron;": "\u010e", + "Dcy;": "\u0414", + "Del;": "\u2207", + "Delta;": "\u0394", + "Dfr;": "\U0001d507", + "DiacriticalAcute;": "\xb4", + "DiacriticalDot;": "\u02d9", + "DiacriticalDoubleAcute;": "\u02dd", + "DiacriticalGrave;": "`", + "DiacriticalTilde;": "\u02dc", + "Diamond;": "\u22c4", + "DifferentialD;": "\u2146", + "Dopf;": "\U0001d53b", + "Dot;": "\xa8", + "DotDot;": "\u20dc", + "DotEqual;": "\u2250", + "DoubleContourIntegral;": "\u222f", + "DoubleDot;": "\xa8", + "DoubleDownArrow;": "\u21d3", + "DoubleLeftArrow;": "\u21d0", + "DoubleLeftRightArrow;": "\u21d4", + "DoubleLeftTee;": "\u2ae4", + "DoubleLongLeftArrow;": "\u27f8", + "DoubleLongLeftRightArrow;": "\u27fa", + "DoubleLongRightArrow;": "\u27f9", + "DoubleRightArrow;": "\u21d2", + "DoubleRightTee;": "\u22a8", + "DoubleUpArrow;": "\u21d1", + "DoubleUpDownArrow;": "\u21d5", + "DoubleVerticalBar;": "\u2225", + "DownArrow;": "\u2193", + "DownArrowBar;": "\u2913", + "DownArrowUpArrow;": "\u21f5", + "DownBreve;": "\u0311", + "DownLeftRightVector;": "\u2950", + "DownLeftTeeVector;": "\u295e", + "DownLeftVector;": "\u21bd", + "DownLeftVectorBar;": "\u2956", + "DownRightTeeVector;": "\u295f", + "DownRightVector;": "\u21c1", + "DownRightVectorBar;": "\u2957", + "DownTee;": "\u22a4", + "DownTeeArrow;": "\u21a7", + "Downarrow;": "\u21d3", + "Dscr;": "\U0001d49f", + "Dstrok;": "\u0110", + "ENG;": "\u014a", + "ETH": "\xd0", + "ETH;": "\xd0", + "Eacute": "\xc9", + "Eacute;": "\xc9", + "Ecaron;": "\u011a", + "Ecirc": "\xca", + "Ecirc;": "\xca", + "Ecy;": "\u042d", + "Edot;": "\u0116", + "Efr;": "\U0001d508", + "Egrave": "\xc8", + "Egrave;": "\xc8", + "Element;": "\u2208", + "Emacr;": "\u0112", + "EmptySmallSquare;": "\u25fb", + "EmptyVerySmallSquare;": "\u25ab", + "Eogon;": "\u0118", + "Eopf;": "\U0001d53c", + "Epsilon;": "\u0395", + "Equal;": "\u2a75", + "EqualTilde;": "\u2242", + "Equilibrium;": "\u21cc", + "Escr;": "\u2130", + "Esim;": "\u2a73", + "Eta;": "\u0397", + "Euml": "\xcb", + "Euml;": "\xcb", + "Exists;": "\u2203", + "ExponentialE;": "\u2147", + "Fcy;": "\u0424", + "Ffr;": "\U0001d509", + "FilledSmallSquare;": "\u25fc", + "FilledVerySmallSquare;": "\u25aa", + "Fopf;": "\U0001d53d", + "ForAll;": "\u2200", + "Fouriertrf;": "\u2131", + "Fscr;": "\u2131", + "GJcy;": "\u0403", + "GT": ">", + "GT;": ">", + "Gamma;": "\u0393", + "Gammad;": "\u03dc", + "Gbreve;": "\u011e", + "Gcedil;": "\u0122", + "Gcirc;": "\u011c", + "Gcy;": "\u0413", + "Gdot;": "\u0120", + "Gfr;": "\U0001d50a", + "Gg;": "\u22d9", + "Gopf;": "\U0001d53e", + "GreaterEqual;": "\u2265", + "GreaterEqualLess;": "\u22db", + "GreaterFullEqual;": "\u2267", + "GreaterGreater;": "\u2aa2", + "GreaterLess;": "\u2277", + "GreaterSlantEqual;": "\u2a7e", + "GreaterTilde;": "\u2273", + "Gscr;": "\U0001d4a2", + "Gt;": "\u226b", + "HARDcy;": "\u042a", + "Hacek;": "\u02c7", + "Hat;": "^", + "Hcirc;": "\u0124", + "Hfr;": "\u210c", + "HilbertSpace;": "\u210b", + "Hopf;": "\u210d", + "HorizontalLine;": "\u2500", + "Hscr;": "\u210b", + "Hstrok;": "\u0126", + "HumpDownHump;": "\u224e", + "HumpEqual;": "\u224f", + "IEcy;": "\u0415", + "IJlig;": "\u0132", + "IOcy;": "\u0401", + "Iacute": "\xcd", + "Iacute;": "\xcd", + "Icirc": "\xce", + "Icirc;": "\xce", + "Icy;": "\u0418", + "Idot;": "\u0130", + "Ifr;": "\u2111", + "Igrave": "\xcc", + "Igrave;": "\xcc", + "Im;": "\u2111", + "Imacr;": "\u012a", + "ImaginaryI;": "\u2148", + "Implies;": "\u21d2", + "Int;": "\u222c", + "Integral;": "\u222b", + "Intersection;": "\u22c2", + "InvisibleComma;": "\u2063", + "InvisibleTimes;": "\u2062", + "Iogon;": "\u012e", + "Iopf;": "\U0001d540", + "Iota;": "\u0399", + "Iscr;": "\u2110", + "Itilde;": "\u0128", + "Iukcy;": "\u0406", + "Iuml": "\xcf", + "Iuml;": "\xcf", + "Jcirc;": "\u0134", + "Jcy;": "\u0419", + "Jfr;": "\U0001d50d", + "Jopf;": "\U0001d541", + "Jscr;": "\U0001d4a5", + "Jsercy;": "\u0408", + "Jukcy;": "\u0404", + "KHcy;": "\u0425", + "KJcy;": "\u040c", + "Kappa;": "\u039a", + "Kcedil;": "\u0136", + "Kcy;": "\u041a", + "Kfr;": "\U0001d50e", + "Kopf;": "\U0001d542", + "Kscr;": "\U0001d4a6", + "LJcy;": "\u0409", + "LT": "<", + "LT;": "<", + "Lacute;": "\u0139", + "Lambda;": "\u039b", + "Lang;": "\u27ea", + "Laplacetrf;": "\u2112", + "Larr;": "\u219e", + "Lcaron;": "\u013d", + "Lcedil;": "\u013b", + "Lcy;": "\u041b", + "LeftAngleBracket;": "\u27e8", + "LeftArrow;": "\u2190", + "LeftArrowBar;": "\u21e4", + "LeftArrowRightArrow;": "\u21c6", + "LeftCeiling;": "\u2308", + "LeftDoubleBracket;": "\u27e6", + "LeftDownTeeVector;": "\u2961", + "LeftDownVector;": "\u21c3", + "LeftDownVectorBar;": "\u2959", + "LeftFloor;": "\u230a", + "LeftRightArrow;": "\u2194", + "LeftRightVector;": "\u294e", + "LeftTee;": "\u22a3", + "LeftTeeArrow;": "\u21a4", + "LeftTeeVector;": "\u295a", + "LeftTriangle;": "\u22b2", + "LeftTriangleBar;": "\u29cf", + "LeftTriangleEqual;": "\u22b4", + "LeftUpDownVector;": "\u2951", + "LeftUpTeeVector;": "\u2960", + "LeftUpVector;": "\u21bf", + "LeftUpVectorBar;": "\u2958", + "LeftVector;": "\u21bc", + "LeftVectorBar;": "\u2952", + "Leftarrow;": "\u21d0", + "Leftrightarrow;": "\u21d4", + "LessEqualGreater;": "\u22da", + "LessFullEqual;": "\u2266", + "LessGreater;": "\u2276", + "LessLess;": "\u2aa1", + "LessSlantEqual;": "\u2a7d", + "LessTilde;": "\u2272", + "Lfr;": "\U0001d50f", + "Ll;": "\u22d8", + "Lleftarrow;": "\u21da", + "Lmidot;": "\u013f", + "LongLeftArrow;": "\u27f5", + "LongLeftRightArrow;": "\u27f7", + "LongRightArrow;": "\u27f6", + "Longleftarrow;": "\u27f8", + "Longleftrightarrow;": "\u27fa", + "Longrightarrow;": "\u27f9", + "Lopf;": "\U0001d543", + "LowerLeftArrow;": "\u2199", + "LowerRightArrow;": "\u2198", + "Lscr;": "\u2112", + "Lsh;": "\u21b0", + "Lstrok;": "\u0141", + "Lt;": "\u226a", + "Map;": "\u2905", + "Mcy;": "\u041c", + "MediumSpace;": "\u205f", + "Mellintrf;": "\u2133", + "Mfr;": "\U0001d510", + "MinusPlus;": "\u2213", + "Mopf;": "\U0001d544", + "Mscr;": "\u2133", + "Mu;": "\u039c", + "NJcy;": "\u040a", + "Nacute;": "\u0143", + "Ncaron;": "\u0147", + "Ncedil;": "\u0145", + "Ncy;": "\u041d", + "NegativeMediumSpace;": "\u200b", + "NegativeThickSpace;": "\u200b", + "NegativeThinSpace;": "\u200b", + "NegativeVeryThinSpace;": "\u200b", + "NestedGreaterGreater;": "\u226b", + "NestedLessLess;": "\u226a", + "NewLine;": "\n", + "Nfr;": "\U0001d511", + "NoBreak;": "\u2060", + "NonBreakingSpace;": "\xa0", + "Nopf;": "\u2115", + "Not;": "\u2aec", + "NotCongruent;": "\u2262", + "NotCupCap;": "\u226d", + "NotDoubleVerticalBar;": "\u2226", + "NotElement;": "\u2209", + "NotEqual;": "\u2260", + "NotEqualTilde;": "\u2242\u0338", + "NotExists;": "\u2204", + "NotGreater;": "\u226f", + "NotGreaterEqual;": "\u2271", + "NotGreaterFullEqual;": "\u2267\u0338", + "NotGreaterGreater;": "\u226b\u0338", + "NotGreaterLess;": "\u2279", + "NotGreaterSlantEqual;": "\u2a7e\u0338", + "NotGreaterTilde;": "\u2275", + "NotHumpDownHump;": "\u224e\u0338", + "NotHumpEqual;": "\u224f\u0338", + "NotLeftTriangle;": "\u22ea", + "NotLeftTriangleBar;": "\u29cf\u0338", + "NotLeftTriangleEqual;": "\u22ec", + "NotLess;": "\u226e", + "NotLessEqual;": "\u2270", + "NotLessGreater;": "\u2278", + "NotLessLess;": "\u226a\u0338", + "NotLessSlantEqual;": "\u2a7d\u0338", + "NotLessTilde;": "\u2274", + "NotNestedGreaterGreater;": "\u2aa2\u0338", + "NotNestedLessLess;": "\u2aa1\u0338", + "NotPrecedes;": "\u2280", + "NotPrecedesEqual;": "\u2aaf\u0338", + "NotPrecedesSlantEqual;": "\u22e0", + "NotReverseElement;": "\u220c", + "NotRightTriangle;": "\u22eb", + "NotRightTriangleBar;": "\u29d0\u0338", + "NotRightTriangleEqual;": "\u22ed", + "NotSquareSubset;": "\u228f\u0338", + "NotSquareSubsetEqual;": "\u22e2", + "NotSquareSuperset;": "\u2290\u0338", + "NotSquareSupersetEqual;": "\u22e3", + "NotSubset;": "\u2282\u20d2", + "NotSubsetEqual;": "\u2288", + "NotSucceeds;": "\u2281", + "NotSucceedsEqual;": "\u2ab0\u0338", + "NotSucceedsSlantEqual;": "\u22e1", + "NotSucceedsTilde;": "\u227f\u0338", + "NotSuperset;": "\u2283\u20d2", + "NotSupersetEqual;": "\u2289", + "NotTilde;": "\u2241", + "NotTildeEqual;": "\u2244", + "NotTildeFullEqual;": "\u2247", + "NotTildeTilde;": "\u2249", + "NotVerticalBar;": "\u2224", + "Nscr;": "\U0001d4a9", + "Ntilde": "\xd1", + "Ntilde;": "\xd1", + "Nu;": "\u039d", + "OElig;": "\u0152", + "Oacute": "\xd3", + "Oacute;": "\xd3", + "Ocirc": "\xd4", + "Ocirc;": "\xd4", + "Ocy;": "\u041e", + "Odblac;": "\u0150", + "Ofr;": "\U0001d512", + "Ograve": "\xd2", + "Ograve;": "\xd2", + "Omacr;": "\u014c", + "Omega;": "\u03a9", + "Omicron;": "\u039f", + "Oopf;": "\U0001d546", + "OpenCurlyDoubleQuote;": "\u201c", + "OpenCurlyQuote;": "\u2018", + "Or;": "\u2a54", + "Oscr;": "\U0001d4aa", + "Oslash": "\xd8", + "Oslash;": "\xd8", + "Otilde": "\xd5", + "Otilde;": "\xd5", + "Otimes;": "\u2a37", + "Ouml": "\xd6", + "Ouml;": "\xd6", + "OverBar;": "\u203e", + "OverBrace;": "\u23de", + "OverBracket;": "\u23b4", + "OverParenthesis;": "\u23dc", + "PartialD;": "\u2202", + "Pcy;": "\u041f", + "Pfr;": "\U0001d513", + "Phi;": "\u03a6", + "Pi;": "\u03a0", + "PlusMinus;": "\xb1", + "Poincareplane;": "\u210c", + "Popf;": "\u2119", + "Pr;": "\u2abb", + "Precedes;": "\u227a", + "PrecedesEqual;": "\u2aaf", + "PrecedesSlantEqual;": "\u227c", + "PrecedesTilde;": "\u227e", + "Prime;": "\u2033", + "Product;": "\u220f", + "Proportion;": "\u2237", + "Proportional;": "\u221d", + "Pscr;": "\U0001d4ab", + "Psi;": "\u03a8", + "QUOT": "\"", + "QUOT;": "\"", + "Qfr;": "\U0001d514", + "Qopf;": "\u211a", + "Qscr;": "\U0001d4ac", + "RBarr;": "\u2910", + "REG": "\xae", + "REG;": "\xae", + "Racute;": "\u0154", + "Rang;": "\u27eb", + "Rarr;": "\u21a0", + "Rarrtl;": "\u2916", + "Rcaron;": "\u0158", + "Rcedil;": "\u0156", + "Rcy;": "\u0420", + "Re;": "\u211c", + "ReverseElement;": "\u220b", + "ReverseEquilibrium;": "\u21cb", + "ReverseUpEquilibrium;": "\u296f", + "Rfr;": "\u211c", + "Rho;": "\u03a1", + "RightAngleBracket;": "\u27e9", + "RightArrow;": "\u2192", + "RightArrowBar;": "\u21e5", + "RightArrowLeftArrow;": "\u21c4", + "RightCeiling;": "\u2309", + "RightDoubleBracket;": "\u27e7", + "RightDownTeeVector;": "\u295d", + "RightDownVector;": "\u21c2", + "RightDownVectorBar;": "\u2955", + "RightFloor;": "\u230b", + "RightTee;": "\u22a2", + "RightTeeArrow;": "\u21a6", + "RightTeeVector;": "\u295b", + "RightTriangle;": "\u22b3", + "RightTriangleBar;": "\u29d0", + "RightTriangleEqual;": "\u22b5", + "RightUpDownVector;": "\u294f", + "RightUpTeeVector;": "\u295c", + "RightUpVector;": "\u21be", + "RightUpVectorBar;": "\u2954", + "RightVector;": "\u21c0", + "RightVectorBar;": "\u2953", + "Rightarrow;": "\u21d2", + "Ropf;": "\u211d", + "RoundImplies;": "\u2970", + "Rrightarrow;": "\u21db", + "Rscr;": "\u211b", + "Rsh;": "\u21b1", + "RuleDelayed;": "\u29f4", + "SHCHcy;": "\u0429", + "SHcy;": "\u0428", + "SOFTcy;": "\u042c", + "Sacute;": "\u015a", + "Sc;": "\u2abc", + "Scaron;": "\u0160", + "Scedil;": "\u015e", + "Scirc;": "\u015c", + "Scy;": "\u0421", + "Sfr;": "\U0001d516", + "ShortDownArrow;": "\u2193", + "ShortLeftArrow;": "\u2190", + "ShortRightArrow;": "\u2192", + "ShortUpArrow;": "\u2191", + "Sigma;": "\u03a3", + "SmallCircle;": "\u2218", + "Sopf;": "\U0001d54a", + "Sqrt;": "\u221a", + "Square;": "\u25a1", + "SquareIntersection;": "\u2293", + "SquareSubset;": "\u228f", + "SquareSubsetEqual;": "\u2291", + "SquareSuperset;": "\u2290", + "SquareSupersetEqual;": "\u2292", + "SquareUnion;": "\u2294", + "Sscr;": "\U0001d4ae", + "Star;": "\u22c6", + "Sub;": "\u22d0", + "Subset;": "\u22d0", + "SubsetEqual;": "\u2286", + "Succeeds;": "\u227b", + "SucceedsEqual;": "\u2ab0", + "SucceedsSlantEqual;": "\u227d", + "SucceedsTilde;": "\u227f", + "SuchThat;": "\u220b", + "Sum;": "\u2211", + "Sup;": "\u22d1", + "Superset;": "\u2283", + "SupersetEqual;": "\u2287", + "Supset;": "\u22d1", + "THORN": "\xde", + "THORN;": "\xde", + "TRADE;": "\u2122", + "TSHcy;": "\u040b", + "TScy;": "\u0426", + "Tab;": "\t", + "Tau;": "\u03a4", + "Tcaron;": "\u0164", + "Tcedil;": "\u0162", + "Tcy;": "\u0422", + "Tfr;": "\U0001d517", + "Therefore;": "\u2234", + "Theta;": "\u0398", + "ThickSpace;": "\u205f\u200a", + "ThinSpace;": "\u2009", + "Tilde;": "\u223c", + "TildeEqual;": "\u2243", + "TildeFullEqual;": "\u2245", + "TildeTilde;": "\u2248", + "Topf;": "\U0001d54b", + "TripleDot;": "\u20db", + "Tscr;": "\U0001d4af", + "Tstrok;": "\u0166", + "Uacute": "\xda", + "Uacute;": "\xda", + "Uarr;": "\u219f", + "Uarrocir;": "\u2949", + "Ubrcy;": "\u040e", + "Ubreve;": "\u016c", + "Ucirc": "\xdb", + "Ucirc;": "\xdb", + "Ucy;": "\u0423", + "Udblac;": "\u0170", + "Ufr;": "\U0001d518", + "Ugrave": "\xd9", + "Ugrave;": "\xd9", + "Umacr;": "\u016a", + "UnderBar;": "_", + "UnderBrace;": "\u23df", + "UnderBracket;": "\u23b5", + "UnderParenthesis;": "\u23dd", + "Union;": "\u22c3", + "UnionPlus;": "\u228e", + "Uogon;": "\u0172", + "Uopf;": "\U0001d54c", + "UpArrow;": "\u2191", + "UpArrowBar;": "\u2912", + "UpArrowDownArrow;": "\u21c5", + "UpDownArrow;": "\u2195", + "UpEquilibrium;": "\u296e", + "UpTee;": "\u22a5", + "UpTeeArrow;": "\u21a5", + "Uparrow;": "\u21d1", + "Updownarrow;": "\u21d5", + "UpperLeftArrow;": "\u2196", + "UpperRightArrow;": "\u2197", + "Upsi;": "\u03d2", + "Upsilon;": "\u03a5", + "Uring;": "\u016e", + "Uscr;": "\U0001d4b0", + "Utilde;": "\u0168", + "Uuml": "\xdc", + "Uuml;": "\xdc", + "VDash;": "\u22ab", + "Vbar;": "\u2aeb", + "Vcy;": "\u0412", + "Vdash;": "\u22a9", + "Vdashl;": "\u2ae6", + "Vee;": "\u22c1", + "Verbar;": "\u2016", + "Vert;": "\u2016", + "VerticalBar;": "\u2223", + "VerticalLine;": "|", + "VerticalSeparator;": "\u2758", + "VerticalTilde;": "\u2240", + "VeryThinSpace;": "\u200a", + "Vfr;": "\U0001d519", + "Vopf;": "\U0001d54d", + "Vscr;": "\U0001d4b1", + "Vvdash;": "\u22aa", + "Wcirc;": "\u0174", + "Wedge;": "\u22c0", + "Wfr;": "\U0001d51a", + "Wopf;": "\U0001d54e", + "Wscr;": "\U0001d4b2", + "Xfr;": "\U0001d51b", + "Xi;": "\u039e", + "Xopf;": "\U0001d54f", + "Xscr;": "\U0001d4b3", + "YAcy;": "\u042f", + "YIcy;": "\u0407", + "YUcy;": "\u042e", + "Yacute": "\xdd", + "Yacute;": "\xdd", + "Ycirc;": "\u0176", + "Ycy;": "\u042b", + "Yfr;": "\U0001d51c", + "Yopf;": "\U0001d550", + "Yscr;": "\U0001d4b4", + "Yuml;": "\u0178", + "ZHcy;": "\u0416", + "Zacute;": "\u0179", + "Zcaron;": "\u017d", + "Zcy;": "\u0417", + "Zdot;": "\u017b", + "ZeroWidthSpace;": "\u200b", + "Zeta;": "\u0396", + "Zfr;": "\u2128", + "Zopf;": "\u2124", + "Zscr;": "\U0001d4b5", + "aacute": "\xe1", + "aacute;": "\xe1", + "abreve;": "\u0103", + "ac;": "\u223e", + "acE;": "\u223e\u0333", + "acd;": "\u223f", + "acirc": "\xe2", + "acirc;": "\xe2", + "acute": "\xb4", + "acute;": "\xb4", + "acy;": "\u0430", + "aelig": "\xe6", + "aelig;": "\xe6", + "af;": "\u2061", + "afr;": "\U0001d51e", + "agrave": "\xe0", + "agrave;": "\xe0", + "alefsym;": "\u2135", + "aleph;": "\u2135", + "alpha;": "\u03b1", + "amacr;": "\u0101", + "amalg;": "\u2a3f", + "amp": "&", + "amp;": "&", + "and;": "\u2227", + "andand;": "\u2a55", + "andd;": "\u2a5c", + "andslope;": "\u2a58", + "andv;": "\u2a5a", + "ang;": "\u2220", + "ange;": "\u29a4", + "angle;": "\u2220", + "angmsd;": "\u2221", + "angmsdaa;": "\u29a8", + "angmsdab;": "\u29a9", + "angmsdac;": "\u29aa", + "angmsdad;": "\u29ab", + "angmsdae;": "\u29ac", + "angmsdaf;": "\u29ad", + "angmsdag;": "\u29ae", + "angmsdah;": "\u29af", + "angrt;": "\u221f", + "angrtvb;": "\u22be", + "angrtvbd;": "\u299d", + "angsph;": "\u2222", + "angst;": "\xc5", + "angzarr;": "\u237c", + "aogon;": "\u0105", + "aopf;": "\U0001d552", + "ap;": "\u2248", + "apE;": "\u2a70", + "apacir;": "\u2a6f", + "ape;": "\u224a", + "apid;": "\u224b", + "apos;": "'", + "approx;": "\u2248", + "approxeq;": "\u224a", + "aring": "\xe5", + "aring;": "\xe5", + "ascr;": "\U0001d4b6", + "ast;": "*", + "asymp;": "\u2248", + "asympeq;": "\u224d", + "atilde": "\xe3", + "atilde;": "\xe3", + "auml": "\xe4", + "auml;": "\xe4", + "awconint;": "\u2233", + "awint;": "\u2a11", + "bNot;": "\u2aed", + "backcong;": "\u224c", + "backepsilon;": "\u03f6", + "backprime;": "\u2035", + "backsim;": "\u223d", + "backsimeq;": "\u22cd", + "barvee;": "\u22bd", + "barwed;": "\u2305", + "barwedge;": "\u2305", + "bbrk;": "\u23b5", + "bbrktbrk;": "\u23b6", + "bcong;": "\u224c", + "bcy;": "\u0431", + "bdquo;": "\u201e", + "becaus;": "\u2235", + "because;": "\u2235", + "bemptyv;": "\u29b0", + "bepsi;": "\u03f6", + "bernou;": "\u212c", + "beta;": "\u03b2", + "beth;": "\u2136", + "between;": "\u226c", + "bfr;": "\U0001d51f", + "bigcap;": "\u22c2", + "bigcirc;": "\u25ef", + "bigcup;": "\u22c3", + "bigodot;": "\u2a00", + "bigoplus;": "\u2a01", + "bigotimes;": "\u2a02", + "bigsqcup;": "\u2a06", + "bigstar;": "\u2605", + "bigtriangledown;": "\u25bd", + "bigtriangleup;": "\u25b3", + "biguplus;": "\u2a04", + "bigvee;": "\u22c1", + "bigwedge;": "\u22c0", + "bkarow;": "\u290d", + "blacklozenge;": "\u29eb", + "blacksquare;": "\u25aa", + "blacktriangle;": "\u25b4", + "blacktriangledown;": "\u25be", + "blacktriangleleft;": "\u25c2", + "blacktriangleright;": "\u25b8", + "blank;": "\u2423", + "blk12;": "\u2592", + "blk14;": "\u2591", + "blk34;": "\u2593", + "block;": "\u2588", + "bne;": "=\u20e5", + "bnequiv;": "\u2261\u20e5", + "bnot;": "\u2310", + "bopf;": "\U0001d553", + "bot;": "\u22a5", + "bottom;": "\u22a5", + "bowtie;": "\u22c8", + "boxDL;": "\u2557", + "boxDR;": "\u2554", + "boxDl;": "\u2556", + "boxDr;": "\u2553", + "boxH;": "\u2550", + "boxHD;": "\u2566", + "boxHU;": "\u2569", + "boxHd;": "\u2564", + "boxHu;": "\u2567", + "boxUL;": "\u255d", + "boxUR;": "\u255a", + "boxUl;": "\u255c", + "boxUr;": "\u2559", + "boxV;": "\u2551", + "boxVH;": "\u256c", + "boxVL;": "\u2563", + "boxVR;": "\u2560", + "boxVh;": "\u256b", + "boxVl;": "\u2562", + "boxVr;": "\u255f", + "boxbox;": "\u29c9", + "boxdL;": "\u2555", + "boxdR;": "\u2552", + "boxdl;": "\u2510", + "boxdr;": "\u250c", + "boxh;": "\u2500", + "boxhD;": "\u2565", + "boxhU;": "\u2568", + "boxhd;": "\u252c", + "boxhu;": "\u2534", + "boxminus;": "\u229f", + "boxplus;": "\u229e", + "boxtimes;": "\u22a0", + "boxuL;": "\u255b", + "boxuR;": "\u2558", + "boxul;": "\u2518", + "boxur;": "\u2514", + "boxv;": "\u2502", + "boxvH;": "\u256a", + "boxvL;": "\u2561", + "boxvR;": "\u255e", + "boxvh;": "\u253c", + "boxvl;": "\u2524", + "boxvr;": "\u251c", + "bprime;": "\u2035", + "breve;": "\u02d8", + "brvbar": "\xa6", + "brvbar;": "\xa6", + "bscr;": "\U0001d4b7", + "bsemi;": "\u204f", + "bsim;": "\u223d", + "bsime;": "\u22cd", + "bsol;": "\\", + "bsolb;": "\u29c5", + "bsolhsub;": "\u27c8", + "bull;": "\u2022", + "bullet;": "\u2022", + "bump;": "\u224e", + "bumpE;": "\u2aae", + "bumpe;": "\u224f", + "bumpeq;": "\u224f", + "cacute;": "\u0107", + "cap;": "\u2229", + "capand;": "\u2a44", + "capbrcup;": "\u2a49", + "capcap;": "\u2a4b", + "capcup;": "\u2a47", + "capdot;": "\u2a40", + "caps;": "\u2229\ufe00", + "caret;": "\u2041", + "caron;": "\u02c7", + "ccaps;": "\u2a4d", + "ccaron;": "\u010d", + "ccedil": "\xe7", + "ccedil;": "\xe7", + "ccirc;": "\u0109", + "ccups;": "\u2a4c", + "ccupssm;": "\u2a50", + "cdot;": "\u010b", + "cedil": "\xb8", + "cedil;": "\xb8", + "cemptyv;": "\u29b2", + "cent": "\xa2", + "cent;": "\xa2", + "centerdot;": "\xb7", + "cfr;": "\U0001d520", + "chcy;": "\u0447", + "check;": "\u2713", + "checkmark;": "\u2713", + "chi;": "\u03c7", + "cir;": "\u25cb", + "cirE;": "\u29c3", + "circ;": "\u02c6", + "circeq;": "\u2257", + "circlearrowleft;": "\u21ba", + "circlearrowright;": "\u21bb", + "circledR;": "\xae", + "circledS;": "\u24c8", + "circledast;": "\u229b", + "circledcirc;": "\u229a", + "circleddash;": "\u229d", + "cire;": "\u2257", + "cirfnint;": "\u2a10", + "cirmid;": "\u2aef", + "cirscir;": "\u29c2", + "clubs;": "\u2663", + "clubsuit;": "\u2663", + "colon;": ":", + "colone;": "\u2254", + "coloneq;": "\u2254", + "comma;": ",", + "commat;": "@", + "comp;": "\u2201", + "compfn;": "\u2218", + "complement;": "\u2201", + "complexes;": "\u2102", + "cong;": "\u2245", + "congdot;": "\u2a6d", + "conint;": "\u222e", + "copf;": "\U0001d554", + "coprod;": "\u2210", + "copy": "\xa9", + "copy;": "\xa9", + "copysr;": "\u2117", + "crarr;": "\u21b5", + "cross;": "\u2717", + "cscr;": "\U0001d4b8", + "csub;": "\u2acf", + "csube;": "\u2ad1", + "csup;": "\u2ad0", + "csupe;": "\u2ad2", + "ctdot;": "\u22ef", + "cudarrl;": "\u2938", + "cudarrr;": "\u2935", + "cuepr;": "\u22de", + "cuesc;": "\u22df", + "cularr;": "\u21b6", + "cularrp;": "\u293d", + "cup;": "\u222a", + "cupbrcap;": "\u2a48", + "cupcap;": "\u2a46", + "cupcup;": "\u2a4a", + "cupdot;": "\u228d", + "cupor;": "\u2a45", + "cups;": "\u222a\ufe00", + "curarr;": "\u21b7", + "curarrm;": "\u293c", + "curlyeqprec;": "\u22de", + "curlyeqsucc;": "\u22df", + "curlyvee;": "\u22ce", + "curlywedge;": "\u22cf", + "curren": "\xa4", + "curren;": "\xa4", + "curvearrowleft;": "\u21b6", + "curvearrowright;": "\u21b7", + "cuvee;": "\u22ce", + "cuwed;": "\u22cf", + "cwconint;": "\u2232", + "cwint;": "\u2231", + "cylcty;": "\u232d", + "dArr;": "\u21d3", + "dHar;": "\u2965", + "dagger;": "\u2020", + "daleth;": "\u2138", + "darr;": "\u2193", + "dash;": "\u2010", + "dashv;": "\u22a3", + "dbkarow;": "\u290f", + "dblac;": "\u02dd", + "dcaron;": "\u010f", + "dcy;": "\u0434", + "dd;": "\u2146", + "ddagger;": "\u2021", + "ddarr;": "\u21ca", + "ddotseq;": "\u2a77", + "deg": "\xb0", + "deg;": "\xb0", + "delta;": "\u03b4", + "demptyv;": "\u29b1", + "dfisht;": "\u297f", + "dfr;": "\U0001d521", + "dharl;": "\u21c3", + "dharr;": "\u21c2", + "diam;": "\u22c4", + "diamond;": "\u22c4", + "diamondsuit;": "\u2666", + "diams;": "\u2666", + "die;": "\xa8", + "digamma;": "\u03dd", + "disin;": "\u22f2", + "div;": "\xf7", + "divide": "\xf7", + "divide;": "\xf7", + "divideontimes;": "\u22c7", + "divonx;": "\u22c7", + "djcy;": "\u0452", + "dlcorn;": "\u231e", + "dlcrop;": "\u230d", + "dollar;": "$", + "dopf;": "\U0001d555", + "dot;": "\u02d9", + "doteq;": "\u2250", + "doteqdot;": "\u2251", + "dotminus;": "\u2238", + "dotplus;": "\u2214", + "dotsquare;": "\u22a1", + "doublebarwedge;": "\u2306", + "downarrow;": "\u2193", + "downdownarrows;": "\u21ca", + "downharpoonleft;": "\u21c3", + "downharpoonright;": "\u21c2", + "drbkarow;": "\u2910", + "drcorn;": "\u231f", + "drcrop;": "\u230c", + "dscr;": "\U0001d4b9", + "dscy;": "\u0455", + "dsol;": "\u29f6", + "dstrok;": "\u0111", + "dtdot;": "\u22f1", + "dtri;": "\u25bf", + "dtrif;": "\u25be", + "duarr;": "\u21f5", + "duhar;": "\u296f", + "dwangle;": "\u29a6", + "dzcy;": "\u045f", + "dzigrarr;": "\u27ff", + "eDDot;": "\u2a77", + "eDot;": "\u2251", + "eacute": "\xe9", + "eacute;": "\xe9", + "easter;": "\u2a6e", + "ecaron;": "\u011b", + "ecir;": "\u2256", + "ecirc": "\xea", + "ecirc;": "\xea", + "ecolon;": "\u2255", + "ecy;": "\u044d", + "edot;": "\u0117", + "ee;": "\u2147", + "efDot;": "\u2252", + "efr;": "\U0001d522", + "eg;": "\u2a9a", + "egrave": "\xe8", + "egrave;": "\xe8", + "egs;": "\u2a96", + "egsdot;": "\u2a98", + "el;": "\u2a99", + "elinters;": "\u23e7", + "ell;": "\u2113", + "els;": "\u2a95", + "elsdot;": "\u2a97", + "emacr;": "\u0113", + "empty;": "\u2205", + "emptyset;": "\u2205", + "emptyv;": "\u2205", + "emsp13;": "\u2004", + "emsp14;": "\u2005", + "emsp;": "\u2003", + "eng;": "\u014b", + "ensp;": "\u2002", + "eogon;": "\u0119", + "eopf;": "\U0001d556", + "epar;": "\u22d5", + "eparsl;": "\u29e3", + "eplus;": "\u2a71", + "epsi;": "\u03b5", + "epsilon;": "\u03b5", + "epsiv;": "\u03f5", + "eqcirc;": "\u2256", + "eqcolon;": "\u2255", + "eqsim;": "\u2242", + "eqslantgtr;": "\u2a96", + "eqslantless;": "\u2a95", + "equals;": "=", + "equest;": "\u225f", + "equiv;": "\u2261", + "equivDD;": "\u2a78", + "eqvparsl;": "\u29e5", + "erDot;": "\u2253", + "erarr;": "\u2971", + "escr;": "\u212f", + "esdot;": "\u2250", + "esim;": "\u2242", + "eta;": "\u03b7", + "eth": "\xf0", + "eth;": "\xf0", + "euml": "\xeb", + "euml;": "\xeb", + "euro;": "\u20ac", + "excl;": "!", + "exist;": "\u2203", + "expectation;": "\u2130", + "exponentiale;": "\u2147", + "fallingdotseq;": "\u2252", + "fcy;": "\u0444", + "female;": "\u2640", + "ffilig;": "\ufb03", + "fflig;": "\ufb00", + "ffllig;": "\ufb04", + "ffr;": "\U0001d523", + "filig;": "\ufb01", + "fjlig;": "fj", + "flat;": "\u266d", + "fllig;": "\ufb02", + "fltns;": "\u25b1", + "fnof;": "\u0192", + "fopf;": "\U0001d557", + "forall;": "\u2200", + "fork;": "\u22d4", + "forkv;": "\u2ad9", + "fpartint;": "\u2a0d", + "frac12": "\xbd", + "frac12;": "\xbd", + "frac13;": "\u2153", + "frac14": "\xbc", + "frac14;": "\xbc", + "frac15;": "\u2155", + "frac16;": "\u2159", + "frac18;": "\u215b", + "frac23;": "\u2154", + "frac25;": "\u2156", + "frac34": "\xbe", + "frac34;": "\xbe", + "frac35;": "\u2157", + "frac38;": "\u215c", + "frac45;": "\u2158", + "frac56;": "\u215a", + "frac58;": "\u215d", + "frac78;": "\u215e", + "frasl;": "\u2044", + "frown;": "\u2322", + "fscr;": "\U0001d4bb", + "gE;": "\u2267", + "gEl;": "\u2a8c", + "gacute;": "\u01f5", + "gamma;": "\u03b3", + "gammad;": "\u03dd", + "gap;": "\u2a86", + "gbreve;": "\u011f", + "gcirc;": "\u011d", + "gcy;": "\u0433", + "gdot;": "\u0121", + "ge;": "\u2265", + "gel;": "\u22db", + "geq;": "\u2265", + "geqq;": "\u2267", + "geqslant;": "\u2a7e", + "ges;": "\u2a7e", + "gescc;": "\u2aa9", + "gesdot;": "\u2a80", + "gesdoto;": "\u2a82", + "gesdotol;": "\u2a84", + "gesl;": "\u22db\ufe00", + "gesles;": "\u2a94", + "gfr;": "\U0001d524", + "gg;": "\u226b", + "ggg;": "\u22d9", + "gimel;": "\u2137", + "gjcy;": "\u0453", + "gl;": "\u2277", + "glE;": "\u2a92", + "gla;": "\u2aa5", + "glj;": "\u2aa4", + "gnE;": "\u2269", + "gnap;": "\u2a8a", + "gnapprox;": "\u2a8a", + "gne;": "\u2a88", + "gneq;": "\u2a88", + "gneqq;": "\u2269", + "gnsim;": "\u22e7", + "gopf;": "\U0001d558", + "grave;": "`", + "gscr;": "\u210a", + "gsim;": "\u2273", + "gsime;": "\u2a8e", + "gsiml;": "\u2a90", + "gt": ">", + "gt;": ">", + "gtcc;": "\u2aa7", + "gtcir;": "\u2a7a", + "gtdot;": "\u22d7", + "gtlPar;": "\u2995", + "gtquest;": "\u2a7c", + "gtrapprox;": "\u2a86", + "gtrarr;": "\u2978", + "gtrdot;": "\u22d7", + "gtreqless;": "\u22db", + "gtreqqless;": "\u2a8c", + "gtrless;": "\u2277", + "gtrsim;": "\u2273", + "gvertneqq;": "\u2269\ufe00", + "gvnE;": "\u2269\ufe00", + "hArr;": "\u21d4", + "hairsp;": "\u200a", + "half;": "\xbd", + "hamilt;": "\u210b", + "hardcy;": "\u044a", + "harr;": "\u2194", + "harrcir;": "\u2948", + "harrw;": "\u21ad", + "hbar;": "\u210f", + "hcirc;": "\u0125", + "hearts;": "\u2665", + "heartsuit;": "\u2665", + "hellip;": "\u2026", + "hercon;": "\u22b9", + "hfr;": "\U0001d525", + "hksearow;": "\u2925", + "hkswarow;": "\u2926", + "hoarr;": "\u21ff", + "homtht;": "\u223b", + "hookleftarrow;": "\u21a9", + "hookrightarrow;": "\u21aa", + "hopf;": "\U0001d559", + "horbar;": "\u2015", + "hscr;": "\U0001d4bd", + "hslash;": "\u210f", + "hstrok;": "\u0127", + "hybull;": "\u2043", + "hyphen;": "\u2010", + "iacute": "\xed", + "iacute;": "\xed", + "ic;": "\u2063", + "icirc": "\xee", + "icirc;": "\xee", + "icy;": "\u0438", + "iecy;": "\u0435", + "iexcl": "\xa1", + "iexcl;": "\xa1", + "iff;": "\u21d4", + "ifr;": "\U0001d526", + "igrave": "\xec", + "igrave;": "\xec", + "ii;": "\u2148", + "iiiint;": "\u2a0c", + "iiint;": "\u222d", + "iinfin;": "\u29dc", + "iiota;": "\u2129", + "ijlig;": "\u0133", + "imacr;": "\u012b", + "image;": "\u2111", + "imagline;": "\u2110", + "imagpart;": "\u2111", + "imath;": "\u0131", + "imof;": "\u22b7", + "imped;": "\u01b5", + "in;": "\u2208", + "incare;": "\u2105", + "infin;": "\u221e", + "infintie;": "\u29dd", + "inodot;": "\u0131", + "int;": "\u222b", + "intcal;": "\u22ba", + "integers;": "\u2124", + "intercal;": "\u22ba", + "intlarhk;": "\u2a17", + "intprod;": "\u2a3c", + "iocy;": "\u0451", + "iogon;": "\u012f", + "iopf;": "\U0001d55a", + "iota;": "\u03b9", + "iprod;": "\u2a3c", + "iquest": "\xbf", + "iquest;": "\xbf", + "iscr;": "\U0001d4be", + "isin;": "\u2208", + "isinE;": "\u22f9", + "isindot;": "\u22f5", + "isins;": "\u22f4", + "isinsv;": "\u22f3", + "isinv;": "\u2208", + "it;": "\u2062", + "itilde;": "\u0129", + "iukcy;": "\u0456", + "iuml": "\xef", + "iuml;": "\xef", + "jcirc;": "\u0135", + "jcy;": "\u0439", + "jfr;": "\U0001d527", + "jmath;": "\u0237", + "jopf;": "\U0001d55b", + "jscr;": "\U0001d4bf", + "jsercy;": "\u0458", + "jukcy;": "\u0454", + "kappa;": "\u03ba", + "kappav;": "\u03f0", + "kcedil;": "\u0137", + "kcy;": "\u043a", + "kfr;": "\U0001d528", + "kgreen;": "\u0138", + "khcy;": "\u0445", + "kjcy;": "\u045c", + "kopf;": "\U0001d55c", + "kscr;": "\U0001d4c0", + "lAarr;": "\u21da", + "lArr;": "\u21d0", + "lAtail;": "\u291b", + "lBarr;": "\u290e", + "lE;": "\u2266", + "lEg;": "\u2a8b", + "lHar;": "\u2962", + "lacute;": "\u013a", + "laemptyv;": "\u29b4", + "lagran;": "\u2112", + "lambda;": "\u03bb", + "lang;": "\u27e8", + "langd;": "\u2991", + "langle;": "\u27e8", + "lap;": "\u2a85", + "laquo": "\xab", + "laquo;": "\xab", + "larr;": "\u2190", + "larrb;": "\u21e4", + "larrbfs;": "\u291f", + "larrfs;": "\u291d", + "larrhk;": "\u21a9", + "larrlp;": "\u21ab", + "larrpl;": "\u2939", + "larrsim;": "\u2973", + "larrtl;": "\u21a2", + "lat;": "\u2aab", + "latail;": "\u2919", + "late;": "\u2aad", + "lates;": "\u2aad\ufe00", + "lbarr;": "\u290c", + "lbbrk;": "\u2772", + "lbrace;": "{", + "lbrack;": "[", + "lbrke;": "\u298b", + "lbrksld;": "\u298f", + "lbrkslu;": "\u298d", + "lcaron;": "\u013e", + "lcedil;": "\u013c", + "lceil;": "\u2308", + "lcub;": "{", + "lcy;": "\u043b", + "ldca;": "\u2936", + "ldquo;": "\u201c", + "ldquor;": "\u201e", + "ldrdhar;": "\u2967", + "ldrushar;": "\u294b", + "ldsh;": "\u21b2", + "le;": "\u2264", + "leftarrow;": "\u2190", + "leftarrowtail;": "\u21a2", + "leftharpoondown;": "\u21bd", + "leftharpoonup;": "\u21bc", + "leftleftarrows;": "\u21c7", + "leftrightarrow;": "\u2194", + "leftrightarrows;": "\u21c6", + "leftrightharpoons;": "\u21cb", + "leftrightsquigarrow;": "\u21ad", + "leftthreetimes;": "\u22cb", + "leg;": "\u22da", + "leq;": "\u2264", + "leqq;": "\u2266", + "leqslant;": "\u2a7d", + "les;": "\u2a7d", + "lescc;": "\u2aa8", + "lesdot;": "\u2a7f", + "lesdoto;": "\u2a81", + "lesdotor;": "\u2a83", + "lesg;": "\u22da\ufe00", + "lesges;": "\u2a93", + "lessapprox;": "\u2a85", + "lessdot;": "\u22d6", + "lesseqgtr;": "\u22da", + "lesseqqgtr;": "\u2a8b", + "lessgtr;": "\u2276", + "lesssim;": "\u2272", + "lfisht;": "\u297c", + "lfloor;": "\u230a", + "lfr;": "\U0001d529", + "lg;": "\u2276", + "lgE;": "\u2a91", + "lhard;": "\u21bd", + "lharu;": "\u21bc", + "lharul;": "\u296a", + "lhblk;": "\u2584", + "ljcy;": "\u0459", + "ll;": "\u226a", + "llarr;": "\u21c7", + "llcorner;": "\u231e", + "llhard;": "\u296b", + "lltri;": "\u25fa", + "lmidot;": "\u0140", + "lmoust;": "\u23b0", + "lmoustache;": "\u23b0", + "lnE;": "\u2268", + "lnap;": "\u2a89", + "lnapprox;": "\u2a89", + "lne;": "\u2a87", + "lneq;": "\u2a87", + "lneqq;": "\u2268", + "lnsim;": "\u22e6", + "loang;": "\u27ec", + "loarr;": "\u21fd", + "lobrk;": "\u27e6", + "longleftarrow;": "\u27f5", + "longleftrightarrow;": "\u27f7", + "longmapsto;": "\u27fc", + "longrightarrow;": "\u27f6", + "looparrowleft;": "\u21ab", + "looparrowright;": "\u21ac", + "lopar;": "\u2985", + "lopf;": "\U0001d55d", + "loplus;": "\u2a2d", + "lotimes;": "\u2a34", + "lowast;": "\u2217", + "lowbar;": "_", + "loz;": "\u25ca", + "lozenge;": "\u25ca", + "lozf;": "\u29eb", + "lpar;": "(", + "lparlt;": "\u2993", + "lrarr;": "\u21c6", + "lrcorner;": "\u231f", + "lrhar;": "\u21cb", + "lrhard;": "\u296d", + "lrm;": "\u200e", + "lrtri;": "\u22bf", + "lsaquo;": "\u2039", + "lscr;": "\U0001d4c1", + "lsh;": "\u21b0", + "lsim;": "\u2272", + "lsime;": "\u2a8d", + "lsimg;": "\u2a8f", + "lsqb;": "[", + "lsquo;": "\u2018", + "lsquor;": "\u201a", + "lstrok;": "\u0142", + "lt": "<", + "lt;": "<", + "ltcc;": "\u2aa6", + "ltcir;": "\u2a79", + "ltdot;": "\u22d6", + "lthree;": "\u22cb", + "ltimes;": "\u22c9", + "ltlarr;": "\u2976", + "ltquest;": "\u2a7b", + "ltrPar;": "\u2996", + "ltri;": "\u25c3", + "ltrie;": "\u22b4", + "ltrif;": "\u25c2", + "lurdshar;": "\u294a", + "luruhar;": "\u2966", + "lvertneqq;": "\u2268\ufe00", + "lvnE;": "\u2268\ufe00", + "mDDot;": "\u223a", + "macr": "\xaf", + "macr;": "\xaf", + "male;": "\u2642", + "malt;": "\u2720", + "maltese;": "\u2720", + "map;": "\u21a6", + "mapsto;": "\u21a6", + "mapstodown;": "\u21a7", + "mapstoleft;": "\u21a4", + "mapstoup;": "\u21a5", + "marker;": "\u25ae", + "mcomma;": "\u2a29", + "mcy;": "\u043c", + "mdash;": "\u2014", + "measuredangle;": "\u2221", + "mfr;": "\U0001d52a", + "mho;": "\u2127", + "micro": "\xb5", + "micro;": "\xb5", + "mid;": "\u2223", + "midast;": "*", + "midcir;": "\u2af0", + "middot": "\xb7", + "middot;": "\xb7", + "minus;": "\u2212", + "minusb;": "\u229f", + "minusd;": "\u2238", + "minusdu;": "\u2a2a", + "mlcp;": "\u2adb", + "mldr;": "\u2026", + "mnplus;": "\u2213", + "models;": "\u22a7", + "mopf;": "\U0001d55e", + "mp;": "\u2213", + "mscr;": "\U0001d4c2", + "mstpos;": "\u223e", + "mu;": "\u03bc", + "multimap;": "\u22b8", + "mumap;": "\u22b8", + "nGg;": "\u22d9\u0338", + "nGt;": "\u226b\u20d2", + "nGtv;": "\u226b\u0338", + "nLeftarrow;": "\u21cd", + "nLeftrightarrow;": "\u21ce", + "nLl;": "\u22d8\u0338", + "nLt;": "\u226a\u20d2", + "nLtv;": "\u226a\u0338", + "nRightarrow;": "\u21cf", + "nVDash;": "\u22af", + "nVdash;": "\u22ae", + "nabla;": "\u2207", + "nacute;": "\u0144", + "nang;": "\u2220\u20d2", + "nap;": "\u2249", + "napE;": "\u2a70\u0338", + "napid;": "\u224b\u0338", + "napos;": "\u0149", + "napprox;": "\u2249", + "natur;": "\u266e", + "natural;": "\u266e", + "naturals;": "\u2115", + "nbsp": "\xa0", + "nbsp;": "\xa0", + "nbump;": "\u224e\u0338", + "nbumpe;": "\u224f\u0338", + "ncap;": "\u2a43", + "ncaron;": "\u0148", + "ncedil;": "\u0146", + "ncong;": "\u2247", + "ncongdot;": "\u2a6d\u0338", + "ncup;": "\u2a42", + "ncy;": "\u043d", + "ndash;": "\u2013", + "ne;": "\u2260", + "neArr;": "\u21d7", + "nearhk;": "\u2924", + "nearr;": "\u2197", + "nearrow;": "\u2197", + "nedot;": "\u2250\u0338", + "nequiv;": "\u2262", + "nesear;": "\u2928", + "nesim;": "\u2242\u0338", + "nexist;": "\u2204", + "nexists;": "\u2204", + "nfr;": "\U0001d52b", + "ngE;": "\u2267\u0338", + "nge;": "\u2271", + "ngeq;": "\u2271", + "ngeqq;": "\u2267\u0338", + "ngeqslant;": "\u2a7e\u0338", + "nges;": "\u2a7e\u0338", + "ngsim;": "\u2275", + "ngt;": "\u226f", + "ngtr;": "\u226f", + "nhArr;": "\u21ce", + "nharr;": "\u21ae", + "nhpar;": "\u2af2", + "ni;": "\u220b", + "nis;": "\u22fc", + "nisd;": "\u22fa", + "niv;": "\u220b", + "njcy;": "\u045a", + "nlArr;": "\u21cd", + "nlE;": "\u2266\u0338", + "nlarr;": "\u219a", + "nldr;": "\u2025", + "nle;": "\u2270", + "nleftarrow;": "\u219a", + "nleftrightarrow;": "\u21ae", + "nleq;": "\u2270", + "nleqq;": "\u2266\u0338", + "nleqslant;": "\u2a7d\u0338", + "nles;": "\u2a7d\u0338", + "nless;": "\u226e", + "nlsim;": "\u2274", + "nlt;": "\u226e", + "nltri;": "\u22ea", + "nltrie;": "\u22ec", + "nmid;": "\u2224", + "nopf;": "\U0001d55f", + "not": "\xac", + "not;": "\xac", + "notin;": "\u2209", + "notinE;": "\u22f9\u0338", + "notindot;": "\u22f5\u0338", + "notinva;": "\u2209", + "notinvb;": "\u22f7", + "notinvc;": "\u22f6", + "notni;": "\u220c", + "notniva;": "\u220c", + "notnivb;": "\u22fe", + "notnivc;": "\u22fd", + "npar;": "\u2226", + "nparallel;": "\u2226", + "nparsl;": "\u2afd\u20e5", + "npart;": "\u2202\u0338", + "npolint;": "\u2a14", + "npr;": "\u2280", + "nprcue;": "\u22e0", + "npre;": "\u2aaf\u0338", + "nprec;": "\u2280", + "npreceq;": "\u2aaf\u0338", + "nrArr;": "\u21cf", + "nrarr;": "\u219b", + "nrarrc;": "\u2933\u0338", + "nrarrw;": "\u219d\u0338", + "nrightarrow;": "\u219b", + "nrtri;": "\u22eb", + "nrtrie;": "\u22ed", + "nsc;": "\u2281", + "nsccue;": "\u22e1", + "nsce;": "\u2ab0\u0338", + "nscr;": "\U0001d4c3", + "nshortmid;": "\u2224", + "nshortparallel;": "\u2226", + "nsim;": "\u2241", + "nsime;": "\u2244", + "nsimeq;": "\u2244", + "nsmid;": "\u2224", + "nspar;": "\u2226", + "nsqsube;": "\u22e2", + "nsqsupe;": "\u22e3", + "nsub;": "\u2284", + "nsubE;": "\u2ac5\u0338", + "nsube;": "\u2288", + "nsubset;": "\u2282\u20d2", + "nsubseteq;": "\u2288", + "nsubseteqq;": "\u2ac5\u0338", + "nsucc;": "\u2281", + "nsucceq;": "\u2ab0\u0338", + "nsup;": "\u2285", + "nsupE;": "\u2ac6\u0338", + "nsupe;": "\u2289", + "nsupset;": "\u2283\u20d2", + "nsupseteq;": "\u2289", + "nsupseteqq;": "\u2ac6\u0338", + "ntgl;": "\u2279", + "ntilde": "\xf1", + "ntilde;": "\xf1", + "ntlg;": "\u2278", + "ntriangleleft;": "\u22ea", + "ntrianglelefteq;": "\u22ec", + "ntriangleright;": "\u22eb", + "ntrianglerighteq;": "\u22ed", + "nu;": "\u03bd", + "num;": "#", + "numero;": "\u2116", + "numsp;": "\u2007", + "nvDash;": "\u22ad", + "nvHarr;": "\u2904", + "nvap;": "\u224d\u20d2", + "nvdash;": "\u22ac", + "nvge;": "\u2265\u20d2", + "nvgt;": ">\u20d2", + "nvinfin;": "\u29de", + "nvlArr;": "\u2902", + "nvle;": "\u2264\u20d2", + "nvlt;": "<\u20d2", + "nvltrie;": "\u22b4\u20d2", + "nvrArr;": "\u2903", + "nvrtrie;": "\u22b5\u20d2", + "nvsim;": "\u223c\u20d2", + "nwArr;": "\u21d6", + "nwarhk;": "\u2923", + "nwarr;": "\u2196", + "nwarrow;": "\u2196", + "nwnear;": "\u2927", + "oS;": "\u24c8", + "oacute": "\xf3", + "oacute;": "\xf3", + "oast;": "\u229b", + "ocir;": "\u229a", + "ocirc": "\xf4", + "ocirc;": "\xf4", + "ocy;": "\u043e", + "odash;": "\u229d", + "odblac;": "\u0151", + "odiv;": "\u2a38", + "odot;": "\u2299", + "odsold;": "\u29bc", + "oelig;": "\u0153", + "ofcir;": "\u29bf", + "ofr;": "\U0001d52c", + "ogon;": "\u02db", + "ograve": "\xf2", + "ograve;": "\xf2", + "ogt;": "\u29c1", + "ohbar;": "\u29b5", + "ohm;": "\u03a9", + "oint;": "\u222e", + "olarr;": "\u21ba", + "olcir;": "\u29be", + "olcross;": "\u29bb", + "oline;": "\u203e", + "olt;": "\u29c0", + "omacr;": "\u014d", + "omega;": "\u03c9", + "omicron;": "\u03bf", + "omid;": "\u29b6", + "ominus;": "\u2296", + "oopf;": "\U0001d560", + "opar;": "\u29b7", + "operp;": "\u29b9", + "oplus;": "\u2295", + "or;": "\u2228", + "orarr;": "\u21bb", + "ord;": "\u2a5d", + "order;": "\u2134", + "orderof;": "\u2134", + "ordf": "\xaa", + "ordf;": "\xaa", + "ordm": "\xba", + "ordm;": "\xba", + "origof;": "\u22b6", + "oror;": "\u2a56", + "orslope;": "\u2a57", + "orv;": "\u2a5b", + "oscr;": "\u2134", + "oslash": "\xf8", + "oslash;": "\xf8", + "osol;": "\u2298", + "otilde": "\xf5", + "otilde;": "\xf5", + "otimes;": "\u2297", + "otimesas;": "\u2a36", + "ouml": "\xf6", + "ouml;": "\xf6", + "ovbar;": "\u233d", + "par;": "\u2225", + "para": "\xb6", + "para;": "\xb6", + "parallel;": "\u2225", + "parsim;": "\u2af3", + "parsl;": "\u2afd", + "part;": "\u2202", + "pcy;": "\u043f", + "percnt;": "%", + "period;": ".", + "permil;": "\u2030", + "perp;": "\u22a5", + "pertenk;": "\u2031", + "pfr;": "\U0001d52d", + "phi;": "\u03c6", + "phiv;": "\u03d5", + "phmmat;": "\u2133", + "phone;": "\u260e", + "pi;": "\u03c0", + "pitchfork;": "\u22d4", + "piv;": "\u03d6", + "planck;": "\u210f", + "planckh;": "\u210e", + "plankv;": "\u210f", + "plus;": "+", + "plusacir;": "\u2a23", + "plusb;": "\u229e", + "pluscir;": "\u2a22", + "plusdo;": "\u2214", + "plusdu;": "\u2a25", + "pluse;": "\u2a72", + "plusmn": "\xb1", + "plusmn;": "\xb1", + "plussim;": "\u2a26", + "plustwo;": "\u2a27", + "pm;": "\xb1", + "pointint;": "\u2a15", + "popf;": "\U0001d561", + "pound": "\xa3", + "pound;": "\xa3", + "pr;": "\u227a", + "prE;": "\u2ab3", + "prap;": "\u2ab7", + "prcue;": "\u227c", + "pre;": "\u2aaf", + "prec;": "\u227a", + "precapprox;": "\u2ab7", + "preccurlyeq;": "\u227c", + "preceq;": "\u2aaf", + "precnapprox;": "\u2ab9", + "precneqq;": "\u2ab5", + "precnsim;": "\u22e8", + "precsim;": "\u227e", + "prime;": "\u2032", + "primes;": "\u2119", + "prnE;": "\u2ab5", + "prnap;": "\u2ab9", + "prnsim;": "\u22e8", + "prod;": "\u220f", + "profalar;": "\u232e", + "profline;": "\u2312", + "profsurf;": "\u2313", + "prop;": "\u221d", + "propto;": "\u221d", + "prsim;": "\u227e", + "prurel;": "\u22b0", + "pscr;": "\U0001d4c5", + "psi;": "\u03c8", + "puncsp;": "\u2008", + "qfr;": "\U0001d52e", + "qint;": "\u2a0c", + "qopf;": "\U0001d562", + "qprime;": "\u2057", + "qscr;": "\U0001d4c6", + "quaternions;": "\u210d", + "quatint;": "\u2a16", + "quest;": "?", + "questeq;": "\u225f", + "quot": "\"", + "quot;": "\"", + "rAarr;": "\u21db", + "rArr;": "\u21d2", + "rAtail;": "\u291c", + "rBarr;": "\u290f", + "rHar;": "\u2964", + "race;": "\u223d\u0331", + "racute;": "\u0155", + "radic;": "\u221a", + "raemptyv;": "\u29b3", + "rang;": "\u27e9", + "rangd;": "\u2992", + "range;": "\u29a5", + "rangle;": "\u27e9", + "raquo": "\xbb", + "raquo;": "\xbb", + "rarr;": "\u2192", + "rarrap;": "\u2975", + "rarrb;": "\u21e5", + "rarrbfs;": "\u2920", + "rarrc;": "\u2933", + "rarrfs;": "\u291e", + "rarrhk;": "\u21aa", + "rarrlp;": "\u21ac", + "rarrpl;": "\u2945", + "rarrsim;": "\u2974", + "rarrtl;": "\u21a3", + "rarrw;": "\u219d", + "ratail;": "\u291a", + "ratio;": "\u2236", + "rationals;": "\u211a", + "rbarr;": "\u290d", + "rbbrk;": "\u2773", + "rbrace;": "}", + "rbrack;": "]", + "rbrke;": "\u298c", + "rbrksld;": "\u298e", + "rbrkslu;": "\u2990", + "rcaron;": "\u0159", + "rcedil;": "\u0157", + "rceil;": "\u2309", + "rcub;": "}", + "rcy;": "\u0440", + "rdca;": "\u2937", + "rdldhar;": "\u2969", + "rdquo;": "\u201d", + "rdquor;": "\u201d", + "rdsh;": "\u21b3", + "real;": "\u211c", + "realine;": "\u211b", + "realpart;": "\u211c", + "reals;": "\u211d", + "rect;": "\u25ad", + "reg": "\xae", + "reg;": "\xae", + "rfisht;": "\u297d", + "rfloor;": "\u230b", + "rfr;": "\U0001d52f", + "rhard;": "\u21c1", + "rharu;": "\u21c0", + "rharul;": "\u296c", + "rho;": "\u03c1", + "rhov;": "\u03f1", + "rightarrow;": "\u2192", + "rightarrowtail;": "\u21a3", + "rightharpoondown;": "\u21c1", + "rightharpoonup;": "\u21c0", + "rightleftarrows;": "\u21c4", + "rightleftharpoons;": "\u21cc", + "rightrightarrows;": "\u21c9", + "rightsquigarrow;": "\u219d", + "rightthreetimes;": "\u22cc", + "ring;": "\u02da", + "risingdotseq;": "\u2253", + "rlarr;": "\u21c4", + "rlhar;": "\u21cc", + "rlm;": "\u200f", + "rmoust;": "\u23b1", + "rmoustache;": "\u23b1", + "rnmid;": "\u2aee", + "roang;": "\u27ed", + "roarr;": "\u21fe", + "robrk;": "\u27e7", + "ropar;": "\u2986", + "ropf;": "\U0001d563", + "roplus;": "\u2a2e", + "rotimes;": "\u2a35", + "rpar;": ")", + "rpargt;": "\u2994", + "rppolint;": "\u2a12", + "rrarr;": "\u21c9", + "rsaquo;": "\u203a", + "rscr;": "\U0001d4c7", + "rsh;": "\u21b1", + "rsqb;": "]", + "rsquo;": "\u2019", + "rsquor;": "\u2019", + "rthree;": "\u22cc", + "rtimes;": "\u22ca", + "rtri;": "\u25b9", + "rtrie;": "\u22b5", + "rtrif;": "\u25b8", + "rtriltri;": "\u29ce", + "ruluhar;": "\u2968", + "rx;": "\u211e", + "sacute;": "\u015b", + "sbquo;": "\u201a", + "sc;": "\u227b", + "scE;": "\u2ab4", + "scap;": "\u2ab8", + "scaron;": "\u0161", + "sccue;": "\u227d", + "sce;": "\u2ab0", + "scedil;": "\u015f", + "scirc;": "\u015d", + "scnE;": "\u2ab6", + "scnap;": "\u2aba", + "scnsim;": "\u22e9", + "scpolint;": "\u2a13", + "scsim;": "\u227f", + "scy;": "\u0441", + "sdot;": "\u22c5", + "sdotb;": "\u22a1", + "sdote;": "\u2a66", + "seArr;": "\u21d8", + "searhk;": "\u2925", + "searr;": "\u2198", + "searrow;": "\u2198", + "sect": "\xa7", + "sect;": "\xa7", + "semi;": ";", + "seswar;": "\u2929", + "setminus;": "\u2216", + "setmn;": "\u2216", + "sext;": "\u2736", + "sfr;": "\U0001d530", + "sfrown;": "\u2322", + "sharp;": "\u266f", + "shchcy;": "\u0449", + "shcy;": "\u0448", + "shortmid;": "\u2223", + "shortparallel;": "\u2225", + "shy": "\xad", + "shy;": "\xad", + "sigma;": "\u03c3", + "sigmaf;": "\u03c2", + "sigmav;": "\u03c2", + "sim;": "\u223c", + "simdot;": "\u2a6a", + "sime;": "\u2243", + "simeq;": "\u2243", + "simg;": "\u2a9e", + "simgE;": "\u2aa0", + "siml;": "\u2a9d", + "simlE;": "\u2a9f", + "simne;": "\u2246", + "simplus;": "\u2a24", + "simrarr;": "\u2972", + "slarr;": "\u2190", + "smallsetminus;": "\u2216", + "smashp;": "\u2a33", + "smeparsl;": "\u29e4", + "smid;": "\u2223", + "smile;": "\u2323", + "smt;": "\u2aaa", + "smte;": "\u2aac", + "smtes;": "\u2aac\ufe00", + "softcy;": "\u044c", + "sol;": "/", + "solb;": "\u29c4", + "solbar;": "\u233f", + "sopf;": "\U0001d564", + "spades;": "\u2660", + "spadesuit;": "\u2660", + "spar;": "\u2225", + "sqcap;": "\u2293", + "sqcaps;": "\u2293\ufe00", + "sqcup;": "\u2294", + "sqcups;": "\u2294\ufe00", + "sqsub;": "\u228f", + "sqsube;": "\u2291", + "sqsubset;": "\u228f", + "sqsubseteq;": "\u2291", + "sqsup;": "\u2290", + "sqsupe;": "\u2292", + "sqsupset;": "\u2290", + "sqsupseteq;": "\u2292", + "squ;": "\u25a1", + "square;": "\u25a1", + "squarf;": "\u25aa", + "squf;": "\u25aa", + "srarr;": "\u2192", + "sscr;": "\U0001d4c8", + "ssetmn;": "\u2216", + "ssmile;": "\u2323", + "sstarf;": "\u22c6", + "star;": "\u2606", + "starf;": "\u2605", + "straightepsilon;": "\u03f5", + "straightphi;": "\u03d5", + "strns;": "\xaf", + "sub;": "\u2282", + "subE;": "\u2ac5", + "subdot;": "\u2abd", + "sube;": "\u2286", + "subedot;": "\u2ac3", + "submult;": "\u2ac1", + "subnE;": "\u2acb", + "subne;": "\u228a", + "subplus;": "\u2abf", + "subrarr;": "\u2979", + "subset;": "\u2282", + "subseteq;": "\u2286", + "subseteqq;": "\u2ac5", + "subsetneq;": "\u228a", + "subsetneqq;": "\u2acb", + "subsim;": "\u2ac7", + "subsub;": "\u2ad5", + "subsup;": "\u2ad3", + "succ;": "\u227b", + "succapprox;": "\u2ab8", + "succcurlyeq;": "\u227d", + "succeq;": "\u2ab0", + "succnapprox;": "\u2aba", + "succneqq;": "\u2ab6", + "succnsim;": "\u22e9", + "succsim;": "\u227f", + "sum;": "\u2211", + "sung;": "\u266a", + "sup1": "\xb9", + "sup1;": "\xb9", + "sup2": "\xb2", + "sup2;": "\xb2", + "sup3": "\xb3", + "sup3;": "\xb3", + "sup;": "\u2283", + "supE;": "\u2ac6", + "supdot;": "\u2abe", + "supdsub;": "\u2ad8", + "supe;": "\u2287", + "supedot;": "\u2ac4", + "suphsol;": "\u27c9", + "suphsub;": "\u2ad7", + "suplarr;": "\u297b", + "supmult;": "\u2ac2", + "supnE;": "\u2acc", + "supne;": "\u228b", + "supplus;": "\u2ac0", + "supset;": "\u2283", + "supseteq;": "\u2287", + "supseteqq;": "\u2ac6", + "supsetneq;": "\u228b", + "supsetneqq;": "\u2acc", + "supsim;": "\u2ac8", + "supsub;": "\u2ad4", + "supsup;": "\u2ad6", + "swArr;": "\u21d9", + "swarhk;": "\u2926", + "swarr;": "\u2199", + "swarrow;": "\u2199", + "swnwar;": "\u292a", + "szlig": "\xdf", + "szlig;": "\xdf", + "target;": "\u2316", + "tau;": "\u03c4", + "tbrk;": "\u23b4", + "tcaron;": "\u0165", + "tcedil;": "\u0163", + "tcy;": "\u0442", + "tdot;": "\u20db", + "telrec;": "\u2315", + "tfr;": "\U0001d531", + "there4;": "\u2234", + "therefore;": "\u2234", + "theta;": "\u03b8", + "thetasym;": "\u03d1", + "thetav;": "\u03d1", + "thickapprox;": "\u2248", + "thicksim;": "\u223c", + "thinsp;": "\u2009", + "thkap;": "\u2248", + "thksim;": "\u223c", + "thorn": "\xfe", + "thorn;": "\xfe", + "tilde;": "\u02dc", + "times": "\xd7", + "times;": "\xd7", + "timesb;": "\u22a0", + "timesbar;": "\u2a31", + "timesd;": "\u2a30", + "tint;": "\u222d", + "toea;": "\u2928", + "top;": "\u22a4", + "topbot;": "\u2336", + "topcir;": "\u2af1", + "topf;": "\U0001d565", + "topfork;": "\u2ada", + "tosa;": "\u2929", + "tprime;": "\u2034", + "trade;": "\u2122", + "triangle;": "\u25b5", + "triangledown;": "\u25bf", + "triangleleft;": "\u25c3", + "trianglelefteq;": "\u22b4", + "triangleq;": "\u225c", + "triangleright;": "\u25b9", + "trianglerighteq;": "\u22b5", + "tridot;": "\u25ec", + "trie;": "\u225c", + "triminus;": "\u2a3a", + "triplus;": "\u2a39", + "trisb;": "\u29cd", + "tritime;": "\u2a3b", + "trpezium;": "\u23e2", + "tscr;": "\U0001d4c9", + "tscy;": "\u0446", + "tshcy;": "\u045b", + "tstrok;": "\u0167", + "twixt;": "\u226c", + "twoheadleftarrow;": "\u219e", + "twoheadrightarrow;": "\u21a0", + "uArr;": "\u21d1", + "uHar;": "\u2963", + "uacute": "\xfa", + "uacute;": "\xfa", + "uarr;": "\u2191", + "ubrcy;": "\u045e", + "ubreve;": "\u016d", + "ucirc": "\xfb", + "ucirc;": "\xfb", + "ucy;": "\u0443", + "udarr;": "\u21c5", + "udblac;": "\u0171", + "udhar;": "\u296e", + "ufisht;": "\u297e", + "ufr;": "\U0001d532", + "ugrave": "\xf9", + "ugrave;": "\xf9", + "uharl;": "\u21bf", + "uharr;": "\u21be", + "uhblk;": "\u2580", + "ulcorn;": "\u231c", + "ulcorner;": "\u231c", + "ulcrop;": "\u230f", + "ultri;": "\u25f8", + "umacr;": "\u016b", + "uml": "\xa8", + "uml;": "\xa8", + "uogon;": "\u0173", + "uopf;": "\U0001d566", + "uparrow;": "\u2191", + "updownarrow;": "\u2195", + "upharpoonleft;": "\u21bf", + "upharpoonright;": "\u21be", + "uplus;": "\u228e", + "upsi;": "\u03c5", + "upsih;": "\u03d2", + "upsilon;": "\u03c5", + "upuparrows;": "\u21c8", + "urcorn;": "\u231d", + "urcorner;": "\u231d", + "urcrop;": "\u230e", + "uring;": "\u016f", + "urtri;": "\u25f9", + "uscr;": "\U0001d4ca", + "utdot;": "\u22f0", + "utilde;": "\u0169", + "utri;": "\u25b5", + "utrif;": "\u25b4", + "uuarr;": "\u21c8", + "uuml": "\xfc", + "uuml;": "\xfc", + "uwangle;": "\u29a7", + "vArr;": "\u21d5", + "vBar;": "\u2ae8", + "vBarv;": "\u2ae9", + "vDash;": "\u22a8", + "vangrt;": "\u299c", + "varepsilon;": "\u03f5", + "varkappa;": "\u03f0", + "varnothing;": "\u2205", + "varphi;": "\u03d5", + "varpi;": "\u03d6", + "varpropto;": "\u221d", + "varr;": "\u2195", + "varrho;": "\u03f1", + "varsigma;": "\u03c2", + "varsubsetneq;": "\u228a\ufe00", + "varsubsetneqq;": "\u2acb\ufe00", + "varsupsetneq;": "\u228b\ufe00", + "varsupsetneqq;": "\u2acc\ufe00", + "vartheta;": "\u03d1", + "vartriangleleft;": "\u22b2", + "vartriangleright;": "\u22b3", + "vcy;": "\u0432", + "vdash;": "\u22a2", + "vee;": "\u2228", + "veebar;": "\u22bb", + "veeeq;": "\u225a", + "vellip;": "\u22ee", + "verbar;": "|", + "vert;": "|", + "vfr;": "\U0001d533", + "vltri;": "\u22b2", + "vnsub;": "\u2282\u20d2", + "vnsup;": "\u2283\u20d2", + "vopf;": "\U0001d567", + "vprop;": "\u221d", + "vrtri;": "\u22b3", + "vscr;": "\U0001d4cb", + "vsubnE;": "\u2acb\ufe00", + "vsubne;": "\u228a\ufe00", + "vsupnE;": "\u2acc\ufe00", + "vsupne;": "\u228b\ufe00", + "vzigzag;": "\u299a", + "wcirc;": "\u0175", + "wedbar;": "\u2a5f", + "wedge;": "\u2227", + "wedgeq;": "\u2259", + "weierp;": "\u2118", + "wfr;": "\U0001d534", + "wopf;": "\U0001d568", + "wp;": "\u2118", + "wr;": "\u2240", + "wreath;": "\u2240", + "wscr;": "\U0001d4cc", + "xcap;": "\u22c2", + "xcirc;": "\u25ef", + "xcup;": "\u22c3", + "xdtri;": "\u25bd", + "xfr;": "\U0001d535", + "xhArr;": "\u27fa", + "xharr;": "\u27f7", + "xi;": "\u03be", + "xlArr;": "\u27f8", + "xlarr;": "\u27f5", + "xmap;": "\u27fc", + "xnis;": "\u22fb", + "xodot;": "\u2a00", + "xopf;": "\U0001d569", + "xoplus;": "\u2a01", + "xotime;": "\u2a02", + "xrArr;": "\u27f9", + "xrarr;": "\u27f6", + "xscr;": "\U0001d4cd", + "xsqcup;": "\u2a06", + "xuplus;": "\u2a04", + "xutri;": "\u25b3", + "xvee;": "\u22c1", + "xwedge;": "\u22c0", + "yacute": "\xfd", + "yacute;": "\xfd", + "yacy;": "\u044f", + "ycirc;": "\u0177", + "ycy;": "\u044b", + "yen": "\xa5", + "yen;": "\xa5", + "yfr;": "\U0001d536", + "yicy;": "\u0457", + "yopf;": "\U0001d56a", + "yscr;": "\U0001d4ce", + "yucy;": "\u044e", + "yuml": "\xff", + "yuml;": "\xff", + "zacute;": "\u017a", + "zcaron;": "\u017e", + "zcy;": "\u0437", + "zdot;": "\u017c", + "zeetrf;": "\u2128", + "zeta;": "\u03b6", + "zfr;": "\U0001d537", + "zhcy;": "\u0436", + "zigrarr;": "\u21dd", + "zopf;": "\U0001d56b", + "zscr;": "\U0001d4cf", + "zwj;": "\u200d", + "zwnj;": "\u200c", +} + +replacementCharacters = { + 0x0: "\uFFFD", + 0x0d: "\u000D", + 0x80: "\u20AC", + 0x81: "\u0081", + 0x82: "\u201A", + 0x83: "\u0192", + 0x84: "\u201E", + 0x85: "\u2026", + 0x86: "\u2020", + 0x87: "\u2021", + 0x88: "\u02C6", + 0x89: "\u2030", + 0x8A: "\u0160", + 0x8B: "\u2039", + 0x8C: "\u0152", + 0x8D: "\u008D", + 0x8E: "\u017D", + 0x8F: "\u008F", + 0x90: "\u0090", + 0x91: "\u2018", + 0x92: "\u2019", + 0x93: "\u201C", + 0x94: "\u201D", + 0x95: "\u2022", + 0x96: "\u2013", + 0x97: "\u2014", + 0x98: "\u02DC", + 0x99: "\u2122", + 0x9A: "\u0161", + 0x9B: "\u203A", + 0x9C: "\u0153", + 0x9D: "\u009D", + 0x9E: "\u017E", + 0x9F: "\u0178", +} + +tokenTypes = { + "Doctype": 0, + "Characters": 1, + "SpaceCharacters": 2, + "StartTag": 3, + "EndTag": 4, + "EmptyTag": 5, + "Comment": 6, + "ParseError": 7 +} + +tagTokenTypes = frozenset([tokenTypes["StartTag"], tokenTypes["EndTag"], + tokenTypes["EmptyTag"]]) + + +prefixes = dict([(v, k) for k, v in namespaces.items()]) +prefixes["http://www.w3.org/1998/Math/MathML"] = "math" + + +class DataLossWarning(UserWarning): + """Raised when the current tree is unable to represent the input data""" + pass + + +class _ReparseException(Exception): + pass diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43aad201069a84f229fe40899b5d85b076032648 GIT binary patch literal 205 zcmXr!<>h*|;CKuJ5IhDEFu(|8H~?`m3y?@*2xib^^jpbL1QJFNzpC^LiZaU*OH%dA z5{vZH@^eyBi;DG=v-L}I4AYV-%2G^<&ErjzlPa?fjnk^ibCV5#AU#h%M86=jKsPh5 zxFj(rN7p1bwJN2!q8KCy#_?sTc`5lt`WYp;Ii@+8N&0D-IVB*I<Kr{)GE3s)^$IF) TaoFVMr<CTT+JW3u48#log+@AY literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b81fbb02073a48167eaec914c5315ad9daec3953 GIT binary patch literal 1331 zcmZuxOK%%D5GMB_tz`LurUh!C2ObKf0vd0FBnVI#MS`X+(1QvzK@2R?uBj#0T8sNI zNy(NVpPWN4J@?vce@XuXuLTO^C$y)|&~}nTiJjqaNX~rxINS%@+rz(q|MS&vAt8T} z_gVz@6A<$~C_w~Oq^23IgDj}SETlvPB2-ZwXEE4BM5<T!vp(3d=)ERc@*NR<k-R1% zk@4x^D$E9A@SKc?Zy+8Shi;coO{*4G=2hLb+PXwk%gR)3<MtL!RkT9ps<KjZW!_NS zLtQlGMnb>!gBDUt@vJIrfpgffhf|QRLChzhHh_BHOSdC}n^Cw=$^dXg>wkWfcA*=_ z;p;lxcDmwLvbkKbven*gt*)j3(K`%)teTVIkU@KTJ7w66FD2uw;k7g!FC?=wZdn0g zr;^Fa&ZK6?$CI{^$Hxo<GXr6plLK}neJogd7dEtY$2IN-Id5Te!57AlS9ifLs<MPL zH<sB|C(Y-~wCr5Mwq_}{^?}}Iu`R-vb!S&M$yixwV-K#uYoy8%9Ygnr=as{8^Z<rl z{rgJ_WGsP=bjfvEwhGubX)#Z&x?fH&mg1p#oIfh2tNHy0<@&rXzJPYpq%YF0>h4vI zv0SNp4{Ny==E9)UOTLtiXmvWXwR)tgX<AkaF4&}8bu&Jdwko(nD4uk4(5>7c$8ipq zk^njrfFg+=fiBRzZRmdjVm<~XNk#?90ztD7s}!m+5)s^a?0Vn&jO$OI-ez1&!``Lz z7cG^nfoJo!vXCbfOlbtDi=QnyrKeC+SM(YAX>v(7)Yn>X-qSB_cttLQi_dHX-e{kk z##hAlMEq+2YxiCSm*Hi!i8jF|JS1md9ucr$-67e~mr%rKJ4f)I0BwKbBD`vsJhxoi z7yQH}-{6&^6$x%Ryo3;#83%e7K<PbD<G${py$#AGd5#Y#&vhS%J*;3UTnx_IcoKn< z$VgSX*tT=oxEQH0F2Z7V@sg{Bd{-8F3nSkF^%01{bcB9DN3=(G=pOV5UGH8Kd~ln2 z0vP}X#>;az%=5Yx3x)P5&(9WI-OTj!T(kus#qjT?^fl@8;)!t5;GZd>5%p)BjE5Mt zT)<O?s2U4Fhp2Fw#-j0rxUHg9N){IWFUHg1&+lXWUpki@UL*Yq--^LF9|ogf6ee5$ E0diGd*#H0l literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48a77516d0c62a0a602c970fc319a772978b3b64 GIT binary patch literal 855 zcmZuv!EV$r5VhlMHf&ohLYz5qAcr<oZN&wlN=W6_3!EY(D~X-r)=3uI3GHfc+YjlL zFX10@MMB~iI5FdNt1V)rnQ`prdGp3O+S{A`y8H3@1tsJs*|HGUr{MM#1VIGVq^23I zgDj|7#whtfL?GBL5ln__mQ6(XktCDffF=nW=6PXT-8sosy=aXaVxf9vRoe_tyGE6* zkX$P#O|ET;cQzKl;uPGzgdj;q1<3+IMQ}?pCYT5zhhick$P+OI&UlE<l!j6z-bKTV z{vO=UAgt($a8LngdY;fBvTbKdnFK><rLIf_nD4~IkpA@P!l*uXGVODdR;?D&*tEP# zoj$CJ>s}n&H~ge5ZmtfGs^z!3d<}Ndq@U7-TI{RFx?Jo1<616-y|%dNo%ga4tx3PQ zTAyfDq?Pa4rbTY$!Qy6!IaiHxoKLW8FNH4Wqq2j|SqabN4f7+3j;zQfUDHt_2*cre zVF@);Kzns#cmkiE4<MYQ>i_WhvqvLk0Q4i>g~iCXqU&J8IK7ZAckZ4v@T5c7<hA^l zdWZ9SEay90?9U$5J{+GX5q64II3H%5*RAL@u6H^A+U0sYG5E>``!aJ3sA(&pV1skT zzuMw!$24X!^Lt1Eg{#hW1_~P-t3j;>(L>Z0m$Gyox>eFMjDvhT_Vf<l#1Ha0`wKY* B!`c7< literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5bbd231b8aa637b3a686ed4e77a9d7e69d148ab GIT binary patch literal 1902 zcmZt{OK%fLcxLu#<AgLMX`q)CQV%`^7XhtA0U_}cQstr&0a}4Jo1Jm8_P#tbHi@;4 zRGHp$>Iqd``v<BXdf-;6KcI&_wiOb8p{IT`>wrNWYrdWNUh}<uX=$nX=GE^{zdwc0 z-)Lc(aJ~s!d<lReiW8J#AE(48so@(KQ9_NxOfBES=pLdbwO$}<F{^LS4Bw{qL)3QO zf-Gtq)#-3o<jF{~AWn;%%gUwkI2Li9RV$+`j&jO^B$kYaiFk{Z46e-GP_RfTI9UV^ zH(?7807E{e$R`y0hBD;^^3B=^->M(4?7MLSIw#lfXMGk);qB~POPLJ4Xg}nF$?JEz zx4yl7zkBb-&W<O;Jul8=?(MUXdU?;Ic{EB{CL;r0Q%il-z6D!s0+6VW`=mrAo)L^n zI0Xj9;5V7bTbzZG2`}_&BbrTbzOIIR&lCBGN9?L6_u2gH$$Y>vPe>3<KjLN?L@3Vo zYW|ZONO<7Id){u_<TlvF9RQUZ1aTJ2AgJ6E3CM&gSkkNP`hDI2#-9;y!ROx}It7o% zV0333@=h;LDC43N4LUNp*xNlA)63$k;7YW6IJkJJH+h~$U%=YSI@_HhF1F%K$S_H^ zE~jil#eq;ry@N5!XwEzPGEJ@|@ouN5lOj5?PD-E>63i2Fp*Z9&*rK*j1&G{bJULxQ z@WP2dktz_iny{6>5p3}fU@4yB67`{62kw;Yp{a3<5B`vlq`pz28NQ8<@v~p2W@%D# z7EP_vqQ-#m2XHsfqP{tU0*3oH)SlvFoE1QK2ILs?M++RT#t_<=+6R9Dz6p}n4BbZ0 z9z7*b$<&#;(?;ol4GsR|@Mw5cx?1xo(EOXSu9hjC((RFJh_<HW0a9Fa2{?|*hUQ*Y zXQ0``qsOSU^EY&(mK)e$&o*6Anl|RT=%=-w?7Ia!!4u$oU6K}f&0kZ4TD1oH$xGuA zf(CY|OE;CC7{9}<Qj4B>Ni-cS8=lYl5QWvbt`Fj*wL^sA4Wn<<wHa1YCA=zr(z?%n zsQX~ERNTKTav$U2tH(M9bRBYssjXl76L_4`oMDWH=Sx%R9i9h11kH7>>$?SKf$G!B zl!pbY+=nvcay#6s%q&b<Wh$EQ#97Vc-bo92sL86@?p7uZWmq}$s@tA4_oXbh*l-k& zC#@*YB((jO*6hr0lXb}sq%PvG-;IyYMcd%ZP<(tvfi(b?eJ7*vQkyIgRK5C*A{SEI z(<WWM0jS0A`uwiHuI|f^S{Vizw6c}t&l#^Qn3buhj3O^8J1h!lv38TIeyA+yL&^N6 z?yFut%4p>%I*gCX(lbU|=6|*yia_}tXupHGqk(q2p~5JNFk;%Z${L5si0L^|gC%&1 zs~LC(ws-;nVG}p8Nj9(xzZL9~CSD~bJ_k1wx9}=J6R!b&70xy}2ef6ttN;xtz`aRY z*wz@g<_27gEVjRnLAPzI*`_RnfHZ?3&FLsn=T;C5M`1FjI6(j-JP7ne(Y7wwuO=SX zPN-R_hKNu=nd+X>^RwG_l=9w4j-c2AuKs+u8vk4krV71J&;O~d+-tR2H&pWVEL$Tj F<3Dw#<AMMH literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62960ef77f36c5ec67546832a9231d25ae07ad18 GIT binary patch literal 2648 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 WZ&wb!gPltvvQ?`EfnI^(+kXR!kHJ6y literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82731ea1feee832e40e8a8d8a6c3b431f255ede6 GIT binary patch literal 3109 zcmZ`*&u<&Y6`q-0E>|ncl3mBKlC&k#q&1V+v@AJ}6UR~fLrL61C@P}~2)CORXDMyC z++EKs8A+guqV}-|qv$E<q3Edv`UmvTQ!c&altT~<awuA$K(0L$K~MeOa4FM`v&4M+ zcIJC;hHu_`Gph>=!M}e0w>x)QjQx|%JTByQH2pF_GRadm;2k~?9Wih^4rfwGCv^w4 zPK~p-m~>_BK9jY$_JMcL>3GuHVy*g@&}A*hEJoWpPlsh3CW9hZrSWAlN_3KEW@(ru z-CV|Dnv}7MQvD?-9d6w1NXK0=Fnt7sbu@h*5VH=KtRp1vIJA`etm94=(WyyK*75C0 zU(VrOmjM<tZ@i5p#T*AO{v;mcqgXfdqQnxSv{^<wy4h3tpjqz5%`)%DSyPuPjs{&? z4L#%!YP2H#BY?!`AwLv*FO1m-><0T;^UxV%N&Pu>W-P{h?DU+UGS0@}jGaS%cj;Zo zcKmG`muxaF85YMk@sB;74^=mAxyIFT+Uv{}Djp^IP_H}`FPNHL-k+G7$0Gjwi*})s zQB=n5QKZ_vJe9H1?QXwarYpVey^&ngm%@wP?fw4BYVY8~LH9hKoveMkT_nZXB-3S- zrf1g%@qyHPnmTO@M{y=|)!r=!>BThJZuhL~bbIPD^4PgzA8Sq%OzD$XmH>?VykVOQ z^!dTU#OdcIyd!tkK&58gIfAfPkQ?ujBjp{q>rlX**xhAz=#E_}`a;2N(phGD9ZU|{ zU4}!)&ON8WR5ljm?7IQDHE?&q5f#U|C-lSdiuW!y5RUgYja%*)vGKRcNR_vv9plQV zjEtK_gV=aCGl{;IqZY76b3D=E)B_=0he%$W?Sj)<H8n?6f4X@ppiei8_eymPqTRO% zG%PU;De}Yc1iti10OKdE@BHe$#C>tFSov|v?ou$)LtZ5LI-34FVC<;I*dfmq$0T`= z!+V};!ZT0w>su6r<e^*mK85}@>7&n;bJoL-43?3`eX+%|-+(!f-aU*y3Fgmb!!kYe zDa=63(`1n>WD@K}jC=(4GT6VZ7)xY}G_z}99Pf(<Onm_kS^0b{)F+c&w)2xrR-c0Y zCw8{UEGMTnsIT?(rgfxoDLPI4dOjG$8Fpf;h`RCh-AF}UI8<Xij-*<ION@VWP?Y=F z$=izDtd3KsyPeDZ4TNx4B}Hj!y4+6@2;Ds0QTebi4kV--vG5{ec=htUG@?{3p_a+g zQvk>`i+W}v&-Q<Z`oH`C97jD%{of;aj(~D`8aZ|376qSrf<{geJSJ|`w=h74^%{V2 z1c`%$bA3*UcZ~a<mE4B#xL@<_JE-~264KM<4dL>G(^W{#Mz9U)u0tmAP+WZ*&Bj&( z^%wiqnCzF0Eh>1Iuvbm&^($3uUB>s1Y45SWSHPX8ET#QJU!yOITX?fRBIW_l{sR41 z!T)u|PbYl&S|7&;#*V?p{YvjwQ$4w8b;lS-Y$2LH#>kbv2kFn1{_9rX&i8;7f1PS# z#tmqlwOU`H7i)ypKPs)Ok7)gSMr#RLZ(s(lUaGXXI$de4&uH=D%v3A;0y^hmpR4!L z_omgpL2Ey<(5Wn(?>oql6=cXCp>xeL|8T_mWyQK)`DE4F{2j*O%?G^r2$J<D+0J^f zux1&b9a;FevH;ELE<o?osa|#gIyW$@Q2vq5e=41uGyhH$-c*O?YHdvNP@P7EsHX`i zRvxB>5ouz4)JvOA>UkQpc|zG|^Uw&1WRh~j@WN(~sYg<(SZfHXOuER&TBLEpm|#22 zyZyVvyhMsph2Bw#G@eYNG~Y3fOccQg)>7m5k~oz*E{#X&8Y|=Way2kwcLnVN+A7)_ z+C{XNjYqi+me>UowPa|VEP^Sdzk@Pv>bQu|O#$g2ZDUDdm>O?#4j6$mK&V1B@t<x_ zGTP=gr8Vk=MBByj@u-g;DISjc0r}$$0r?1nxQsFN!q?@8RpuG>5^>HFoFixx(8Wlt z5L_TwC7|-4E)vj9PF*5+h2S#5s|2qRTp@U!;3~lz1nUHE5?mvAk$`G}x<PQ0U;}^^ zzeO_r1;}rc{La_q*}7;;A2|yABY#1@MY=zn^dHHS^61)wRehfr-&hst{Cp2h_W(y# zF~Frn;7~<Pq|3>Y@Oe-VxW{p2us=_n;(-@{g*Qfs9k>B1W#CW+4d&6u1Ac;J%fq<k zo!|$j9#cng6WDC|#t%a(<zZ-oFdXD^n3CKG!@I*Mtw!o$DD!R@+AD^763e!=UD02e zxh&8Tq3Fh->HrT-)6K$G`M_WBFWdgjR-LBm4a=dzR7#Knm2*Y4+%QFomiai-#=kOI P<W;)%YEn5V8qWU!fTGQl literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f85d136e9a4373d0391bd97ddc46a985904b67d GIT binary patch literal 19167 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71bf5f8b74a073d0dd9ae81b2484b26e0463e3be GIT binary patch literal 1363 zcmZ8h&2Aev5GJ`l+FeVQVK`3R7KMN!2cb^3K@uc~AV}(}xfwxaw86H)Vzs2~mAF44 zSBfmiC+E}$$f2hmdg)8_+IQf!Kmor(PMulBu@MSGX}*~uzxko=bvnU+fBf_7-!>ut zl4}ce@)SfDuyMkvBsq;}&LWmukwp<>(vECyaa%gM8@Yfv+?B1|i@e;Ae9&8yK=|i0 z@`XLw;GXbz325!-g!?>rOL!pMN$1>(I(&n--;!vPvmxnsF5phmw@fz~=~B*W5odW- zs@ixwn`b&J3$ryVvb5wPmRT)SBK6?~#UN_zQKH2KLxq`5mGY!c22$jrsI}?pDoMq` zNurVz;<O=4=a*ah)i)_#dAU9&zYmBY5#=OeoJN+gIpfwb6OM4t=}k<g#cl2Yb&tD1 zy=B}VG6^RypB<D^CY2Vt_vQpRHW&BAA{ABL%Zgs5#D1?9i#kyv+3zI<@99)!U=){R zE$}hkrB90a;X-yONLl|08>eS<@q0}sbi!7^>3j0(w==e4ob8b_Yh`h3%G7r&sviMn z?~xUmSW_1f?mQ%Cv^WAE7kpl>C<=ETA^K!R+e9tE)&koCV!b`kxsSgdlj5t!{toN` z*x%Lm+T)zA?JM>Zq2%@U&oC-bnT<n*2^hORtstu*<Xs;n$Hp#_Tqp-k?x5fZb%&oc z$;KYOr#%x~b*}Fy7lPCVMtX6KV-UyYMpNe(N@$_x;;QfIhi=4;UH5HcYaz#x2Q_Y7 zjZ>FXQK(Hg?=PahfUozfuu|DPsYN(XR5&grhmi@>X;{m<<I!Ty@9T&0gLHH{y?bxG ze3Pf&!a6R(qp-@V+gYLOM9SOubFt)lp%H8(o{NH)Dm<xk`9Nl)aNLZH4zC8~PIanw zfx;Gu{v0+!ZMsc8_-xaFwLx}Sz&7a?TXxqIcjvMOhkYLlf^~(01aX{~d?xXCJC0w^ z68XW>iep};0Q+NAE=8e5ZETt8T6u7vx``WdXlik7`w}rMdmBV!6FeZd!y4@4lwz|j zkOOo=Pn=IqVLtJRvqQB57`)K-@Wr!(!7%=D@O<#nSb8?XH;hC7>6M>Bz%4ut-!`EN z^?nx<9M9^Rf&>*>6yB=vff%NQ3Q$9m#!pM^2>cDK6Z8?ZCuLTcR$As&CWZPMy)n1u h^lJ=o9u#J7yvOT$KEVt%j>``7pd(w*lTB-T?|*d?UsM19 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py new file mode 100644 index 0000000..5ba926e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py @@ -0,0 +1,29 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + +from collections import OrderedDict + + +def _attr_key(attr): + """Return an appropriate key for an attribute for sorting + + Attributes have a namespace that can be either ``None`` or a string. We + can't compare the two because they're different types, so we convert + ``None`` to an empty string first. + + """ + return (attr[0][0] or ''), attr[0][1] + + +class Filter(base.Filter): + """Alphabetizes attributes for elements""" + def __iter__(self): + for token in base.Filter.__iter__(self): + if token["type"] in ("StartTag", "EmptyTag"): + attrs = OrderedDict() + for name, value in sorted(token["data"].items(), + key=_attr_key): + attrs[name] = value + token["data"] = attrs + yield token diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/base.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/base.py new file mode 100644 index 0000000..c7dbaed --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/base.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import, division, unicode_literals + + +class Filter(object): + def __init__(self, source): + self.source = source + + def __iter__(self): + return iter(self.source) + + def __getattr__(self, name): + return getattr(self.source, name) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py new file mode 100644 index 0000000..aefb5c8 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py @@ -0,0 +1,73 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + + +class Filter(base.Filter): + """Injects ``<meta charset=ENCODING>`` tag into head of document""" + def __init__(self, source, encoding): + """Creates a Filter + + :arg source: the source token stream + + :arg encoding: the encoding to set + + """ + base.Filter.__init__(self, source) + self.encoding = encoding + + def __iter__(self): + state = "pre_head" + meta_found = (self.encoding is None) + pending = [] + + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag": + if token["name"].lower() == "head": + state = "in_head" + + elif type == "EmptyTag": + if token["name"].lower() == "meta": + # replace charset with actual encoding + has_http_equiv_content_type = False + for (namespace, name), value in token["data"].items(): + if namespace is not None: + continue + elif name.lower() == 'charset': + token["data"][(namespace, name)] = self.encoding + meta_found = True + break + elif name == 'http-equiv' and value.lower() == 'content-type': + has_http_equiv_content_type = True + else: + if has_http_equiv_content_type and (None, "content") in token["data"]: + token["data"][(None, "content")] = 'text/html; charset=%s' % self.encoding + meta_found = True + + elif token["name"].lower() == "head" and not meta_found: + # insert meta into empty head + yield {"type": "StartTag", "name": "head", + "data": token["data"]} + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + yield {"type": "EndTag", "name": "head"} + meta_found = True + continue + + elif type == "EndTag": + if token["name"].lower() == "head" and pending: + # insert meta into head (if necessary) and flush pending queue + yield pending.pop(0) + if not meta_found: + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + while pending: + yield pending.pop(0) + meta_found = True + state = "post_head" + + if state == "in_head": + pending.append(token) + else: + yield token diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/lint.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/lint.py new file mode 100644 index 0000000..fcc07ee --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/lint.py @@ -0,0 +1,93 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import text_type + +from . import base +from ..constants import namespaces, voidElements + +from ..constants import spaceCharacters +spaceCharacters = "".join(spaceCharacters) + + +class Filter(base.Filter): + """Lints the token stream for errors + + If it finds any errors, it'll raise an ``AssertionError``. + + """ + def __init__(self, source, require_matching_tags=True): + """Creates a Filter + + :arg source: the source token stream + + :arg require_matching_tags: whether or not to require matching tags + + """ + super(Filter, self).__init__(source) + self.require_matching_tags = require_matching_tags + + def __iter__(self): + open_elements = [] + for token in base.Filter.__iter__(self): + type = token["type"] + if type in ("StartTag", "EmptyTag"): + namespace = token["namespace"] + name = token["name"] + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + assert isinstance(token["data"], dict) + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + assert type == "EmptyTag" + else: + assert type == "StartTag" + if type == "StartTag" and self.require_matching_tags: + open_elements.append((namespace, name)) + for (namespace, name), value in token["data"].items(): + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + assert isinstance(value, text_type) + + elif type == "EndTag": + namespace = token["namespace"] + name = token["name"] + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + assert False, "Void element reported as EndTag token: %(tag)s" % {"tag": name} + elif self.require_matching_tags: + start = open_elements.pop() + assert start == (namespace, name) + + elif type == "Comment": + data = token["data"] + assert isinstance(data, text_type) + + elif type in ("Characters", "SpaceCharacters"): + data = token["data"] + assert isinstance(data, text_type) + assert data != "" + if type == "SpaceCharacters": + assert data.strip(spaceCharacters) == "" + + elif type == "Doctype": + name = token["name"] + assert name is None or isinstance(name, text_type) + assert token["publicId"] is None or isinstance(name, text_type) + assert token["systemId"] is None or isinstance(name, text_type) + + elif type == "Entity": + assert isinstance(token["name"], text_type) + + elif type == "SerializerError": + assert isinstance(token["data"], text_type) + + else: + assert False, "Unknown token type: %(type)s" % {"type": type} + + yield token diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/optionaltags.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/optionaltags.py new file mode 100644 index 0000000..4a86501 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/optionaltags.py @@ -0,0 +1,207 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + + +class Filter(base.Filter): + """Removes optional tags from the token stream""" + def slider(self): + previous1 = previous2 = None + for token in self.source: + if previous1 is not None: + yield previous2, previous1, token + previous2 = previous1 + previous1 = token + if previous1 is not None: + yield previous2, previous1, None + + def __iter__(self): + for previous, token, next in self.slider(): + type = token["type"] + if type == "StartTag": + if (token["data"] or + not self.is_optional_start(token["name"], previous, next)): + yield token + elif type == "EndTag": + if not self.is_optional_end(token["name"], next): + yield token + else: + yield token + + def is_optional_start(self, tagname, previous, next): + type = next and next["type"] or None + if tagname in 'html': + # An html element's start tag may be omitted if the first thing + # inside the html element is not a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname == 'head': + # A head element's start tag may be omitted if the first thing + # inside the head element is an element. + # XXX: we also omit the start tag if the head element is empty + if type in ("StartTag", "EmptyTag"): + return True + elif type == "EndTag": + return next["name"] == "head" + elif tagname == 'body': + # A body element's start tag may be omitted if the first thing + # inside the body element is not a space character or a comment, + # except if the first thing inside the body element is a script + # or style element and the node immediately preceding the body + # element is a head element whose end tag has been omitted. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we do not look at the preceding event, so we never omit + # the body element's start tag if it's followed by a script or + # a style element. + return next["name"] not in ('script', 'style') + else: + return True + elif tagname == 'colgroup': + # A colgroup element's start tag may be omitted if the first thing + # inside the colgroup element is a col element, and if the element + # is not immediately preceded by another colgroup element whose + # end tag has been omitted. + if type in ("StartTag", "EmptyTag"): + # XXX: we do not look at the preceding event, so instead we never + # omit the colgroup element's end tag when it is immediately + # followed by another colgroup element. See is_optional_end. + return next["name"] == "col" + else: + return False + elif tagname == 'tbody': + # A tbody element's start tag may be omitted if the first thing + # inside the tbody element is a tr element, and if the element is + # not immediately preceded by a tbody, thead, or tfoot element + # whose end tag has been omitted. + if type == "StartTag": + # omit the thead and tfoot elements' end tag when they are + # immediately followed by a tbody element. See is_optional_end. + if previous and previous['type'] == 'EndTag' and \ + previous['name'] in ('tbody', 'thead', 'tfoot'): + return False + return next["name"] == 'tr' + else: + return False + return False + + def is_optional_end(self, tagname, next): + type = next and next["type"] or None + if tagname in ('html', 'head', 'body'): + # An html element's end tag may be omitted if the html element + # is not immediately followed by a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname in ('li', 'optgroup', 'tr'): + # A li element's end tag may be omitted if the li element is + # immediately followed by another li element or if there is + # no more content in the parent element. + # An optgroup element's end tag may be omitted if the optgroup + # element is immediately followed by another optgroup element, + # or if there is no more content in the parent element. + # A tr element's end tag may be omitted if the tr element is + # immediately followed by another tr element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] == tagname + else: + return type == "EndTag" or type is None + elif tagname in ('dt', 'dd'): + # A dt element's end tag may be omitted if the dt element is + # immediately followed by another dt element or a dd element. + # A dd element's end tag may be omitted if the dd element is + # immediately followed by another dd element or a dt element, + # or if there is no more content in the parent element. + if type == "StartTag": + return next["name"] in ('dt', 'dd') + elif tagname == 'dd': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'p': + # A p element's end tag may be omitted if the p element is + # immediately followed by an address, article, aside, + # blockquote, datagrid, dialog, dir, div, dl, fieldset, + # footer, form, h1, h2, h3, h4, h5, h6, header, hr, menu, + # nav, ol, p, pre, section, table, or ul, element, or if + # there is no more content in the parent element. + if type in ("StartTag", "EmptyTag"): + return next["name"] in ('address', 'article', 'aside', + 'blockquote', 'datagrid', 'dialog', + 'dir', 'div', 'dl', 'fieldset', 'footer', + 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', + 'header', 'hr', 'menu', 'nav', 'ol', + 'p', 'pre', 'section', 'table', 'ul') + else: + return type == "EndTag" or type is None + elif tagname == 'option': + # An option element's end tag may be omitted if the option + # element is immediately followed by another option element, + # or if it is immediately followed by an <code>optgroup</code> + # element, or if there is no more content in the parent + # element. + if type == "StartTag": + return next["name"] in ('option', 'optgroup') + else: + return type == "EndTag" or type is None + elif tagname in ('rt', 'rp'): + # An rt element's end tag may be omitted if the rt element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + # An rp element's end tag may be omitted if the rp element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('rt', 'rp') + else: + return type == "EndTag" or type is None + elif tagname == 'colgroup': + # A colgroup element's end tag may be omitted if the colgroup + # element is not immediately followed by a space character or + # a comment. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we also look for an immediately following colgroup + # element. See is_optional_start. + return next["name"] != 'colgroup' + else: + return True + elif tagname in ('thead', 'tbody'): + # A thead element's end tag may be omitted if the thead element + # is immediately followed by a tbody or tfoot element. + # A tbody element's end tag may be omitted if the tbody element + # is immediately followed by a tbody or tfoot element, or if + # there is no more content in the parent element. + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] in ['tbody', 'tfoot'] + elif tagname == 'tbody': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'tfoot': + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] == 'tbody' + else: + return type == "EndTag" or type is None + elif tagname in ('td', 'th'): + # A td element's end tag may be omitted if the td element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + # A th element's end tag may be omitted if the th element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('td', 'th') + else: + return type == "EndTag" or type is None + return False diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/sanitizer.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/sanitizer.py new file mode 100644 index 0000000..af8e77b --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/sanitizer.py @@ -0,0 +1,896 @@ +from __future__ import absolute_import, division, unicode_literals + +import re +from xml.sax.saxutils import escape, unescape + +from pip._vendor.six.moves import urllib_parse as urlparse + +from . import base +from ..constants import namespaces, prefixes + +__all__ = ["Filter"] + + +allowed_elements = frozenset(( + (namespaces['html'], 'a'), + (namespaces['html'], 'abbr'), + (namespaces['html'], 'acronym'), + (namespaces['html'], 'address'), + (namespaces['html'], 'area'), + (namespaces['html'], 'article'), + (namespaces['html'], 'aside'), + (namespaces['html'], 'audio'), + (namespaces['html'], 'b'), + (namespaces['html'], 'big'), + (namespaces['html'], 'blockquote'), + (namespaces['html'], 'br'), + (namespaces['html'], 'button'), + (namespaces['html'], 'canvas'), + (namespaces['html'], 'caption'), + (namespaces['html'], 'center'), + (namespaces['html'], 'cite'), + (namespaces['html'], 'code'), + (namespaces['html'], 'col'), + (namespaces['html'], 'colgroup'), + (namespaces['html'], 'command'), + (namespaces['html'], 'datagrid'), + (namespaces['html'], 'datalist'), + (namespaces['html'], 'dd'), + (namespaces['html'], 'del'), + (namespaces['html'], 'details'), + (namespaces['html'], 'dfn'), + (namespaces['html'], 'dialog'), + (namespaces['html'], 'dir'), + (namespaces['html'], 'div'), + (namespaces['html'], 'dl'), + (namespaces['html'], 'dt'), + (namespaces['html'], 'em'), + (namespaces['html'], 'event-source'), + (namespaces['html'], 'fieldset'), + (namespaces['html'], 'figcaption'), + (namespaces['html'], 'figure'), + (namespaces['html'], 'footer'), + (namespaces['html'], 'font'), + (namespaces['html'], 'form'), + (namespaces['html'], 'header'), + (namespaces['html'], 'h1'), + (namespaces['html'], 'h2'), + (namespaces['html'], 'h3'), + (namespaces['html'], 'h4'), + (namespaces['html'], 'h5'), + (namespaces['html'], 'h6'), + (namespaces['html'], 'hr'), + (namespaces['html'], 'i'), + (namespaces['html'], 'img'), + (namespaces['html'], 'input'), + (namespaces['html'], 'ins'), + (namespaces['html'], 'keygen'), + (namespaces['html'], 'kbd'), + (namespaces['html'], 'label'), + (namespaces['html'], 'legend'), + (namespaces['html'], 'li'), + (namespaces['html'], 'm'), + (namespaces['html'], 'map'), + (namespaces['html'], 'menu'), + (namespaces['html'], 'meter'), + (namespaces['html'], 'multicol'), + (namespaces['html'], 'nav'), + (namespaces['html'], 'nextid'), + (namespaces['html'], 'ol'), + (namespaces['html'], 'output'), + (namespaces['html'], 'optgroup'), + (namespaces['html'], 'option'), + (namespaces['html'], 'p'), + (namespaces['html'], 'pre'), + (namespaces['html'], 'progress'), + (namespaces['html'], 'q'), + (namespaces['html'], 's'), + (namespaces['html'], 'samp'), + (namespaces['html'], 'section'), + (namespaces['html'], 'select'), + (namespaces['html'], 'small'), + (namespaces['html'], 'sound'), + (namespaces['html'], 'source'), + (namespaces['html'], 'spacer'), + (namespaces['html'], 'span'), + (namespaces['html'], 'strike'), + (namespaces['html'], 'strong'), + (namespaces['html'], 'sub'), + (namespaces['html'], 'sup'), + (namespaces['html'], 'table'), + (namespaces['html'], 'tbody'), + (namespaces['html'], 'td'), + (namespaces['html'], 'textarea'), + (namespaces['html'], 'time'), + (namespaces['html'], 'tfoot'), + (namespaces['html'], 'th'), + (namespaces['html'], 'thead'), + (namespaces['html'], 'tr'), + (namespaces['html'], 'tt'), + (namespaces['html'], 'u'), + (namespaces['html'], 'ul'), + (namespaces['html'], 'var'), + (namespaces['html'], 'video'), + (namespaces['mathml'], 'maction'), + (namespaces['mathml'], 'math'), + (namespaces['mathml'], 'merror'), + (namespaces['mathml'], 'mfrac'), + (namespaces['mathml'], 'mi'), + (namespaces['mathml'], 'mmultiscripts'), + (namespaces['mathml'], 'mn'), + (namespaces['mathml'], 'mo'), + (namespaces['mathml'], 'mover'), + (namespaces['mathml'], 'mpadded'), + (namespaces['mathml'], 'mphantom'), + (namespaces['mathml'], 'mprescripts'), + (namespaces['mathml'], 'mroot'), + (namespaces['mathml'], 'mrow'), + (namespaces['mathml'], 'mspace'), + (namespaces['mathml'], 'msqrt'), + (namespaces['mathml'], 'mstyle'), + (namespaces['mathml'], 'msub'), + (namespaces['mathml'], 'msubsup'), + (namespaces['mathml'], 'msup'), + (namespaces['mathml'], 'mtable'), + (namespaces['mathml'], 'mtd'), + (namespaces['mathml'], 'mtext'), + (namespaces['mathml'], 'mtr'), + (namespaces['mathml'], 'munder'), + (namespaces['mathml'], 'munderover'), + (namespaces['mathml'], 'none'), + (namespaces['svg'], 'a'), + (namespaces['svg'], 'animate'), + (namespaces['svg'], 'animateColor'), + (namespaces['svg'], 'animateMotion'), + (namespaces['svg'], 'animateTransform'), + (namespaces['svg'], 'clipPath'), + (namespaces['svg'], 'circle'), + (namespaces['svg'], 'defs'), + (namespaces['svg'], 'desc'), + (namespaces['svg'], 'ellipse'), + (namespaces['svg'], 'font-face'), + (namespaces['svg'], 'font-face-name'), + (namespaces['svg'], 'font-face-src'), + (namespaces['svg'], 'g'), + (namespaces['svg'], 'glyph'), + (namespaces['svg'], 'hkern'), + (namespaces['svg'], 'linearGradient'), + (namespaces['svg'], 'line'), + (namespaces['svg'], 'marker'), + (namespaces['svg'], 'metadata'), + (namespaces['svg'], 'missing-glyph'), + (namespaces['svg'], 'mpath'), + (namespaces['svg'], 'path'), + (namespaces['svg'], 'polygon'), + (namespaces['svg'], 'polyline'), + (namespaces['svg'], 'radialGradient'), + (namespaces['svg'], 'rect'), + (namespaces['svg'], 'set'), + (namespaces['svg'], 'stop'), + (namespaces['svg'], 'svg'), + (namespaces['svg'], 'switch'), + (namespaces['svg'], 'text'), + (namespaces['svg'], 'title'), + (namespaces['svg'], 'tspan'), + (namespaces['svg'], 'use'), +)) + +allowed_attributes = frozenset(( + # HTML attributes + (None, 'abbr'), + (None, 'accept'), + (None, 'accept-charset'), + (None, 'accesskey'), + (None, 'action'), + (None, 'align'), + (None, 'alt'), + (None, 'autocomplete'), + (None, 'autofocus'), + (None, 'axis'), + (None, 'background'), + (None, 'balance'), + (None, 'bgcolor'), + (None, 'bgproperties'), + (None, 'border'), + (None, 'bordercolor'), + (None, 'bordercolordark'), + (None, 'bordercolorlight'), + (None, 'bottompadding'), + (None, 'cellpadding'), + (None, 'cellspacing'), + (None, 'ch'), + (None, 'challenge'), + (None, 'char'), + (None, 'charoff'), + (None, 'choff'), + (None, 'charset'), + (None, 'checked'), + (None, 'cite'), + (None, 'class'), + (None, 'clear'), + (None, 'color'), + (None, 'cols'), + (None, 'colspan'), + (None, 'compact'), + (None, 'contenteditable'), + (None, 'controls'), + (None, 'coords'), + (None, 'data'), + (None, 'datafld'), + (None, 'datapagesize'), + (None, 'datasrc'), + (None, 'datetime'), + (None, 'default'), + (None, 'delay'), + (None, 'dir'), + (None, 'disabled'), + (None, 'draggable'), + (None, 'dynsrc'), + (None, 'enctype'), + (None, 'end'), + (None, 'face'), + (None, 'for'), + (None, 'form'), + (None, 'frame'), + (None, 'galleryimg'), + (None, 'gutter'), + (None, 'headers'), + (None, 'height'), + (None, 'hidefocus'), + (None, 'hidden'), + (None, 'high'), + (None, 'href'), + (None, 'hreflang'), + (None, 'hspace'), + (None, 'icon'), + (None, 'id'), + (None, 'inputmode'), + (None, 'ismap'), + (None, 'keytype'), + (None, 'label'), + (None, 'leftspacing'), + (None, 'lang'), + (None, 'list'), + (None, 'longdesc'), + (None, 'loop'), + (None, 'loopcount'), + (None, 'loopend'), + (None, 'loopstart'), + (None, 'low'), + (None, 'lowsrc'), + (None, 'max'), + (None, 'maxlength'), + (None, 'media'), + (None, 'method'), + (None, 'min'), + (None, 'multiple'), + (None, 'name'), + (None, 'nohref'), + (None, 'noshade'), + (None, 'nowrap'), + (None, 'open'), + (None, 'optimum'), + (None, 'pattern'), + (None, 'ping'), + (None, 'point-size'), + (None, 'poster'), + (None, 'pqg'), + (None, 'preload'), + (None, 'prompt'), + (None, 'radiogroup'), + (None, 'readonly'), + (None, 'rel'), + (None, 'repeat-max'), + (None, 'repeat-min'), + (None, 'replace'), + (None, 'required'), + (None, 'rev'), + (None, 'rightspacing'), + (None, 'rows'), + (None, 'rowspan'), + (None, 'rules'), + (None, 'scope'), + (None, 'selected'), + (None, 'shape'), + (None, 'size'), + (None, 'span'), + (None, 'src'), + (None, 'start'), + (None, 'step'), + (None, 'style'), + (None, 'summary'), + (None, 'suppress'), + (None, 'tabindex'), + (None, 'target'), + (None, 'template'), + (None, 'title'), + (None, 'toppadding'), + (None, 'type'), + (None, 'unselectable'), + (None, 'usemap'), + (None, 'urn'), + (None, 'valign'), + (None, 'value'), + (None, 'variable'), + (None, 'volume'), + (None, 'vspace'), + (None, 'vrml'), + (None, 'width'), + (None, 'wrap'), + (namespaces['xml'], 'lang'), + # MathML attributes + (None, 'actiontype'), + (None, 'align'), + (None, 'columnalign'), + (None, 'columnalign'), + (None, 'columnalign'), + (None, 'columnlines'), + (None, 'columnspacing'), + (None, 'columnspan'), + (None, 'depth'), + (None, 'display'), + (None, 'displaystyle'), + (None, 'equalcolumns'), + (None, 'equalrows'), + (None, 'fence'), + (None, 'fontstyle'), + (None, 'fontweight'), + (None, 'frame'), + (None, 'height'), + (None, 'linethickness'), + (None, 'lspace'), + (None, 'mathbackground'), + (None, 'mathcolor'), + (None, 'mathvariant'), + (None, 'mathvariant'), + (None, 'maxsize'), + (None, 'minsize'), + (None, 'other'), + (None, 'rowalign'), + (None, 'rowalign'), + (None, 'rowalign'), + (None, 'rowlines'), + (None, 'rowspacing'), + (None, 'rowspan'), + (None, 'rspace'), + (None, 'scriptlevel'), + (None, 'selection'), + (None, 'separator'), + (None, 'stretchy'), + (None, 'width'), + (None, 'width'), + (namespaces['xlink'], 'href'), + (namespaces['xlink'], 'show'), + (namespaces['xlink'], 'type'), + # SVG attributes + (None, 'accent-height'), + (None, 'accumulate'), + (None, 'additive'), + (None, 'alphabetic'), + (None, 'arabic-form'), + (None, 'ascent'), + (None, 'attributeName'), + (None, 'attributeType'), + (None, 'baseProfile'), + (None, 'bbox'), + (None, 'begin'), + (None, 'by'), + (None, 'calcMode'), + (None, 'cap-height'), + (None, 'class'), + (None, 'clip-path'), + (None, 'color'), + (None, 'color-rendering'), + (None, 'content'), + (None, 'cx'), + (None, 'cy'), + (None, 'd'), + (None, 'dx'), + (None, 'dy'), + (None, 'descent'), + (None, 'display'), + (None, 'dur'), + (None, 'end'), + (None, 'fill'), + (None, 'fill-opacity'), + (None, 'fill-rule'), + (None, 'font-family'), + (None, 'font-size'), + (None, 'font-stretch'), + (None, 'font-style'), + (None, 'font-variant'), + (None, 'font-weight'), + (None, 'from'), + (None, 'fx'), + (None, 'fy'), + (None, 'g1'), + (None, 'g2'), + (None, 'glyph-name'), + (None, 'gradientUnits'), + (None, 'hanging'), + (None, 'height'), + (None, 'horiz-adv-x'), + (None, 'horiz-origin-x'), + (None, 'id'), + (None, 'ideographic'), + (None, 'k'), + (None, 'keyPoints'), + (None, 'keySplines'), + (None, 'keyTimes'), + (None, 'lang'), + (None, 'marker-end'), + (None, 'marker-mid'), + (None, 'marker-start'), + (None, 'markerHeight'), + (None, 'markerUnits'), + (None, 'markerWidth'), + (None, 'mathematical'), + (None, 'max'), + (None, 'min'), + (None, 'name'), + (None, 'offset'), + (None, 'opacity'), + (None, 'orient'), + (None, 'origin'), + (None, 'overline-position'), + (None, 'overline-thickness'), + (None, 'panose-1'), + (None, 'path'), + (None, 'pathLength'), + (None, 'points'), + (None, 'preserveAspectRatio'), + (None, 'r'), + (None, 'refX'), + (None, 'refY'), + (None, 'repeatCount'), + (None, 'repeatDur'), + (None, 'requiredExtensions'), + (None, 'requiredFeatures'), + (None, 'restart'), + (None, 'rotate'), + (None, 'rx'), + (None, 'ry'), + (None, 'slope'), + (None, 'stemh'), + (None, 'stemv'), + (None, 'stop-color'), + (None, 'stop-opacity'), + (None, 'strikethrough-position'), + (None, 'strikethrough-thickness'), + (None, 'stroke'), + (None, 'stroke-dasharray'), + (None, 'stroke-dashoffset'), + (None, 'stroke-linecap'), + (None, 'stroke-linejoin'), + (None, 'stroke-miterlimit'), + (None, 'stroke-opacity'), + (None, 'stroke-width'), + (None, 'systemLanguage'), + (None, 'target'), + (None, 'text-anchor'), + (None, 'to'), + (None, 'transform'), + (None, 'type'), + (None, 'u1'), + (None, 'u2'), + (None, 'underline-position'), + (None, 'underline-thickness'), + (None, 'unicode'), + (None, 'unicode-range'), + (None, 'units-per-em'), + (None, 'values'), + (None, 'version'), + (None, 'viewBox'), + (None, 'visibility'), + (None, 'width'), + (None, 'widths'), + (None, 'x'), + (None, 'x-height'), + (None, 'x1'), + (None, 'x2'), + (namespaces['xlink'], 'actuate'), + (namespaces['xlink'], 'arcrole'), + (namespaces['xlink'], 'href'), + (namespaces['xlink'], 'role'), + (namespaces['xlink'], 'show'), + (namespaces['xlink'], 'title'), + (namespaces['xlink'], 'type'), + (namespaces['xml'], 'base'), + (namespaces['xml'], 'lang'), + (namespaces['xml'], 'space'), + (None, 'y'), + (None, 'y1'), + (None, 'y2'), + (None, 'zoomAndPan'), +)) + +attr_val_is_uri = frozenset(( + (None, 'href'), + (None, 'src'), + (None, 'cite'), + (None, 'action'), + (None, 'longdesc'), + (None, 'poster'), + (None, 'background'), + (None, 'datasrc'), + (None, 'dynsrc'), + (None, 'lowsrc'), + (None, 'ping'), + (namespaces['xlink'], 'href'), + (namespaces['xml'], 'base'), +)) + +svg_attr_val_allows_ref = frozenset(( + (None, 'clip-path'), + (None, 'color-profile'), + (None, 'cursor'), + (None, 'fill'), + (None, 'filter'), + (None, 'marker'), + (None, 'marker-start'), + (None, 'marker-mid'), + (None, 'marker-end'), + (None, 'mask'), + (None, 'stroke'), +)) + +svg_allow_local_href = frozenset(( + (None, 'altGlyph'), + (None, 'animate'), + (None, 'animateColor'), + (None, 'animateMotion'), + (None, 'animateTransform'), + (None, 'cursor'), + (None, 'feImage'), + (None, 'filter'), + (None, 'linearGradient'), + (None, 'pattern'), + (None, 'radialGradient'), + (None, 'textpath'), + (None, 'tref'), + (None, 'set'), + (None, 'use') +)) + +allowed_css_properties = frozenset(( + 'azimuth', + 'background-color', + 'border-bottom-color', + 'border-collapse', + 'border-color', + 'border-left-color', + 'border-right-color', + 'border-top-color', + 'clear', + 'color', + 'cursor', + 'direction', + 'display', + 'elevation', + 'float', + 'font', + 'font-family', + 'font-size', + 'font-style', + 'font-variant', + 'font-weight', + 'height', + 'letter-spacing', + 'line-height', + 'overflow', + 'pause', + 'pause-after', + 'pause-before', + 'pitch', + 'pitch-range', + 'richness', + 'speak', + 'speak-header', + 'speak-numeral', + 'speak-punctuation', + 'speech-rate', + 'stress', + 'text-align', + 'text-decoration', + 'text-indent', + 'unicode-bidi', + 'vertical-align', + 'voice-family', + 'volume', + 'white-space', + 'width', +)) + +allowed_css_keywords = frozenset(( + 'auto', + 'aqua', + 'black', + 'block', + 'blue', + 'bold', + 'both', + 'bottom', + 'brown', + 'center', + 'collapse', + 'dashed', + 'dotted', + 'fuchsia', + 'gray', + 'green', + '!important', + 'italic', + 'left', + 'lime', + 'maroon', + 'medium', + 'none', + 'navy', + 'normal', + 'nowrap', + 'olive', + 'pointer', + 'purple', + 'red', + 'right', + 'solid', + 'silver', + 'teal', + 'top', + 'transparent', + 'underline', + 'white', + 'yellow', +)) + +allowed_svg_properties = frozenset(( + 'fill', + 'fill-opacity', + 'fill-rule', + 'stroke', + 'stroke-width', + 'stroke-linecap', + 'stroke-linejoin', + 'stroke-opacity', +)) + +allowed_protocols = frozenset(( + 'ed2k', + 'ftp', + 'http', + 'https', + 'irc', + 'mailto', + 'news', + 'gopher', + 'nntp', + 'telnet', + 'webcal', + 'xmpp', + 'callto', + 'feed', + 'urn', + 'aim', + 'rsync', + 'tag', + 'ssh', + 'sftp', + 'rtsp', + 'afs', + 'data', +)) + +allowed_content_types = frozenset(( + 'image/png', + 'image/jpeg', + 'image/gif', + 'image/webp', + 'image/bmp', + 'text/plain', +)) + + +data_content_type = re.compile(r''' + ^ + # Match a content type <application>/<type> + (?P<content_type>[-a-zA-Z0-9.]+/[-a-zA-Z0-9.]+) + # Match any character set and encoding + (?:(?:;charset=(?:[-a-zA-Z0-9]+)(?:;(?:base64))?) + |(?:;(?:base64))?(?:;charset=(?:[-a-zA-Z0-9]+))?) + # Assume the rest is data + ,.* + $ + ''', + re.VERBOSE) + + +class Filter(base.Filter): + """Sanitizes token stream of XHTML+MathML+SVG and of inline style attributes""" + def __init__(self, + source, + allowed_elements=allowed_elements, + allowed_attributes=allowed_attributes, + allowed_css_properties=allowed_css_properties, + allowed_css_keywords=allowed_css_keywords, + allowed_svg_properties=allowed_svg_properties, + allowed_protocols=allowed_protocols, + allowed_content_types=allowed_content_types, + attr_val_is_uri=attr_val_is_uri, + svg_attr_val_allows_ref=svg_attr_val_allows_ref, + svg_allow_local_href=svg_allow_local_href): + """Creates a Filter + + :arg allowed_elements: set of elements to allow--everything else will + be escaped + + :arg allowed_attributes: set of attributes to allow in + elements--everything else will be stripped + + :arg allowed_css_properties: set of CSS properties to allow--everything + else will be stripped + + :arg allowed_css_keywords: set of CSS keywords to allow--everything + else will be stripped + + :arg allowed_svg_properties: set of SVG properties to allow--everything + else will be removed + + :arg allowed_protocols: set of allowed protocols for URIs + + :arg allowed_content_types: set of allowed content types for ``data`` URIs. + + :arg attr_val_is_uri: set of attributes that have URI values--values + that have a scheme not listed in ``allowed_protocols`` are removed + + :arg svg_attr_val_allows_ref: set of SVG attributes that can have + references + + :arg svg_allow_local_href: set of SVG elements that can have local + hrefs--these are removed + + """ + super(Filter, self).__init__(source) + self.allowed_elements = allowed_elements + self.allowed_attributes = allowed_attributes + self.allowed_css_properties = allowed_css_properties + self.allowed_css_keywords = allowed_css_keywords + self.allowed_svg_properties = allowed_svg_properties + self.allowed_protocols = allowed_protocols + self.allowed_content_types = allowed_content_types + self.attr_val_is_uri = attr_val_is_uri + self.svg_attr_val_allows_ref = svg_attr_val_allows_ref + self.svg_allow_local_href = svg_allow_local_href + + def __iter__(self): + for token in base.Filter.__iter__(self): + token = self.sanitize_token(token) + if token: + yield token + + # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and + # stripping out all attributes not in ALLOWED_ATTRIBUTES. Style attributes + # are parsed, and a restricted set, specified by ALLOWED_CSS_PROPERTIES and + # ALLOWED_CSS_KEYWORDS, are allowed through. attributes in ATTR_VAL_IS_URI + # are scanned, and only URI schemes specified in ALLOWED_PROTOCOLS are + # allowed. + # + # sanitize_html('<script> do_nasty_stuff() </script>') + # => <script> do_nasty_stuff() </script> + # sanitize_html('<a href="javascript: sucker();">Click here for $100</a>') + # => <a>Click here for $100</a> + def sanitize_token(self, token): + + # accommodate filters which use token_type differently + token_type = token["type"] + if token_type in ("StartTag", "EndTag", "EmptyTag"): + name = token["name"] + namespace = token["namespace"] + if ((namespace, name) in self.allowed_elements or + (namespace is None and + (namespaces["html"], name) in self.allowed_elements)): + return self.allowed_token(token) + else: + return self.disallowed_token(token) + elif token_type == "Comment": + pass + else: + return token + + def allowed_token(self, token): + if "data" in token: + attrs = token["data"] + attr_names = set(attrs.keys()) + + # Remove forbidden attributes + for to_remove in (attr_names - self.allowed_attributes): + del token["data"][to_remove] + attr_names.remove(to_remove) + + # Remove attributes with disallowed URL values + for attr in (attr_names & self.attr_val_is_uri): + assert attr in attrs + # I don't have a clue where this regexp comes from or why it matches those + # characters, nor why we call unescape. I just know it's always been here. + # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all + # this will do is remove *more* than it otherwise would. + val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\\s]+", '', + unescape(attrs[attr])).lower() + # remove replacement characters from unescaped characters + val_unescaped = val_unescaped.replace("\ufffd", "") + try: + uri = urlparse.urlparse(val_unescaped) + except ValueError: + uri = None + del attrs[attr] + if uri and uri.scheme: + if uri.scheme not in self.allowed_protocols: + del attrs[attr] + if uri.scheme == 'data': + m = data_content_type.match(uri.path) + if not m: + del attrs[attr] + elif m.group('content_type') not in self.allowed_content_types: + del attrs[attr] + + for attr in self.svg_attr_val_allows_ref: + if attr in attrs: + attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', + ' ', + unescape(attrs[attr])) + if (token["name"] in self.svg_allow_local_href and + (namespaces['xlink'], 'href') in attrs and re.search(r'^\s*[^#\s].*', + attrs[(namespaces['xlink'], 'href')])): + del attrs[(namespaces['xlink'], 'href')] + if (None, 'style') in attrs: + attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) + token["data"] = attrs + return token + + def disallowed_token(self, token): + token_type = token["type"] + if token_type == "EndTag": + token["data"] = "</%s>" % token["name"] + elif token["data"]: + assert token_type in ("StartTag", "EmptyTag") + attrs = [] + for (ns, name), v in token["data"].items(): + attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) + token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) + else: + token["data"] = "<%s>" % token["name"] + if token.get("selfClosing"): + token["data"] = token["data"][:-1] + "/>" + + token["type"] = "Characters" + + del token["name"] + return token + + def sanitize_css(self, style): + # disallow urls + style = re.compile(r'url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) + + # gauntlet + if not re.match(r"""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): + return '' + if not re.match(r"^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): + return '' + + clean = [] + for prop, value in re.findall(r"([-\w]+)\s*:\s*([^:;]*)", style): + if not value: + continue + if prop.lower() in self.allowed_css_properties: + clean.append(prop + ': ' + value + ';') + elif prop.split('-')[0].lower() in ['background', 'border', 'margin', + 'padding']: + for keyword in value.split(): + if keyword not in self.allowed_css_keywords and \ + not re.match(r"^(#[0-9a-fA-F]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa + break + else: + clean.append(prop + ': ' + value + ';') + elif prop.lower() in self.allowed_svg_properties: + clean.append(prop + ': ' + value + ';') + + return ' '.join(clean) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/whitespace.py new file mode 100644 index 0000000..0d12584 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/whitespace.py @@ -0,0 +1,38 @@ +from __future__ import absolute_import, division, unicode_literals + +import re + +from . import base +from ..constants import rcdataElements, spaceCharacters +spaceCharacters = "".join(spaceCharacters) + +SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) + + +class Filter(base.Filter): + """Collapses whitespace except in pre, textarea, and script elements""" + spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) + + def __iter__(self): + preserve = 0 + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag" \ + and (preserve or token["name"] in self.spacePreserveElements): + preserve += 1 + + elif type == "EndTag" and preserve: + preserve -= 1 + + elif not preserve and type == "SpaceCharacters" and token["data"]: + # Test on token["data"] above to not introduce spaces where there were not + token["data"] = " " + + elif not preserve and type == "Characters": + token["data"] = collapse_spaces(token["data"]) + + yield token + + +def collapse_spaces(text): + return SPACES_REGEX.sub(' ', text) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/html5parser.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/html5parser.py new file mode 100644 index 0000000..ae41a13 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/html5parser.py @@ -0,0 +1,2791 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import with_metaclass, viewkeys + +import types +from collections import OrderedDict + +from . import _inputstream +from . import _tokenizer + +from . import treebuilders +from .treebuilders.base import Marker + +from . import _utils +from .constants import ( + spaceCharacters, asciiUpper2Lower, + specialElements, headingElements, cdataElements, rcdataElements, + tokenTypes, tagTokenTypes, + namespaces, + htmlIntegrationPointElements, mathmlTextIntegrationPointElements, + adjustForeignAttributes as adjustForeignAttributesMap, + adjustMathMLAttributes, adjustSVGAttributes, + E, + _ReparseException +) + + +def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML document as a string or file-like object into a tree + + :arg doc: the document to parse as a string or file-like object + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import parse + >>> parse('<html><body><p>This is a doc</p></body></html>') + <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0> + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parse(doc, **kwargs) + + +def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML fragment as a string or file-like object into a tree + + :arg doc: the fragment to parse as a string or file-like object + + :arg container: the container context to parse the fragment in + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import parseFragment + >>> parseFragment('<b>this is a fragment</b>') + <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090> + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parseFragment(doc, container=container, **kwargs) + + +def method_decorator_metaclass(function): + class Decorated(type): + def __new__(meta, classname, bases, classDict): + for attributeName, attribute in classDict.items(): + if isinstance(attribute, types.FunctionType): + attribute = function(attribute) + + classDict[attributeName] = attribute + return type.__new__(meta, classname, bases, classDict) + return Decorated + + +class HTMLParser(object): + """HTML parser + + Generates a tree structure from a stream of (possibly malformed) HTML. + + """ + + def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False): + """ + :arg tree: a treebuilder class controlling the type of tree that will be + returned. Built in treebuilders can be accessed through + html5lib.treebuilders.getTreeBuilder(treeType) + + :arg strict: raise an exception when a parse error is encountered + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :arg debug: whether or not to enable debug mode which logs things + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() # generates parser with etree builder + >>> parser = HTMLParser('lxml', strict=True) # generates parser with lxml builder which is strict + + """ + + # Raise an exception on the first error encountered + self.strict = strict + + if tree is None: + tree = treebuilders.getTreeBuilder("etree") + self.tree = tree(namespaceHTMLElements) + self.errors = [] + + self.phases = dict([(name, cls(self, self.tree)) for name, cls in + getPhases(debug).items()]) + + def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs): + + self.innerHTMLMode = innerHTML + self.container = container + self.scripting = scripting + self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs) + self.reset() + + try: + self.mainLoop() + except _ReparseException: + self.reset() + self.mainLoop() + + def reset(self): + self.tree.reset() + self.firstStartTag = False + self.errors = [] + self.log = [] # only used with debug mode + # "quirks" / "limited quirks" / "no quirks" + self.compatMode = "no quirks" + + if self.innerHTMLMode: + self.innerHTML = self.container.lower() + + if self.innerHTML in cdataElements: + self.tokenizer.state = self.tokenizer.rcdataState + elif self.innerHTML in rcdataElements: + self.tokenizer.state = self.tokenizer.rawtextState + elif self.innerHTML == 'plaintext': + self.tokenizer.state = self.tokenizer.plaintextState + else: + # state already is data state + # self.tokenizer.state = self.tokenizer.dataState + pass + self.phase = self.phases["beforeHtml"] + self.phase.insertHtmlElement() + self.resetInsertionMode() + else: + self.innerHTML = False # pylint:disable=redefined-variable-type + self.phase = self.phases["initial"] + + self.lastPhase = None + + self.beforeRCDataPhase = None + + self.framesetOK = True + + @property + def documentEncoding(self): + """Name of the character encoding that was used to decode the input stream, or + :obj:`None` if that is not determined yet + + """ + if not hasattr(self, 'tokenizer'): + return None + return self.tokenizer.stream.charEncoding[0].name + + def isHTMLIntegrationPoint(self, element): + if (element.name == "annotation-xml" and + element.namespace == namespaces["mathml"]): + return ("encoding" in element.attributes and + element.attributes["encoding"].translate( + asciiUpper2Lower) in + ("text/html", "application/xhtml+xml")) + else: + return (element.namespace, element.name) in htmlIntegrationPointElements + + def isMathMLTextIntegrationPoint(self, element): + return (element.namespace, element.name) in mathmlTextIntegrationPointElements + + def mainLoop(self): + CharactersToken = tokenTypes["Characters"] + SpaceCharactersToken = tokenTypes["SpaceCharacters"] + StartTagToken = tokenTypes["StartTag"] + EndTagToken = tokenTypes["EndTag"] + CommentToken = tokenTypes["Comment"] + DoctypeToken = tokenTypes["Doctype"] + ParseErrorToken = tokenTypes["ParseError"] + + for token in self.normalizedTokens(): + prev_token = None + new_token = token + while new_token is not None: + prev_token = new_token + currentNode = self.tree.openElements[-1] if self.tree.openElements else None + currentNodeNamespace = currentNode.namespace if currentNode else None + currentNodeName = currentNode.name if currentNode else None + + type = new_token["type"] + + if type == ParseErrorToken: + self.parseError(new_token["data"], new_token.get("datavars", {})) + new_token = None + else: + if (len(self.tree.openElements) == 0 or + currentNodeNamespace == self.tree.defaultNamespace or + (self.isMathMLTextIntegrationPoint(currentNode) and + ((type == StartTagToken and + token["name"] not in frozenset(["mglyph", "malignmark"])) or + type in (CharactersToken, SpaceCharactersToken))) or + (currentNodeNamespace == namespaces["mathml"] and + currentNodeName == "annotation-xml" and + type == StartTagToken and + token["name"] == "svg") or + (self.isHTMLIntegrationPoint(currentNode) and + type in (StartTagToken, CharactersToken, SpaceCharactersToken))): + phase = self.phase + else: + phase = self.phases["inForeignContent"] + + if type == CharactersToken: + new_token = phase.processCharacters(new_token) + elif type == SpaceCharactersToken: + new_token = phase.processSpaceCharacters(new_token) + elif type == StartTagToken: + new_token = phase.processStartTag(new_token) + elif type == EndTagToken: + new_token = phase.processEndTag(new_token) + elif type == CommentToken: + new_token = phase.processComment(new_token) + elif type == DoctypeToken: + new_token = phase.processDoctype(new_token) + + if (type == StartTagToken and prev_token["selfClosing"] and + not prev_token["selfClosingAcknowledged"]): + self.parseError("non-void-element-with-trailing-solidus", + {"name": prev_token["name"]}) + + # When the loop finishes it's EOF + reprocess = True + phases = [] + while reprocess: + phases.append(self.phase) + reprocess = self.phase.processEOF() + if reprocess: + assert self.phase not in phases + + def normalizedTokens(self): + for token in self.tokenizer: + yield self.normalizeToken(token) + + def parse(self, stream, *args, **kwargs): + """Parse a HTML document into a well-formed tree + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element). + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parse('<html><body><p>This is a doc</p></body></html>') + <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0> + + """ + self._parse(stream, False, None, *args, **kwargs) + return self.tree.getDocument() + + def parseFragment(self, stream, *args, **kwargs): + """Parse a HTML fragment into a well-formed tree fragment + + :arg container: name of the element we're setting the innerHTML + property if set to None, default to 'div' + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parseFragment('<b>this is a fragment</b>') + <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090> + + """ + self._parse(stream, True, *args, **kwargs) + return self.tree.getFragment() + + def parseError(self, errorcode="XXX-undefined-error", datavars=None): + # XXX The idea is to make errorcode mandatory. + if datavars is None: + datavars = {} + self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) + if self.strict: + raise ParseError(E[errorcode] % datavars) + + def normalizeToken(self, token): + # HTML5 specific normalizations to the token stream + if token["type"] == tokenTypes["StartTag"]: + raw = token["data"] + token["data"] = OrderedDict(raw) + if len(raw) > len(token["data"]): + # we had some duplicated attribute, fix so first wins + token["data"].update(raw[::-1]) + + return token + + def adjustMathMLAttributes(self, token): + adjust_attributes(token, adjustMathMLAttributes) + + def adjustSVGAttributes(self, token): + adjust_attributes(token, adjustSVGAttributes) + + def adjustForeignAttributes(self, token): + adjust_attributes(token, adjustForeignAttributesMap) + + def reparseTokenNormal(self, token): + # pylint:disable=unused-argument + self.parser.phase() + + def resetInsertionMode(self): + # The name of this method is mostly historical. (It's also used in the + # specification.) + last = False + newModes = { + "select": "inSelect", + "td": "inCell", + "th": "inCell", + "tr": "inRow", + "tbody": "inTableBody", + "thead": "inTableBody", + "tfoot": "inTableBody", + "caption": "inCaption", + "colgroup": "inColumnGroup", + "table": "inTable", + "head": "inBody", + "body": "inBody", + "frameset": "inFrameset", + "html": "beforeHead" + } + for node in self.tree.openElements[::-1]: + nodeName = node.name + new_phase = None + if node == self.tree.openElements[0]: + assert self.innerHTML + last = True + nodeName = self.innerHTML + # Check for conditions that should only happen in the innerHTML + # case + if nodeName in ("select", "colgroup", "head", "html"): + assert self.innerHTML + + if not last and node.namespace != self.tree.defaultNamespace: + continue + + if nodeName in newModes: + new_phase = self.phases[newModes[nodeName]] + break + elif last: + new_phase = self.phases["inBody"] + break + + self.phase = new_phase + + def parseRCDataRawtext(self, token, contentType): + # Generic RCDATA/RAWTEXT Parsing algorithm + assert contentType in ("RAWTEXT", "RCDATA") + + self.tree.insertElement(token) + + if contentType == "RAWTEXT": + self.tokenizer.state = self.tokenizer.rawtextState + else: + self.tokenizer.state = self.tokenizer.rcdataState + + self.originalPhase = self.phase + + self.phase = self.phases["text"] + + +@_utils.memoize +def getPhases(debug): + def log(function): + """Logger that records which phase processes each token""" + type_names = dict((value, key) for key, value in + tokenTypes.items()) + + def wrapped(self, *args, **kwargs): + if function.__name__.startswith("process") and len(args) > 0: + token = args[0] + try: + info = {"type": type_names[token['type']]} + except: + raise + if token['type'] in tagTokenTypes: + info["name"] = token['name'] + + self.parser.log.append((self.parser.tokenizer.state.__name__, + self.parser.phase.__class__.__name__, + self.__class__.__name__, + function.__name__, + info)) + return function(self, *args, **kwargs) + else: + return function(self, *args, **kwargs) + return wrapped + + def getMetaclass(use_metaclass, metaclass_func): + if use_metaclass: + return method_decorator_metaclass(metaclass_func) + else: + return type + + # pylint:disable=unused-argument + class Phase(with_metaclass(getMetaclass(debug, log))): + """Base class for helper object that implements each phase of processing + """ + + def __init__(self, parser, tree): + self.parser = parser + self.tree = tree + + def processEOF(self): + raise NotImplementedError + + def processComment(self, token): + # For most phases the following is correct. Where it's not it will be + # overridden. + self.tree.insertComment(token, self.tree.openElements[-1]) + + def processDoctype(self, token): + self.parser.parseError("unexpected-doctype") + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processSpaceCharacters(self, token): + self.tree.insertText(token["data"]) + + def processStartTag(self, token): + return self.startTagHandler[token["name"]](token) + + def startTagHtml(self, token): + if not self.parser.firstStartTag and token["name"] == "html": + self.parser.parseError("non-html-root") + # XXX Need a check here to see if the first start tag token emitted is + # this token... If it's not, invoke self.parser.parseError(). + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[0].attributes: + self.tree.openElements[0].attributes[attr] = value + self.parser.firstStartTag = False + + def processEndTag(self, token): + return self.endTagHandler[token["name"]](token) + + class InitialPhase(Phase): + def processSpaceCharacters(self, token): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + correct = token["correct"] + + if (name != "html" or publicId is not None or + systemId is not None and systemId != "about:legacy-compat"): + self.parser.parseError("unknown-doctype") + + if publicId is None: + publicId = "" + + self.tree.insertDoctype(token) + + if publicId != "": + publicId = publicId.translate(asciiUpper2Lower) + + if (not correct or token["name"] != "html" or + publicId.startswith( + ("+//silmaril//dtd html pro v0r11 19970101//", + "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", + "-//as//dtd html 3.0 aswedit + extensions//", + "-//ietf//dtd html 2.0 level 1//", + "-//ietf//dtd html 2.0 level 2//", + "-//ietf//dtd html 2.0 strict level 1//", + "-//ietf//dtd html 2.0 strict level 2//", + "-//ietf//dtd html 2.0 strict//", + "-//ietf//dtd html 2.0//", + "-//ietf//dtd html 2.1e//", + "-//ietf//dtd html 3.0//", + "-//ietf//dtd html 3.2 final//", + "-//ietf//dtd html 3.2//", + "-//ietf//dtd html 3//", + "-//ietf//dtd html level 0//", + "-//ietf//dtd html level 1//", + "-//ietf//dtd html level 2//", + "-//ietf//dtd html level 3//", + "-//ietf//dtd html strict level 0//", + "-//ietf//dtd html strict level 1//", + "-//ietf//dtd html strict level 2//", + "-//ietf//dtd html strict level 3//", + "-//ietf//dtd html strict//", + "-//ietf//dtd html//", + "-//metrius//dtd metrius presentational//", + "-//microsoft//dtd internet explorer 2.0 html strict//", + "-//microsoft//dtd internet explorer 2.0 html//", + "-//microsoft//dtd internet explorer 2.0 tables//", + "-//microsoft//dtd internet explorer 3.0 html strict//", + "-//microsoft//dtd internet explorer 3.0 html//", + "-//microsoft//dtd internet explorer 3.0 tables//", + "-//netscape comm. corp.//dtd html//", + "-//netscape comm. corp.//dtd strict html//", + "-//o'reilly and associates//dtd html 2.0//", + "-//o'reilly and associates//dtd html extended 1.0//", + "-//o'reilly and associates//dtd html extended relaxed 1.0//", + "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", + "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", + "-//spyglass//dtd html 2.0 extended//", + "-//sq//dtd html 2.0 hotmetal + extensions//", + "-//sun microsystems corp.//dtd hotjava html//", + "-//sun microsystems corp.//dtd hotjava strict html//", + "-//w3c//dtd html 3 1995-03-24//", + "-//w3c//dtd html 3.2 draft//", + "-//w3c//dtd html 3.2 final//", + "-//w3c//dtd html 3.2//", + "-//w3c//dtd html 3.2s draft//", + "-//w3c//dtd html 4.0 frameset//", + "-//w3c//dtd html 4.0 transitional//", + "-//w3c//dtd html experimental 19960712//", + "-//w3c//dtd html experimental 970421//", + "-//w3c//dtd w3 html//", + "-//w3o//dtd w3 html 3.0//", + "-//webtechs//dtd mozilla html 2.0//", + "-//webtechs//dtd mozilla html//")) or + publicId in ("-//w3o//dtd w3 html strict 3.0//en//", + "-/w3c/dtd html 4.0 transitional/en", + "html") or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is None or + systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): + self.parser.compatMode = "quirks" + elif (publicId.startswith( + ("-//w3c//dtd xhtml 1.0 frameset//", + "-//w3c//dtd xhtml 1.0 transitional//")) or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is not None): + self.parser.compatMode = "limited quirks" + + self.parser.phase = self.parser.phases["beforeHtml"] + + def anythingElse(self): + self.parser.compatMode = "quirks" + self.parser.phase = self.parser.phases["beforeHtml"] + + def processCharacters(self, token): + self.parser.parseError("expected-doctype-but-got-chars") + self.anythingElse() + return token + + def processStartTag(self, token): + self.parser.parseError("expected-doctype-but-got-start-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEndTag(self, token): + self.parser.parseError("expected-doctype-but-got-end-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEOF(self): + self.parser.parseError("expected-doctype-but-got-eof") + self.anythingElse() + return True + + class BeforeHtmlPhase(Phase): + # helper methods + def insertHtmlElement(self): + self.tree.insertRoot(impliedTagToken("html", "StartTag")) + self.parser.phase = self.parser.phases["beforeHead"] + + # other + def processEOF(self): + self.insertHtmlElement() + return True + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.insertHtmlElement() + return token + + def processStartTag(self, token): + if token["name"] == "html": + self.parser.firstStartTag = True + self.insertHtmlElement() + return token + + def processEndTag(self, token): + if token["name"] not in ("head", "body", "html", "br"): + self.parser.parseError("unexpected-end-tag-before-html", + {"name": token["name"]}) + else: + self.insertHtmlElement() + return token + + class BeforeHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("head", "body", "html", "br"), self.endTagImplyHead) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.startTagHead(impliedTagToken("head", "StartTag")) + return True + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.tree.insertElement(token) + self.tree.headPointer = self.tree.openElements[-1] + self.parser.phase = self.parser.phases["inHead"] + + def startTagOther(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagImplyHead(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagOther(self, token): + self.parser.parseError("end-tag-after-implied-root", + {"name": token["name"]}) + + class InHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("title", self.startTagTitle), + (("noframes", "style"), self.startTagNoFramesStyle), + ("noscript", self.startTagNoscript), + ("script", self.startTagScript), + (("base", "basefont", "bgsound", "command", "link"), + self.startTagBaseLinkCommand), + ("meta", self.startTagMeta), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("head", self.endTagHead), + (("br", "html", "body"), self.endTagHtmlBodyBr) + ]) + self.endTagHandler.default = self.endTagOther + + # the real thing + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.parser.parseError("two-heads-are-not-better-than-one") + + def startTagBaseLinkCommand(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMeta(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + attributes = token["data"] + if self.parser.tokenizer.stream.charEncoding[1] == "tentative": + if "charset" in attributes: + self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) + elif ("content" in attributes and + "http-equiv" in attributes and + attributes["http-equiv"].lower() == "content-type"): + # Encoding it as UTF-8 here is a hack, as really we should pass + # the abstract Unicode string, and just use the + # ContentAttrParser on that, but using UTF-8 allows all chars + # to be encoded and as a ASCII-superset works. + data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8")) + parser = _inputstream.ContentAttrParser(data) + codec = parser.parse() + self.parser.tokenizer.stream.changeEncoding(codec) + + def startTagTitle(self, token): + self.parser.parseRCDataRawtext(token, "RCDATA") + + def startTagNoFramesStyle(self, token): + # Need to decide whether to implement the scripting-disabled case + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagNoscript(self, token): + if self.parser.scripting: + self.parser.parseRCDataRawtext(token, "RAWTEXT") + else: + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inHeadNoscript"] + + def startTagScript(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState + self.parser.originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["text"] + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHead(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "head", "Expected head got %s" % node.name + self.parser.phase = self.parser.phases["afterHead"] + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.endTagHead(impliedTagToken("head")) + + class InHeadNoscriptPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand), + (("head", "noscript"), self.startTagHeadNoscript), + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("noscript", self.endTagNoscript), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.parser.parseError("eof-in-head-noscript") + self.anythingElse() + return True + + def processComment(self, token): + return self.parser.phases["inHead"].processComment(token) + + def processCharacters(self, token): + self.parser.parseError("char-in-head-noscript") + self.anythingElse() + return token + + def processSpaceCharacters(self, token): + return self.parser.phases["inHead"].processSpaceCharacters(token) + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBaseLinkCommand(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagHeadNoscript(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagNoscript(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "noscript", "Expected noscript got %s" % node.name + self.parser.phase = self.parser.phases["inHead"] + + def endTagBr(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + # Caller must raise parse error first! + self.endTagNoscript(impliedTagToken("noscript")) + + class AfterHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", + "style", "title"), + self.startTagFromHead), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), + self.endTagHtmlBodyBr)]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBody(self, token): + self.parser.framesetOK = False + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inBody"] + + def startTagFrameset(self, token): + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagFromHead(self, token): + self.parser.parseError("unexpected-start-tag-out-of-my-head", + {"name": token["name"]}) + self.tree.openElements.append(self.tree.headPointer) + self.parser.phases["inHead"].processStartTag(token) + for node in self.tree.openElements[::-1]: + if node.name == "head": + self.tree.openElements.remove(node) + break + + def startTagHead(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.tree.insertElement(impliedTagToken("body", "StartTag")) + self.parser.phase = self.parser.phases["inBody"] + self.parser.framesetOK = True + + class InBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody + # the really-really-really-very crazy mode + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + # Set this to the default handler + self.processSpaceCharacters = self.processSpaceCharactersNonPre + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("base", "basefont", "bgsound", "command", "link", "meta", + "script", "style", "title"), + self.startTagProcessInHead), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("address", "article", "aside", "blockquote", "center", "details", + "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", + "section", "summary", "ul"), + self.startTagCloseP), + (headingElements, self.startTagHeading), + (("pre", "listing"), self.startTagPreListing), + ("form", self.startTagForm), + (("li", "dd", "dt"), self.startTagListItem), + ("plaintext", self.startTagPlaintext), + ("a", self.startTagA), + (("b", "big", "code", "em", "font", "i", "s", "small", "strike", + "strong", "tt", "u"), self.startTagFormatting), + ("nobr", self.startTagNobr), + ("button", self.startTagButton), + (("applet", "marquee", "object"), self.startTagAppletMarqueeObject), + ("xmp", self.startTagXmp), + ("table", self.startTagTable), + (("area", "br", "embed", "img", "keygen", "wbr"), + self.startTagVoidFormatting), + (("param", "source", "track"), self.startTagParamSource), + ("input", self.startTagInput), + ("hr", self.startTagHr), + ("image", self.startTagImage), + ("isindex", self.startTagIsIndex), + ("textarea", self.startTagTextarea), + ("iframe", self.startTagIFrame), + ("noscript", self.startTagNoscript), + (("noembed", "noframes"), self.startTagRawtext), + ("select", self.startTagSelect), + (("rp", "rt"), self.startTagRpRt), + (("option", "optgroup"), self.startTagOpt), + (("math"), self.startTagMath), + (("svg"), self.startTagSvg), + (("caption", "col", "colgroup", "frame", "head", + "tbody", "td", "tfoot", "th", "thead", + "tr"), self.startTagMisplaced) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("body", self.endTagBody), + ("html", self.endTagHtml), + (("address", "article", "aside", "blockquote", "button", "center", + "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", + "section", "summary", "ul"), self.endTagBlock), + ("form", self.endTagForm), + ("p", self.endTagP), + (("dd", "dt", "li"), self.endTagListItem), + (headingElements, self.endTagHeading), + (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", + "strike", "strong", "tt", "u"), self.endTagFormatting), + (("applet", "marquee", "object"), self.endTagAppletMarqueeObject), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def isMatchingFormattingElement(self, node1, node2): + return (node1.name == node2.name and + node1.namespace == node2.namespace and + node1.attributes == node2.attributes) + + # helper + def addFormattingElement(self, token): + self.tree.insertElement(token) + element = self.tree.openElements[-1] + + matchingElements = [] + for node in self.tree.activeFormattingElements[::-1]: + if node is Marker: + break + elif self.isMatchingFormattingElement(node, element): + matchingElements.append(node) + + assert len(matchingElements) <= 3 + if len(matchingElements) == 3: + self.tree.activeFormattingElements.remove(matchingElements[-1]) + self.tree.activeFormattingElements.append(element) + + # the real deal + def processEOF(self): + allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", + "tfoot", "th", "thead", "tr", "body", + "html")) + for node in self.tree.openElements[::-1]: + if node.name not in allowed_elements: + self.parser.parseError("expected-closing-tag-but-got-eof") + break + # Stop parsing + + def processSpaceCharactersDropNewline(self, token): + # Sometimes (start of <pre>, <listing>, and <textarea> blocks) we + # want to drop leading newlines + data = token["data"] + self.processSpaceCharacters = self.processSpaceCharactersNonPre + if (data.startswith("\n") and + self.tree.openElements[-1].name in ("pre", "listing", "textarea") and + not self.tree.openElements[-1].hasContent()): + data = data[1:] + if data: + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(data) + + def processCharacters(self, token): + if token["data"] == "\u0000": + # The tokenizer should always emit null on its own + return + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(token["data"]) + # This must be bad for performance + if (self.parser.framesetOK and + any([char not in spaceCharacters + for char in token["data"]])): + self.parser.framesetOK = False + + def processSpaceCharactersNonPre(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(token["data"]) + + def startTagProcessInHead(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagBody(self, token): + self.parser.parseError("unexpected-start-tag", {"name": "body"}) + if (len(self.tree.openElements) == 1 or + self.tree.openElements[1].name != "body"): + assert self.parser.innerHTML + else: + self.parser.framesetOK = False + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[1].attributes: + self.tree.openElements[1].attributes[attr] = value + + def startTagFrameset(self, token): + self.parser.parseError("unexpected-start-tag", {"name": "frameset"}) + if (len(self.tree.openElements) == 1 or self.tree.openElements[1].name != "body"): + assert self.parser.innerHTML + elif not self.parser.framesetOK: + pass + else: + if self.tree.openElements[1].parent: + self.tree.openElements[1].parent.removeChild(self.tree.openElements[1]) + while self.tree.openElements[-1].name != "html": + self.tree.openElements.pop() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagCloseP(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + + def startTagPreListing(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.framesetOK = False + self.processSpaceCharacters = self.processSpaceCharactersDropNewline + + def startTagForm(self, token): + if self.tree.formPointer: + self.parser.parseError("unexpected-start-tag", {"name": "form"}) + else: + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.tree.formPointer = self.tree.openElements[-1] + + def startTagListItem(self, token): + self.parser.framesetOK = False + + stopNamesMap = {"li": ["li"], + "dt": ["dt", "dd"], + "dd": ["dt", "dd"]} + stopNames = stopNamesMap[token["name"]] + for node in reversed(self.tree.openElements): + if node.name in stopNames: + self.parser.phase.processEndTag( + impliedTagToken(node.name, "EndTag")) + break + if (node.nameTuple in specialElements and + node.name not in ("address", "div", "p")): + break + + if self.tree.elementInScope("p", variant="button"): + self.parser.phase.processEndTag( + impliedTagToken("p", "EndTag")) + + self.tree.insertElement(token) + + def startTagPlaintext(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.plaintextState + + def startTagHeading(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + if self.tree.openElements[-1].name in headingElements: + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagA(self, token): + afeAElement = self.tree.elementInActiveFormattingElements("a") + if afeAElement: + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "a", "endName": "a"}) + self.endTagFormatting(impliedTagToken("a")) + if afeAElement in self.tree.openElements: + self.tree.openElements.remove(afeAElement) + if afeAElement in self.tree.activeFormattingElements: + self.tree.activeFormattingElements.remove(afeAElement) + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagFormatting(self, token): + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagNobr(self, token): + self.tree.reconstructActiveFormattingElements() + if self.tree.elementInScope("nobr"): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "nobr", "endName": "nobr"}) + self.processEndTag(impliedTagToken("nobr")) + # XXX Need tests that trigger the following + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagButton(self, token): + if self.tree.elementInScope("button"): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "button", "endName": "button"}) + self.processEndTag(impliedTagToken("button")) + return token + else: + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.parser.framesetOK = False + + def startTagAppletMarqueeObject(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.tree.activeFormattingElements.append(Marker) + self.parser.framesetOK = False + + def startTagXmp(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.reconstructActiveFormattingElements() + self.parser.framesetOK = False + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagTable(self, token): + if self.parser.compatMode != "quirks": + if self.tree.elementInScope("p", variant="button"): + self.processEndTag(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.framesetOK = False + self.parser.phase = self.parser.phases["inTable"] + + def startTagVoidFormatting(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + self.parser.framesetOK = False + + def startTagInput(self, token): + framesetOK = self.parser.framesetOK + self.startTagVoidFormatting(token) + if ("type" in token["data"] and + token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): + # input type=hidden doesn't change framesetOK + self.parser.framesetOK = framesetOK + + def startTagParamSource(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagHr(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + self.parser.framesetOK = False + + def startTagImage(self, token): + # No really... + self.parser.parseError("unexpected-start-tag-treated-as", + {"originalName": "image", "newName": "img"}) + self.processStartTag(impliedTagToken("img", "StartTag", + attributes=token["data"], + selfClosing=token["selfClosing"])) + + def startTagIsIndex(self, token): + self.parser.parseError("deprecated-tag", {"name": "isindex"}) + if self.tree.formPointer: + return + form_attrs = {} + if "action" in token["data"]: + form_attrs["action"] = token["data"]["action"] + self.processStartTag(impliedTagToken("form", "StartTag", + attributes=form_attrs)) + self.processStartTag(impliedTagToken("hr", "StartTag")) + self.processStartTag(impliedTagToken("label", "StartTag")) + # XXX Localization ... + if "prompt" in token["data"]: + prompt = token["data"]["prompt"] + else: + prompt = "This is a searchable index. Enter search keywords: " + self.processCharacters( + {"type": tokenTypes["Characters"], "data": prompt}) + attributes = token["data"].copy() + if "action" in attributes: + del attributes["action"] + if "prompt" in attributes: + del attributes["prompt"] + attributes["name"] = "isindex" + self.processStartTag(impliedTagToken("input", "StartTag", + attributes=attributes, + selfClosing=token["selfClosing"])) + self.processEndTag(impliedTagToken("label")) + self.processStartTag(impliedTagToken("hr", "StartTag")) + self.processEndTag(impliedTagToken("form")) + + def startTagTextarea(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.rcdataState + self.processSpaceCharacters = self.processSpaceCharactersDropNewline + self.parser.framesetOK = False + + def startTagIFrame(self, token): + self.parser.framesetOK = False + self.startTagRawtext(token) + + def startTagNoscript(self, token): + if self.parser.scripting: + self.startTagRawtext(token) + else: + self.startTagOther(token) + + def startTagRawtext(self, token): + """iframe, noembed noframes, noscript(if scripting enabled)""" + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagOpt(self, token): + if self.tree.openElements[-1].name == "option": + self.parser.phase.processEndTag(impliedTagToken("option")) + self.tree.reconstructActiveFormattingElements() + self.parser.tree.insertElement(token) + + def startTagSelect(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.parser.framesetOK = False + if self.parser.phase in (self.parser.phases["inTable"], + self.parser.phases["inCaption"], + self.parser.phases["inColumnGroup"], + self.parser.phases["inTableBody"], + self.parser.phases["inRow"], + self.parser.phases["inCell"]): + self.parser.phase = self.parser.phases["inSelectInTable"] + else: + self.parser.phase = self.parser.phases["inSelect"] + + def startTagRpRt(self, token): + if self.tree.elementInScope("ruby"): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "ruby": + self.parser.parseError() + self.tree.insertElement(token) + + def startTagMath(self, token): + self.tree.reconstructActiveFormattingElements() + self.parser.adjustMathMLAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = namespaces["mathml"] + self.tree.insertElement(token) + # Need to get the parse error right for the case where the token + # has a namespace not equal to the xmlns attribute + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagSvg(self, token): + self.tree.reconstructActiveFormattingElements() + self.parser.adjustSVGAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = namespaces["svg"] + self.tree.insertElement(token) + # Need to get the parse error right for the case where the token + # has a namespace not equal to the xmlns attribute + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMisplaced(self, token): + """ Elements that should be children of other elements that have a + different insertion mode; here they are ignored + "caption", "col", "colgroup", "frame", "frameset", "head", + "option", "optgroup", "tbody", "td", "tfoot", "th", "thead", + "tr", "noscript" + """ + self.parser.parseError("unexpected-start-tag-ignored", {"name": token["name"]}) + + def startTagOther(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + + def endTagP(self, token): + if not self.tree.elementInScope("p", variant="button"): + self.startTagCloseP(impliedTagToken("p", "StartTag")) + self.parser.parseError("unexpected-end-tag", {"name": "p"}) + self.endTagP(impliedTagToken("p", "EndTag")) + else: + self.tree.generateImpliedEndTags("p") + if self.tree.openElements[-1].name != "p": + self.parser.parseError("unexpected-end-tag", {"name": "p"}) + node = self.tree.openElements.pop() + while node.name != "p": + node = self.tree.openElements.pop() + + def endTagBody(self, token): + if not self.tree.elementInScope("body"): + self.parser.parseError() + return + elif self.tree.openElements[-1].name != "body": + for node in self.tree.openElements[2:]: + if node.name not in frozenset(("dd", "dt", "li", "optgroup", + "option", "p", "rp", "rt", + "tbody", "td", "tfoot", + "th", "thead", "tr", "body", + "html")): + # Not sure this is the correct name for the parse error + self.parser.parseError( + "expected-one-end-tag-but-got-another", + {"gotName": "body", "expectedName": node.name}) + break + self.parser.phase = self.parser.phases["afterBody"] + + def endTagHtml(self, token): + # We repeat the test for the body end tag token being ignored here + if self.tree.elementInScope("body"): + self.endTagBody(impliedTagToken("body")) + return token + + def endTagBlock(self, token): + # Put us back in the right whitespace handling mode + if token["name"] == "pre": + self.processSpaceCharacters = self.processSpaceCharactersNonPre + inScope = self.tree.elementInScope(token["name"]) + if inScope: + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + if inScope: + node = self.tree.openElements.pop() + while node.name != token["name"]: + node = self.tree.openElements.pop() + + def endTagForm(self, token): + node = self.tree.formPointer + self.tree.formPointer = None + if node is None or not self.tree.elementInScope(node): + self.parser.parseError("unexpected-end-tag", + {"name": "form"}) + else: + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1] != node: + self.parser.parseError("end-tag-too-early-ignored", + {"name": "form"}) + self.tree.openElements.remove(node) + + def endTagListItem(self, token): + if token["name"] == "li": + variant = "list" + else: + variant = None + if not self.tree.elementInScope(token["name"], variant=variant): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + else: + self.tree.generateImpliedEndTags(exclude=token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError( + "end-tag-too-early", + {"name": token["name"]}) + node = self.tree.openElements.pop() + while node.name != token["name"]: + node = self.tree.openElements.pop() + + def endTagHeading(self, token): + for item in headingElements: + if self.tree.elementInScope(item): + self.tree.generateImpliedEndTags() + break + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + + for item in headingElements: + if self.tree.elementInScope(item): + item = self.tree.openElements.pop() + while item.name not in headingElements: + item = self.tree.openElements.pop() + break + + def endTagFormatting(self, token): + """The much-feared adoption agency algorithm""" + # http://svn.whatwg.org/webapps/complete.html#adoptionAgency revision 7867 + # XXX Better parseError messages appreciated. + + # Step 1 + outerLoopCounter = 0 + + # Step 2 + while outerLoopCounter < 8: + + # Step 3 + outerLoopCounter += 1 + + # Step 4: + + # Let the formatting element be the last element in + # the list of active formatting elements that: + # - is between the end of the list and the last scope + # marker in the list, if any, or the start of the list + # otherwise, and + # - has the same tag name as the token. + formattingElement = self.tree.elementInActiveFormattingElements( + token["name"]) + if (not formattingElement or + (formattingElement in self.tree.openElements and + not self.tree.elementInScope(formattingElement.name))): + # If there is no such node, then abort these steps + # and instead act as described in the "any other + # end tag" entry below. + self.endTagOther(token) + return + + # Otherwise, if there is such a node, but that node is + # not in the stack of open elements, then this is a + # parse error; remove the element from the list, and + # abort these steps. + elif formattingElement not in self.tree.openElements: + self.parser.parseError("adoption-agency-1.2", {"name": token["name"]}) + self.tree.activeFormattingElements.remove(formattingElement) + return + + # Otherwise, if there is such a node, and that node is + # also in the stack of open elements, but the element + # is not in scope, then this is a parse error; ignore + # the token, and abort these steps. + elif not self.tree.elementInScope(formattingElement.name): + self.parser.parseError("adoption-agency-4.4", {"name": token["name"]}) + return + + # Otherwise, there is a formatting element and that + # element is in the stack and is in scope. If the + # element is not the current node, this is a parse + # error. In any case, proceed with the algorithm as + # written in the following steps. + else: + if formattingElement != self.tree.openElements[-1]: + self.parser.parseError("adoption-agency-1.3", {"name": token["name"]}) + + # Step 5: + + # Let the furthest block be the topmost node in the + # stack of open elements that is lower in the stack + # than the formatting element, and is an element in + # the special category. There might not be one. + afeIndex = self.tree.openElements.index(formattingElement) + furthestBlock = None + for element in self.tree.openElements[afeIndex:]: + if element.nameTuple in specialElements: + furthestBlock = element + break + + # Step 6: + + # If there is no furthest block, then the UA must + # first pop all the nodes from the bottom of the stack + # of open elements, from the current node up to and + # including the formatting element, then remove the + # formatting element from the list of active + # formatting elements, and finally abort these steps. + if furthestBlock is None: + element = self.tree.openElements.pop() + while element != formattingElement: + element = self.tree.openElements.pop() + self.tree.activeFormattingElements.remove(element) + return + + # Step 7 + commonAncestor = self.tree.openElements[afeIndex - 1] + + # Step 8: + # The bookmark is supposed to help us identify where to reinsert + # nodes in step 15. We have to ensure that we reinsert nodes after + # the node before the active formatting element. Note the bookmark + # can move in step 9.7 + bookmark = self.tree.activeFormattingElements.index(formattingElement) + + # Step 9 + lastNode = node = furthestBlock + innerLoopCounter = 0 + + index = self.tree.openElements.index(node) + while innerLoopCounter < 3: + innerLoopCounter += 1 + # Node is element before node in open elements + index -= 1 + node = self.tree.openElements[index] + if node not in self.tree.activeFormattingElements: + self.tree.openElements.remove(node) + continue + # Step 9.6 + if node == formattingElement: + break + # Step 9.7 + if lastNode == furthestBlock: + bookmark = self.tree.activeFormattingElements.index(node) + 1 + # Step 9.8 + clone = node.cloneNode() + # Replace node with clone + self.tree.activeFormattingElements[ + self.tree.activeFormattingElements.index(node)] = clone + self.tree.openElements[ + self.tree.openElements.index(node)] = clone + node = clone + # Step 9.9 + # Remove lastNode from its parents, if any + if lastNode.parent: + lastNode.parent.removeChild(lastNode) + node.appendChild(lastNode) + # Step 9.10 + lastNode = node + + # Step 10 + # Foster parent lastNode if commonAncestor is a + # table, tbody, tfoot, thead, or tr we need to foster + # parent the lastNode + if lastNode.parent: + lastNode.parent.removeChild(lastNode) + + if commonAncestor.name in frozenset(("table", "tbody", "tfoot", "thead", "tr")): + parent, insertBefore = self.tree.getTableMisnestedNodePosition() + parent.insertBefore(lastNode, insertBefore) + else: + commonAncestor.appendChild(lastNode) + + # Step 11 + clone = formattingElement.cloneNode() + + # Step 12 + furthestBlock.reparentChildren(clone) + + # Step 13 + furthestBlock.appendChild(clone) + + # Step 14 + self.tree.activeFormattingElements.remove(formattingElement) + self.tree.activeFormattingElements.insert(bookmark, clone) + + # Step 15 + self.tree.openElements.remove(formattingElement) + self.tree.openElements.insert( + self.tree.openElements.index(furthestBlock) + 1, clone) + + def endTagAppletMarqueeObject(self, token): + if self.tree.elementInScope(token["name"]): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + + if self.tree.elementInScope(token["name"]): + element = self.tree.openElements.pop() + while element.name != token["name"]: + element = self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + + def endTagBr(self, token): + self.parser.parseError("unexpected-end-tag-treated-as", + {"originalName": "br", "newName": "br element"}) + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(impliedTagToken("br", "StartTag")) + self.tree.openElements.pop() + + def endTagOther(self, token): + for node in self.tree.openElements[::-1]: + if node.name == token["name"]: + self.tree.generateImpliedEndTags(exclude=token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + while self.tree.openElements.pop() != node: + pass + break + else: + if node.nameTuple in specialElements: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + break + + class TextPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = _utils.MethodDispatcher([ + ("script", self.endTagScript)]) + self.endTagHandler.default = self.endTagOther + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processEOF(self): + self.parser.parseError("expected-named-closing-tag-but-got-eof", + {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + self.parser.phase = self.parser.originalPhase + return True + + def startTagOther(self, token): + assert False, "Tried to process start tag %s in RCDATA/RAWTEXT mode" % token['name'] + + def endTagScript(self, token): + node = self.tree.openElements.pop() + assert node.name == "script" + self.parser.phase = self.parser.originalPhase + # The rest of this method is all stuff that only happens if + # document.write works + + def endTagOther(self, token): + self.tree.openElements.pop() + self.parser.phase = self.parser.originalPhase + + class InTablePhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-table + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("caption", self.startTagCaption), + ("colgroup", self.startTagColgroup), + ("col", self.startTagCol), + (("tbody", "tfoot", "thead"), self.startTagRowGroup), + (("td", "th", "tr"), self.startTagImplyTbody), + ("table", self.startTagTable), + (("style", "script"), self.startTagStyleScript), + ("input", self.startTagInput), + ("form", self.startTagForm) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("table", self.endTagTable), + (("body", "caption", "col", "colgroup", "html", "tbody", "td", + "tfoot", "th", "thead", "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods + def clearStackToTableContext(self): + # "clear the stack back to a table context" + while self.tree.openElements[-1].name not in ("table", "html"): + # self.parser.parseError("unexpected-implied-end-tag-in-table", + # {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + # When the current node is <html> it's an innerHTML case + + # processing methods + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-table") + else: + assert self.parser.innerHTML + # Stop parsing + + def processSpaceCharacters(self, token): + originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["inTableText"] + self.parser.phase.originalPhase = originalPhase + self.parser.phase.processSpaceCharacters(token) + + def processCharacters(self, token): + originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["inTableText"] + self.parser.phase.originalPhase = originalPhase + self.parser.phase.processCharacters(token) + + def insertText(self, token): + # If we get here there must be at least one non-whitespace character + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processCharacters(token) + self.tree.insertFromTable = False + + def startTagCaption(self, token): + self.clearStackToTableContext() + self.tree.activeFormattingElements.append(Marker) + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inCaption"] + + def startTagColgroup(self, token): + self.clearStackToTableContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inColumnGroup"] + + def startTagCol(self, token): + self.startTagColgroup(impliedTagToken("colgroup", "StartTag")) + return token + + def startTagRowGroup(self, token): + self.clearStackToTableContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inTableBody"] + + def startTagImplyTbody(self, token): + self.startTagRowGroup(impliedTagToken("tbody", "StartTag")) + return token + + def startTagTable(self, token): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "table", "endName": "table"}) + self.parser.phase.processEndTag(impliedTagToken("table")) + if not self.parser.innerHTML: + return token + + def startTagStyleScript(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagInput(self, token): + if ("type" in token["data"] and + token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): + self.parser.parseError("unexpected-hidden-input-in-table") + self.tree.insertElement(token) + # XXX associate with form + self.tree.openElements.pop() + else: + self.startTagOther(token) + + def startTagForm(self, token): + self.parser.parseError("unexpected-form-in-table") + if self.tree.formPointer is None: + self.tree.insertElement(token) + self.tree.formPointer = self.tree.openElements[-1] + self.tree.openElements.pop() + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-implies-table-voodoo", {"name": token["name"]}) + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processStartTag(token) + self.tree.insertFromTable = False + + def endTagTable(self, token): + if self.tree.elementInScope("table", variant="table"): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "table": + self.parser.parseError("end-tag-too-early-named", + {"gotName": "table", + "expectedName": self.tree.openElements[-1].name}) + while self.tree.openElements[-1].name != "table": + self.tree.openElements.pop() + self.tree.openElements.pop() + self.parser.resetInsertionMode() + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-implies-table-voodoo", {"name": token["name"]}) + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processEndTag(token) + self.tree.insertFromTable = False + + class InTableTextPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.originalPhase = None + self.characterTokens = [] + + def flushCharacters(self): + data = "".join([item["data"] for item in self.characterTokens]) + if any([item not in spaceCharacters for item in data]): + token = {"type": tokenTypes["Characters"], "data": data} + self.parser.phases["inTable"].insertText(token) + elif data: + self.tree.insertText(data) + self.characterTokens = [] + + def processComment(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + def processEOF(self): + self.flushCharacters() + self.parser.phase = self.originalPhase + return True + + def processCharacters(self, token): + if token["data"] == "\u0000": + return + self.characterTokens.append(token) + + def processSpaceCharacters(self, token): + # pretty sure we should never reach here + self.characterTokens.append(token) + # assert False + + def processStartTag(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + def processEndTag(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + class InCaptionPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-caption + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.startTagTableElement) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("caption", self.endTagCaption), + ("table", self.endTagTable), + (("body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + def ignoreEndTagCaption(self): + return not self.tree.elementInScope("caption", variant="table") + + def processEOF(self): + self.parser.phases["inBody"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inBody"].processCharacters(token) + + def startTagTableElement(self, token): + self.parser.parseError() + # XXX Have to duplicate logic here to find out if the tag is ignored + ignoreEndTag = self.ignoreEndTagCaption() + self.parser.phase.processEndTag(impliedTagToken("caption")) + if not ignoreEndTag: + return token + + def startTagOther(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def endTagCaption(self, token): + if not self.ignoreEndTagCaption(): + # AT this code is quite similar to endTagTable in "InTable" + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "caption": + self.parser.parseError("expected-one-end-tag-but-got-another", + {"gotName": "caption", + "expectedName": self.tree.openElements[-1].name}) + while self.tree.openElements[-1].name != "caption": + self.tree.openElements.pop() + self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + self.parser.phase = self.parser.phases["inTable"] + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagTable(self, token): + self.parser.parseError() + ignoreEndTag = self.ignoreEndTagCaption() + self.parser.phase.processEndTag(impliedTagToken("caption")) + if not ignoreEndTag: + return token + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inBody"].processEndTag(token) + + class InColumnGroupPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-column + + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("col", self.startTagCol) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("colgroup", self.endTagColgroup), + ("col", self.endTagCol) + ]) + self.endTagHandler.default = self.endTagOther + + def ignoreEndTagColgroup(self): + return self.tree.openElements[-1].name == "html" + + def processEOF(self): + if self.tree.openElements[-1].name == "html": + assert self.parser.innerHTML + return + else: + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return True + + def processCharacters(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + def startTagCol(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagOther(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + def endTagColgroup(self, token): + if self.ignoreEndTagColgroup(): + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + else: + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTable"] + + def endTagCol(self, token): + self.parser.parseError("no-end-tag", {"name": "col"}) + + def endTagOther(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + class InTableBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-table0 + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("tr", self.startTagTr), + (("td", "th"), self.startTagTableCell), + (("caption", "col", "colgroup", "tbody", "tfoot", "thead"), + self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), + ("table", self.endTagTable), + (("body", "caption", "col", "colgroup", "html", "td", "th", + "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods + def clearStackToTableBodyContext(self): + while self.tree.openElements[-1].name not in ("tbody", "tfoot", + "thead", "html"): + # self.parser.parseError("unexpected-implied-end-tag-in-table", + # {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + if self.tree.openElements[-1].name == "html": + assert self.parser.innerHTML + + # the rest + def processEOF(self): + self.parser.phases["inTable"].processEOF() + + def processSpaceCharacters(self, token): + return self.parser.phases["inTable"].processSpaceCharacters(token) + + def processCharacters(self, token): + return self.parser.phases["inTable"].processCharacters(token) + + def startTagTr(self, token): + self.clearStackToTableBodyContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inRow"] + + def startTagTableCell(self, token): + self.parser.parseError("unexpected-cell-in-table-body", + {"name": token["name"]}) + self.startTagTr(impliedTagToken("tr", "StartTag")) + return token + + def startTagTableOther(self, token): + # XXX AT Any ideas on how to share this with endTagTable? + if (self.tree.elementInScope("tbody", variant="table") or + self.tree.elementInScope("thead", variant="table") or + self.tree.elementInScope("tfoot", variant="table")): + self.clearStackToTableBodyContext() + self.endTagTableRowGroup( + impliedTagToken(self.tree.openElements[-1].name)) + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def startTagOther(self, token): + return self.parser.phases["inTable"].processStartTag(token) + + def endTagTableRowGroup(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.clearStackToTableBodyContext() + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTable"] + else: + self.parser.parseError("unexpected-end-tag-in-table-body", + {"name": token["name"]}) + + def endTagTable(self, token): + if (self.tree.elementInScope("tbody", variant="table") or + self.tree.elementInScope("thead", variant="table") or + self.tree.elementInScope("tfoot", variant="table")): + self.clearStackToTableBodyContext() + self.endTagTableRowGroup( + impliedTagToken(self.tree.openElements[-1].name)) + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag-in-table-body", + {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inTable"].processEndTag(token) + + class InRowPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-row + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("td", "th"), self.startTagTableCell), + (("caption", "col", "colgroup", "tbody", "tfoot", "thead", + "tr"), self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("tr", self.endTagTr), + ("table", self.endTagTable), + (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), + (("body", "caption", "col", "colgroup", "html", "td", "th"), + self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods (XXX unify this with other table helper methods) + def clearStackToTableRowContext(self): + while self.tree.openElements[-1].name not in ("tr", "html"): + self.parser.parseError("unexpected-implied-end-tag-in-table-row", + {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + + def ignoreEndTagTr(self): + return not self.tree.elementInScope("tr", variant="table") + + # the rest + def processEOF(self): + self.parser.phases["inTable"].processEOF() + + def processSpaceCharacters(self, token): + return self.parser.phases["inTable"].processSpaceCharacters(token) + + def processCharacters(self, token): + return self.parser.phases["inTable"].processCharacters(token) + + def startTagTableCell(self, token): + self.clearStackToTableRowContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inCell"] + self.tree.activeFormattingElements.append(Marker) + + def startTagTableOther(self, token): + ignoreEndTag = self.ignoreEndTagTr() + self.endTagTr(impliedTagToken("tr")) + # XXX how are we sure it's always ignored in the innerHTML case? + if not ignoreEndTag: + return token + + def startTagOther(self, token): + return self.parser.phases["inTable"].processStartTag(token) + + def endTagTr(self, token): + if not self.ignoreEndTagTr(): + self.clearStackToTableRowContext() + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTableBody"] + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagTable(self, token): + ignoreEndTag = self.ignoreEndTagTr() + self.endTagTr(impliedTagToken("tr")) + # Reprocess the current tag if the tr end tag was not ignored + # XXX how are we sure it's always ignored in the innerHTML case? + if not ignoreEndTag: + return token + + def endTagTableRowGroup(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.endTagTr(impliedTagToken("tr")) + return token + else: + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag-in-table-row", + {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inTable"].processEndTag(token) + + class InCellPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-cell + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("td", "th"), self.endTagTableCell), + (("body", "caption", "col", "colgroup", "html"), self.endTagIgnore), + (("table", "tbody", "tfoot", "thead", "tr"), self.endTagImply) + ]) + self.endTagHandler.default = self.endTagOther + + # helper + def closeCell(self): + if self.tree.elementInScope("td", variant="table"): + self.endTagTableCell(impliedTagToken("td")) + elif self.tree.elementInScope("th", variant="table"): + self.endTagTableCell(impliedTagToken("th")) + + # the rest + def processEOF(self): + self.parser.phases["inBody"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inBody"].processCharacters(token) + + def startTagTableOther(self, token): + if (self.tree.elementInScope("td", variant="table") or + self.tree.elementInScope("th", variant="table")): + self.closeCell() + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def startTagOther(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def endTagTableCell(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.tree.generateImpliedEndTags(token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("unexpected-cell-end-tag", + {"name": token["name"]}) + while True: + node = self.tree.openElements.pop() + if node.name == token["name"]: + break + else: + self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + self.parser.phase = self.parser.phases["inRow"] + else: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagImply(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.closeCell() + return token + else: + # sometimes innerHTML case + self.parser.parseError() + + def endTagOther(self, token): + return self.parser.phases["inBody"].processEndTag(token) + + class InSelectPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("option", self.startTagOption), + ("optgroup", self.startTagOptgroup), + ("select", self.startTagSelect), + (("input", "keygen", "textarea"), self.startTagInput), + ("script", self.startTagScript) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("option", self.endTagOption), + ("optgroup", self.endTagOptgroup), + ("select", self.endTagSelect) + ]) + self.endTagHandler.default = self.endTagOther + + # http://www.whatwg.org/specs/web-apps/current-work/#in-select + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-select") + else: + assert self.parser.innerHTML + + def processCharacters(self, token): + if token["data"] == "\u0000": + return + self.tree.insertText(token["data"]) + + def startTagOption(self, token): + # We need to imply </option> if <option> is the current node. + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagOptgroup(self, token): + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + if self.tree.openElements[-1].name == "optgroup": + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagSelect(self, token): + self.parser.parseError("unexpected-select-in-select") + self.endTagSelect(impliedTagToken("select")) + + def startTagInput(self, token): + self.parser.parseError("unexpected-input-in-select") + if self.tree.elementInScope("select", variant="select"): + self.endTagSelect(impliedTagToken("select")) + return token + else: + assert self.parser.innerHTML + + def startTagScript(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-in-select", + {"name": token["name"]}) + + def endTagOption(self, token): + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + else: + self.parser.parseError("unexpected-end-tag-in-select", + {"name": "option"}) + + def endTagOptgroup(self, token): + # </optgroup> implicitly closes <option> + if (self.tree.openElements[-1].name == "option" and + self.tree.openElements[-2].name == "optgroup"): + self.tree.openElements.pop() + # It also closes </optgroup> + if self.tree.openElements[-1].name == "optgroup": + self.tree.openElements.pop() + # But nothing else + else: + self.parser.parseError("unexpected-end-tag-in-select", + {"name": "optgroup"}) + + def endTagSelect(self, token): + if self.tree.elementInScope("select", variant="select"): + node = self.tree.openElements.pop() + while node.name != "select": + node = self.tree.openElements.pop() + self.parser.resetInsertionMode() + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-in-select", + {"name": token["name"]}) + + class InSelectInTablePhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), + self.startTagTable) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), + self.endTagTable) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.parser.phases["inSelect"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inSelect"].processCharacters(token) + + def startTagTable(self, token): + self.parser.parseError("unexpected-table-element-start-tag-in-select-in-table", {"name": token["name"]}) + self.endTagOther(impliedTagToken("select")) + return token + + def startTagOther(self, token): + return self.parser.phases["inSelect"].processStartTag(token) + + def endTagTable(self, token): + self.parser.parseError("unexpected-table-element-end-tag-in-select-in-table", {"name": token["name"]}) + if self.tree.elementInScope(token["name"], variant="table"): + self.endTagOther(impliedTagToken("select")) + return token + + def endTagOther(self, token): + return self.parser.phases["inSelect"].processEndTag(token) + + class InForeignContentPhase(Phase): + breakoutElements = frozenset(["b", "big", "blockquote", "body", "br", + "center", "code", "dd", "div", "dl", "dt", + "em", "embed", "h1", "h2", "h3", + "h4", "h5", "h6", "head", "hr", "i", "img", + "li", "listing", "menu", "meta", "nobr", + "ol", "p", "pre", "ruby", "s", "small", + "span", "strong", "strike", "sub", "sup", + "table", "tt", "u", "ul", "var"]) + + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + def adjustSVGTagNames(self, token): + replacements = {"altglyph": "altGlyph", + "altglyphdef": "altGlyphDef", + "altglyphitem": "altGlyphItem", + "animatecolor": "animateColor", + "animatemotion": "animateMotion", + "animatetransform": "animateTransform", + "clippath": "clipPath", + "feblend": "feBlend", + "fecolormatrix": "feColorMatrix", + "fecomponenttransfer": "feComponentTransfer", + "fecomposite": "feComposite", + "feconvolvematrix": "feConvolveMatrix", + "fediffuselighting": "feDiffuseLighting", + "fedisplacementmap": "feDisplacementMap", + "fedistantlight": "feDistantLight", + "feflood": "feFlood", + "fefunca": "feFuncA", + "fefuncb": "feFuncB", + "fefuncg": "feFuncG", + "fefuncr": "feFuncR", + "fegaussianblur": "feGaussianBlur", + "feimage": "feImage", + "femerge": "feMerge", + "femergenode": "feMergeNode", + "femorphology": "feMorphology", + "feoffset": "feOffset", + "fepointlight": "fePointLight", + "fespecularlighting": "feSpecularLighting", + "fespotlight": "feSpotLight", + "fetile": "feTile", + "feturbulence": "feTurbulence", + "foreignobject": "foreignObject", + "glyphref": "glyphRef", + "lineargradient": "linearGradient", + "radialgradient": "radialGradient", + "textpath": "textPath"} + + if token["name"] in replacements: + token["name"] = replacements[token["name"]] + + def processCharacters(self, token): + if token["data"] == "\u0000": + token["data"] = "\uFFFD" + elif (self.parser.framesetOK and + any(char not in spaceCharacters for char in token["data"])): + self.parser.framesetOK = False + Phase.processCharacters(self, token) + + def processStartTag(self, token): + currentNode = self.tree.openElements[-1] + if (token["name"] in self.breakoutElements or + (token["name"] == "font" and + set(token["data"].keys()) & set(["color", "face", "size"]))): + self.parser.parseError("unexpected-html-element-in-foreign-content", + {"name": token["name"]}) + while (self.tree.openElements[-1].namespace != + self.tree.defaultNamespace and + not self.parser.isHTMLIntegrationPoint(self.tree.openElements[-1]) and + not self.parser.isMathMLTextIntegrationPoint(self.tree.openElements[-1])): + self.tree.openElements.pop() + return token + + else: + if currentNode.namespace == namespaces["mathml"]: + self.parser.adjustMathMLAttributes(token) + elif currentNode.namespace == namespaces["svg"]: + self.adjustSVGTagNames(token) + self.parser.adjustSVGAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = currentNode.namespace + self.tree.insertElement(token) + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def processEndTag(self, token): + nodeIndex = len(self.tree.openElements) - 1 + node = self.tree.openElements[-1] + if node.name.translate(asciiUpper2Lower) != token["name"]: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + while True: + if node.name.translate(asciiUpper2Lower) == token["name"]: + # XXX this isn't in the spec but it seems necessary + if self.parser.phase == self.parser.phases["inTableText"]: + self.parser.phase.flushCharacters() + self.parser.phase = self.parser.phase.originalPhase + while self.tree.openElements.pop() != node: + assert self.tree.openElements + new_token = None + break + nodeIndex -= 1 + + node = self.tree.openElements[nodeIndex] + if node.namespace != self.tree.defaultNamespace: + continue + else: + new_token = self.parser.phase.processEndTag(token) + break + return new_token + + class AfterBodyPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([("html", self.endTagHtml)]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + # Stop parsing + pass + + def processComment(self, token): + # This is needed because data is to be appended to the <html> element + # here and not to whatever is currently open. + self.tree.insertComment(token, self.tree.openElements[0]) + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-after-body") + self.parser.phase = self.parser.phases["inBody"] + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-after-body", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + def endTagHtml(self, name): + if self.parser.innerHTML: + self.parser.parseError("unexpected-end-tag-after-body-innerhtml") + else: + self.parser.phase = self.parser.phases["afterAfterBody"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-after-body", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + class InFramesetPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-frameset + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("frameset", self.startTagFrameset), + ("frame", self.startTagFrame), + ("noframes", self.startTagNoframes) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("frameset", self.endTagFrameset) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-frameset") + else: + assert self.parser.innerHTML + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-in-frameset") + + def startTagFrameset(self, token): + self.tree.insertElement(token) + + def startTagFrame(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + + def startTagNoframes(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-in-frameset", + {"name": token["name"]}) + + def endTagFrameset(self, token): + if self.tree.openElements[-1].name == "html": + # innerHTML case + self.parser.parseError("unexpected-frameset-in-frameset-innerhtml") + else: + self.tree.openElements.pop() + if (not self.parser.innerHTML and + self.tree.openElements[-1].name != "frameset"): + # If we're not in innerHTML mode and the current node is not a + # "frameset" element (anymore) then switch. + self.parser.phase = self.parser.phases["afterFrameset"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-in-frameset", + {"name": token["name"]}) + + class AfterFramesetPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#after3 + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("noframes", self.startTagNoframes) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("html", self.endTagHtml) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + # Stop parsing + pass + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-after-frameset") + + def startTagNoframes(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-after-frameset", + {"name": token["name"]}) + + def endTagHtml(self, token): + self.parser.phase = self.parser.phases["afterAfterFrameset"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-after-frameset", + {"name": token["name"]}) + + class AfterAfterBodyPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml) + ]) + self.startTagHandler.default = self.startTagOther + + def processEOF(self): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + return self.parser.phases["inBody"].processSpaceCharacters(token) + + def processCharacters(self, token): + self.parser.parseError("expected-eof-but-got-char") + self.parser.phase = self.parser.phases["inBody"] + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("expected-eof-but-got-start-tag", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + def processEndTag(self, token): + self.parser.parseError("expected-eof-but-got-end-tag", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + class AfterAfterFramesetPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("noframes", self.startTagNoFrames) + ]) + self.startTagHandler.default = self.startTagOther + + def processEOF(self): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + return self.parser.phases["inBody"].processSpaceCharacters(token) + + def processCharacters(self, token): + self.parser.parseError("expected-eof-but-got-char") + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagNoFrames(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("expected-eof-but-got-start-tag", + {"name": token["name"]}) + + def processEndTag(self, token): + self.parser.parseError("expected-eof-but-got-end-tag", + {"name": token["name"]}) + # pylint:enable=unused-argument + + return { + "initial": InitialPhase, + "beforeHtml": BeforeHtmlPhase, + "beforeHead": BeforeHeadPhase, + "inHead": InHeadPhase, + "inHeadNoscript": InHeadNoscriptPhase, + "afterHead": AfterHeadPhase, + "inBody": InBodyPhase, + "text": TextPhase, + "inTable": InTablePhase, + "inTableText": InTableTextPhase, + "inCaption": InCaptionPhase, + "inColumnGroup": InColumnGroupPhase, + "inTableBody": InTableBodyPhase, + "inRow": InRowPhase, + "inCell": InCellPhase, + "inSelect": InSelectPhase, + "inSelectInTable": InSelectInTablePhase, + "inForeignContent": InForeignContentPhase, + "afterBody": AfterBodyPhase, + "inFrameset": InFramesetPhase, + "afterFrameset": AfterFramesetPhase, + "afterAfterBody": AfterAfterBodyPhase, + "afterAfterFrameset": AfterAfterFramesetPhase, + # XXX after after frameset + } + + +def adjust_attributes(token, replacements): + needs_adjustment = viewkeys(token['data']) & viewkeys(replacements) + if needs_adjustment: + token['data'] = OrderedDict((replacements.get(k, k), v) + for k, v in token['data'].items()) + + +def impliedTagToken(name, type="EndTag", attributes=None, + selfClosing=False): + if attributes is None: + attributes = {} + return {"type": tokenTypes[type], "name": name, "data": attributes, + "selfClosing": selfClosing} + + +class ParseError(Exception): + """Error in parsed document""" + pass diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/serializer.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/serializer.py new file mode 100644 index 0000000..53f4d44 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/serializer.py @@ -0,0 +1,409 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +import re + +from codecs import register_error, xmlcharrefreplace_errors + +from .constants import voidElements, booleanAttributes, spaceCharacters +from .constants import rcdataElements, entities, xmlEntities +from . import treewalkers, _utils +from xml.sax.saxutils import escape + +_quoteAttributeSpecChars = "".join(spaceCharacters) + "\"'=<>`" +_quoteAttributeSpec = re.compile("[" + _quoteAttributeSpecChars + "]") +_quoteAttributeLegacy = re.compile("[" + _quoteAttributeSpecChars + + "\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n" + "\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15" + "\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" + "\x20\x2f\x60\xa0\u1680\u180e\u180f\u2000" + "\u2001\u2002\u2003\u2004\u2005\u2006\u2007" + "\u2008\u2009\u200a\u2028\u2029\u202f\u205f" + "\u3000]") + + +_encode_entity_map = {} +_is_ucs4 = len("\U0010FFFF") == 1 +for k, v in list(entities.items()): + # skip multi-character entities + if ((_is_ucs4 and len(v) > 1) or + (not _is_ucs4 and len(v) > 2)): + continue + if v != "&": + if len(v) == 2: + v = _utils.surrogatePairToCodepoint(v) + else: + v = ord(v) + if v not in _encode_entity_map or k.islower(): + # prefer < over < and similarly for &, >, etc. + _encode_entity_map[v] = k + + +def htmlentityreplace_errors(exc): + if isinstance(exc, (UnicodeEncodeError, UnicodeTranslateError)): + res = [] + codepoints = [] + skip = False + for i, c in enumerate(exc.object[exc.start:exc.end]): + if skip: + skip = False + continue + index = i + exc.start + if _utils.isSurrogatePair(exc.object[index:min([exc.end, index + 2])]): + codepoint = _utils.surrogatePairToCodepoint(exc.object[index:index + 2]) + skip = True + else: + codepoint = ord(c) + codepoints.append(codepoint) + for cp in codepoints: + e = _encode_entity_map.get(cp) + if e: + res.append("&") + res.append(e) + if not e.endswith(";"): + res.append(";") + else: + res.append("&#x%s;" % (hex(cp)[2:])) + return ("".join(res), exc.end) + else: + return xmlcharrefreplace_errors(exc) + + +register_error("htmlentityreplace", htmlentityreplace_errors) + + +def serialize(input, tree="etree", encoding=None, **serializer_opts): + """Serializes the input token stream using the specified treewalker + + :arg input: the token stream to serialize + + :arg tree: the treewalker to use + + :arg encoding: the encoding to use + + :arg serializer_opts: any options to pass to the + :py:class:`html5lib.serializer.HTMLSerializer` that gets created + + :returns: the tree serialized as a string + + Example: + + >>> from html5lib.html5parser import parse + >>> from html5lib.serializer import serialize + >>> token_stream = parse('<html><body><p>Hi!</p></body></html>') + >>> serialize(token_stream, omit_optional_tags=False) + '<html><head></head><body><p>Hi!</p></body></html>' + + """ + # XXX: Should we cache this? + walker = treewalkers.getTreeWalker(tree) + s = HTMLSerializer(**serializer_opts) + return s.render(walker(input), encoding) + + +class HTMLSerializer(object): + + # attribute quoting options + quote_attr_values = "legacy" # be secure by default + quote_char = '"' + use_best_quote_char = True + + # tag syntax options + omit_optional_tags = True + minimize_boolean_attributes = True + use_trailing_solidus = False + space_before_trailing_solidus = True + + # escaping options + escape_lt_in_attrs = False + escape_rcdata = False + resolve_entities = True + + # miscellaneous options + alphabetical_attributes = False + inject_meta_charset = True + strip_whitespace = False + sanitize = False + + options = ("quote_attr_values", "quote_char", "use_best_quote_char", + "omit_optional_tags", "minimize_boolean_attributes", + "use_trailing_solidus", "space_before_trailing_solidus", + "escape_lt_in_attrs", "escape_rcdata", "resolve_entities", + "alphabetical_attributes", "inject_meta_charset", + "strip_whitespace", "sanitize") + + def __init__(self, **kwargs): + """Initialize HTMLSerializer + + :arg inject_meta_charset: Whether or not to inject the meta charset. + + Defaults to ``True``. + + :arg quote_attr_values: Whether to quote attribute values that don't + require quoting per legacy browser behavior (``"legacy"``), when + required by the standard (``"spec"``), or always (``"always"``). + + Defaults to ``"legacy"``. + + :arg quote_char: Use given quote character for attribute quoting. + + Defaults to ``"`` which will use double quotes unless attribute + value contains a double quote, in which case single quotes are + used. + + :arg escape_lt_in_attrs: Whether or not to escape ``<`` in attribute + values. + + Defaults to ``False``. + + :arg escape_rcdata: Whether to escape characters that need to be + escaped within normal elements within rcdata elements such as + style. + + Defaults to ``False``. + + :arg resolve_entities: Whether to resolve named character entities that + appear in the source tree. The XML predefined entities < > + & " ' are unaffected by this setting. + + Defaults to ``True``. + + :arg strip_whitespace: Whether to remove semantically meaningless + whitespace. (This compresses all whitespace to a single space + except within ``pre``.) + + Defaults to ``False``. + + :arg minimize_boolean_attributes: Shortens boolean attributes to give + just the attribute value, for example:: + + <input disabled="disabled"> + + becomes:: + + <input disabled> + + Defaults to ``True``. + + :arg use_trailing_solidus: Includes a close-tag slash at the end of the + start tag of void elements (empty elements whose end tag is + forbidden). E.g. ``<hr/>``. + + Defaults to ``False``. + + :arg space_before_trailing_solidus: Places a space immediately before + the closing slash in a tag using a trailing solidus. E.g. + ``<hr />``. Requires ``use_trailing_solidus=True``. + + Defaults to ``True``. + + :arg sanitize: Strip all unsafe or unknown constructs from output. + See :py:class:`html5lib.filters.sanitizer.Filter`. + + Defaults to ``False``. + + :arg omit_optional_tags: Omit start/end tags that are optional. + + Defaults to ``True``. + + :arg alphabetical_attributes: Reorder attributes to be in alphabetical order. + + Defaults to ``False``. + + """ + unexpected_args = frozenset(kwargs) - frozenset(self.options) + if len(unexpected_args) > 0: + raise TypeError("__init__() got an unexpected keyword argument '%s'" % next(iter(unexpected_args))) + if 'quote_char' in kwargs: + self.use_best_quote_char = False + for attr in self.options: + setattr(self, attr, kwargs.get(attr, getattr(self, attr))) + self.errors = [] + self.strict = False + + def encode(self, string): + assert(isinstance(string, text_type)) + if self.encoding: + return string.encode(self.encoding, "htmlentityreplace") + else: + return string + + def encodeStrict(self, string): + assert(isinstance(string, text_type)) + if self.encoding: + return string.encode(self.encoding, "strict") + else: + return string + + def serialize(self, treewalker, encoding=None): + # pylint:disable=too-many-nested-blocks + self.encoding = encoding + in_cdata = False + self.errors = [] + + if encoding and self.inject_meta_charset: + from .filters.inject_meta_charset import Filter + treewalker = Filter(treewalker, encoding) + # Alphabetical attributes is here under the assumption that none of + # the later filters add or change order of attributes; it needs to be + # before the sanitizer so escaped elements come out correctly + if self.alphabetical_attributes: + from .filters.alphabeticalattributes import Filter + treewalker = Filter(treewalker) + # WhitespaceFilter should be used before OptionalTagFilter + # for maximum efficiently of this latter filter + if self.strip_whitespace: + from .filters.whitespace import Filter + treewalker = Filter(treewalker) + if self.sanitize: + from .filters.sanitizer import Filter + treewalker = Filter(treewalker) + if self.omit_optional_tags: + from .filters.optionaltags import Filter + treewalker = Filter(treewalker) + + for token in treewalker: + type = token["type"] + if type == "Doctype": + doctype = "<!DOCTYPE %s" % token["name"] + + if token["publicId"]: + doctype += ' PUBLIC "%s"' % token["publicId"] + elif token["systemId"]: + doctype += " SYSTEM" + if token["systemId"]: + if token["systemId"].find('"') >= 0: + if token["systemId"].find("'") >= 0: + self.serializeError("System identifer contains both single and double quote characters") + quote_char = "'" + else: + quote_char = '"' + doctype += " %s%s%s" % (quote_char, token["systemId"], quote_char) + + doctype += ">" + yield self.encodeStrict(doctype) + + elif type in ("Characters", "SpaceCharacters"): + if type == "SpaceCharacters" or in_cdata: + if in_cdata and token["data"].find("</") >= 0: + self.serializeError("Unexpected </ in CDATA") + yield self.encode(token["data"]) + else: + yield self.encode(escape(token["data"])) + + elif type in ("StartTag", "EmptyTag"): + name = token["name"] + yield self.encodeStrict("<%s" % name) + if name in rcdataElements and not self.escape_rcdata: + in_cdata = True + elif in_cdata: + self.serializeError("Unexpected child element of a CDATA element") + for (_, attr_name), attr_value in token["data"].items(): + # TODO: Add namespace support here + k = attr_name + v = attr_value + yield self.encodeStrict(' ') + + yield self.encodeStrict(k) + if not self.minimize_boolean_attributes or \ + (k not in booleanAttributes.get(name, tuple()) and + k not in booleanAttributes.get("", tuple())): + yield self.encodeStrict("=") + if self.quote_attr_values == "always" or len(v) == 0: + quote_attr = True + elif self.quote_attr_values == "spec": + quote_attr = _quoteAttributeSpec.search(v) is not None + elif self.quote_attr_values == "legacy": + quote_attr = _quoteAttributeLegacy.search(v) is not None + else: + raise ValueError("quote_attr_values must be one of: " + "'always', 'spec', or 'legacy'") + v = v.replace("&", "&") + if self.escape_lt_in_attrs: + v = v.replace("<", "<") + if quote_attr: + quote_char = self.quote_char + if self.use_best_quote_char: + if "'" in v and '"' not in v: + quote_char = '"' + elif '"' in v and "'" not in v: + quote_char = "'" + if quote_char == "'": + v = v.replace("'", "'") + else: + v = v.replace('"', """) + yield self.encodeStrict(quote_char) + yield self.encode(v) + yield self.encodeStrict(quote_char) + else: + yield self.encode(v) + if name in voidElements and self.use_trailing_solidus: + if self.space_before_trailing_solidus: + yield self.encodeStrict(" /") + else: + yield self.encodeStrict("/") + yield self.encode(">") + + elif type == "EndTag": + name = token["name"] + if name in rcdataElements: + in_cdata = False + elif in_cdata: + self.serializeError("Unexpected child element of a CDATA element") + yield self.encodeStrict("</%s>" % name) + + elif type == "Comment": + data = token["data"] + if data.find("--") >= 0: + self.serializeError("Comment contains --") + yield self.encodeStrict("<!--%s-->" % token["data"]) + + elif type == "Entity": + name = token["name"] + key = name + ";" + if key not in entities: + self.serializeError("Entity %s not recognized" % name) + if self.resolve_entities and key not in xmlEntities: + data = entities[key] + else: + data = "&%s;" % name + yield self.encodeStrict(data) + + else: + self.serializeError(token["data"]) + + def render(self, treewalker, encoding=None): + """Serializes the stream from the treewalker into a string + + :arg treewalker: the treewalker to serialize + + :arg encoding: the string encoding to use + + :returns: the serialized tree + + Example: + + >>> from html5lib import parse, getTreeWalker + >>> from html5lib.serializer import HTMLSerializer + >>> token_stream = parse('<html><body>Hi!</body></html>') + >>> walker = getTreeWalker('etree') + >>> serializer = HTMLSerializer(omit_optional_tags=False) + >>> serializer.render(walker(token_stream)) + '<html><head></head><body>Hi!</body></html>' + + """ + if encoding: + return b"".join(list(self.serialize(treewalker, encoding))) + else: + return "".join(list(self.serialize(treewalker))) + + def serializeError(self, data="XXX ERROR MESSAGE NEEDED"): + # XXX The idea is to make data mandatory. + self.errors.append(data) + if self.strict: + raise SerializeError + + +class SerializeError(Exception): + """Error in serialized tree""" + pass diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py new file mode 100644 index 0000000..7ef5959 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py @@ -0,0 +1,30 @@ +"""Tree adapters let you convert from one tree structure to another + +Example: + +.. code-block:: python + + from pip._vendor import html5lib + from pip._vendor.html5lib.treeadapters import genshi + + doc = '<html><body>Hi!</body></html>' + treebuilder = html5lib.getTreeBuilder('etree') + parser = html5lib.HTMLParser(tree=treebuilder) + tree = parser.parse(doc) + TreeWalker = html5lib.getTreeWalker('etree') + + genshi_tree = genshi.to_genshi(TreeWalker(tree)) + +""" +from __future__ import absolute_import, division, unicode_literals + +from . import sax + +__all__ = ["sax"] + +try: + from . import genshi # noqa +except ImportError: + pass +else: + __all__.append("genshi") diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a9c6accb3a50014aa39ece32dc6411cdd30efa8 GIT binary patch literal 944 zcmZuvPixyS6qlXUN!>pSqaQ#!B|g+%Y0Ds_Wef@(Y-O-OH!~(=OG&iImXYKv>1Bs~ zk=@2V$*w#5IvDgT>@>+v|G{MR{Pf=Y{oa$_JKWjv|9t!T;kygKZ*XsI8U4B0>Z1_^ z#DF-&<xb|tZq|xhSvzh!fV4=PZ)9HV8GU2w#GO^o*gRwF#$5+of_$$H=;qv)7Y?xB zdysFx1GMwWC!Md3L3Q7PU=#mx02oV3Att!cR4T}+hAUCRROAaPHJnJ1L6K9aZJ5%s zOm!*EQ9zsvJ)_e1&z3kVI34<a7#bj<`w186d^m)~O3y^@`w%un1uH_dpg9o|vaAp$ z!AxiTn6u=6G2x9fwApWKTqCD6S2I?V6OqCb*dN*W(@`SG>hzpF8AY`=ifVJ;X0SX- z$vC0X0B-50RNH5G(Rc=ZYUBEWMHE=7hr#FL*RS5x)`1N>xyM-}?Aeevz_9)eOo6p; zY<!oP&mS_b(>IR0>^6OKNwnr{PN5d4(FS*XbuB^Q``2c0K+vil;Y0~uYKofos=9<N zm|`NYdS%XRpAcuJ>6oi)GY24Ws+Ph_={367q>vqRya=|c4npP@2vt5plhO_WLeh*c zkS#0PMpU2%+fdB8aa(M)^|J2tnUq3S9xe*g{~ti^T9g%kzeI&(3#@6hz%rT$+Z`39 z^GNf9NwQp!BlQd&r^#x5a5%a8oTX3An�sGV`?0a-~hS{iBRt5w%p-Snu_q)!nxf t7THI<8KMXwmNSh|Sgfk<C=;aQ^z^YQNA-+oJA3Z7>$$Geb9Noi{Rey>AnpJF literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..419290462e8bb540c681f0f6f1ad8a39c6952745 GIT binary patch literal 1688 zcmcIk&2Jk;6rY*>@OtBX)C~a_id@tRR%+vxrXWR8M3wkZsda%^Ev#Buo1L+<@qT4y z>?XlJrGG#;aOcXI{tx^QBW_4Y`3E@k0&jMmG!h3+j5W`1-h1<VpR@Pp=iNVl{_VxD zHbQ@(ON#*i6>RYs2t^dfD8W8Xh))v3H?WqG*i0<nN^IXQ&IX(-ekE~yC#m|?#P!`| z&YuIFNv+q&uTgskd6hFjM4q7*gI$ruBguMEl4o2hheqQ_L|LkqMrjmgl=b3BG9JXj zBg*=w6C_Mo52fV7vy`>defVux8ST!tGP~{Xx~j7E^vRQU2bk@rTix%!ZiiUAf(6+X zJA{AXgLHtV_!J+0F+tnt6u-PZB@;q%15J&IL6?U%|9pb?5y;F2I>8vF*Cv=hmY7=m zWP(pHeZOx!L%6_!8y~=pH(>2H5a)ER<bc*1s83eV)J&c7G&Q9`=jp=h8TP(;0uh`5 z;?$Csv?t~Xo>+ZCKP>S9yE-KN4P7iETO5*8#Q&Ok`u#sVRZ2Yiafx+M1GFVTz`QPX zJdhi`aY=UtJk?~ij1*|Sp`*MCIT-Zjx!pnSIhsK2__IsZ__Wj({r&9tr>!g<GcKD! zQ*y?dG6QbFQn42m0@rQAS`YZ3`6`HqjITH49+-h`dDb^ZqPVC97g{Y3XV{UP!Eh!= zJQeHO1I&udcr)vtyGvn+L}{o@d6YBdZtVp;2w|**THMKlkX;g(G?0NpoijZ+%Gr?t zm)&5XoOY7SBh6J)7($`19os+L64P5knObx)Y6jf2VDIQrTLUsc6ZG=-3o^x1BB68? zLD})J%0HnnN-HR}L1ySNn~*;FksO%tNKCFH=$!lDSK#Dfu7Tm@kkz}&4B#CoYaGNQ z_6y<-(7c_tavqHX$y(!pxB6L3A<I@cY{~dufA?@q*Tk2-2jT9~@ZSCY@v9`f3u}<J zx~)9Q??kDPK^)&%OV}|Lhe8XB-5ax%X1uj0llVa#?Y4BM0vhDHh^?}*tNGDecO#C3 z46`KPybj?A{SC44@pYN?W=0!v7Q$=ZTzzM$>~>0ZWh+}*lCV_5>&?QVRZc$Ijic}p zRgO3kk|mF*NBBIT@&zDgf5YN8fb)z_@n0SYuWOU5nrQ96P5w`@=PEnMbEp`vf^%i= zXHm-a2S{1)F-rum=$LdTxuc1z$s7>RR(3i6FskfODobWVmhzf5cn^rObk9Z6>ylj4 z(&|NhHL}<Mf*cbsU<ZCn*u-^g63wp^w2qg7H;G$HNFBI3XclnYFo})12lqSPymEWJ z{s`U{>-D&9CD)_PO(6c<te;`VS(%DXu*|GTN~iuVvjXx`*m_ub5xcXIWONj>O+D^H LgDjIJ{E_hwG}W93 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc10fe0139cdf03a270c2acd3fd971471a1096ef GIT binary patch literal 1506 zcmah}NpB-X6s{`w<~2?fgu<yM7U4t29?gOjjUu8<MsOfP@}QtrkX7y~I~`Xqt|~iD z<XkX6fS-W4A^rz&;s?|T2?=R9apJ&<SM87lX%N+_SFhju-df9}X0!I&H$R^K;UV-Z zx;Gr)KZL2yfH1_cKq-!JN+Ob0q6)S$BAnEXT;MCr5nk#?ei}ppMhS|li}$#HUR$B( z=!>^bD^WdaL``02?xZUBd6QRp{TZ6>pCINj|0@)=nA=C4;1xteor>9@LzRn}=7S_H za;Z(gl6j(%JTvWCmc%*Z1CeMhsZbqk+6P+8WC(b5-2XTBR`5c4Kw=QE{W<dP@j z><(piX4!wJj$><UhY!<*c?eUzj}cnpbF@MjEkcdYNm<+WDY+)s70^_cWLa4ejHX*B zXz}yXR{q1avve5VLD%lmWn@C+N7LT42mHpwlizBqb$5_<SLE6QA0GUBI|!)1gGOY% zF1;1>8*Ch~{}WLD>riE6>p1|_PydT*L;PO=6@V|uV1*%XYh4HH-={s+P(58`%@zI< zPkT_$>ng4-iM9J0Pn{Fno4V}{Yr#HlUVVQ^g$VlxpYMuf!oxVvG|zN+Ml&Y342M*4 z7Uo%~CFd7ZOhC3?YPAr?9+l%8!Ct7(_<fwt!<hm}UIK2lRsdn<T<S2<_uSmX+_Tx- zCa`w0Mj1z67ToyH^SES!zNS*Yq+=5trG>t<oWrQ5rkc@|tAfVdIF>cuQO2ygc6df5 zjp0Blv(dMJdjkJ3PgAJ=#nskl*(A#^pzM6YfkN2h4v}>@V6p)O_)W`iS-xSK$|eG7 z&8)d;6_SsV#UQ0ckz`}z!Uaf`*(y<=mby>YDrt|c41kzcsXY?hx;XBe2G7{tUoF1N zyLF%xG!O3Bk(9YKZ9x9ZtEq$JpKLn5@zy(L{F@FNZ=IlQ*}!gDqpX%Zh5M<#L-K9- z`|GM($Yf46@6M_0j&i}EZQXd%)#Bl3xR|rY>Vv_Pcz8K^_-J%>k;Xk3<E;C#TO`G9 zl0ij6>^@HU6;lgkh2<Q~A-!C7&vYuDh-BEcXNxjg*j?!=x_D4r8c*i~V4IMKdI|&u z0p7xGQo{j!PDwqGc<@<G<CeC8Bcx3Ljpe&w+1W6)!C*AgGsy=7X<rRlvBbWe(dHr* z4{T6aC8WV+xhbX!XA}y^w37CHDK|;J0i5yXRLr=Np*63HJf`9p&RE&aGGN)gd*mH! c6+BCGHWPdw-Y2AN=eJ1%(sb}PB;2U{4Xp{Qv;Y7A literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py new file mode 100644 index 0000000..61d5fb6 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import, division, unicode_literals + +from genshi.core import QName, Attrs +from genshi.core import START, END, TEXT, COMMENT, DOCTYPE + + +def to_genshi(walker): + """Convert a tree to a genshi tree + + :arg walker: the treewalker to use to walk the tree to convert it + + :returns: generator of genshi nodes + + """ + text = [] + for token in walker: + type = token["type"] + if type in ("Characters", "SpaceCharacters"): + text.append(token["data"]) + elif text: + yield TEXT, "".join(text), (None, -1, -1) + text = [] + + if type in ("StartTag", "EmptyTag"): + if token["namespace"]: + name = "{%s}%s" % (token["namespace"], token["name"]) + else: + name = token["name"] + attrs = Attrs([(QName("{%s}%s" % attr if attr[0] is not None else attr[1]), value) + for attr, value in token["data"].items()]) + yield (START, (QName(name), attrs), (None, -1, -1)) + if type == "EmptyTag": + type = "EndTag" + + if type == "EndTag": + if token["namespace"]: + name = "{%s}%s" % (token["namespace"], token["name"]) + else: + name = token["name"] + + yield END, QName(name), (None, -1, -1) + + elif type == "Comment": + yield COMMENT, token["data"], (None, -1, -1) + + elif type == "Doctype": + yield DOCTYPE, (token["name"], token["publicId"], + token["systemId"]), (None, -1, -1) + + else: + pass # FIXME: What to do? + + if text: + yield TEXT, "".join(text), (None, -1, -1) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/sax.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/sax.py new file mode 100644 index 0000000..f4ccea5 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/sax.py @@ -0,0 +1,50 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.sax.xmlreader import AttributesNSImpl + +from ..constants import adjustForeignAttributes, unadjustForeignAttributes + +prefix_mapping = {} +for prefix, localName, namespace in adjustForeignAttributes.values(): + if prefix is not None: + prefix_mapping[prefix] = namespace + + +def to_sax(walker, handler): + """Call SAX-like content handler based on treewalker walker + + :arg walker: the treewalker to use to walk the tree to convert it + + :arg handler: SAX handler to use + + """ + handler.startDocument() + for prefix, namespace in prefix_mapping.items(): + handler.startPrefixMapping(prefix, namespace) + + for token in walker: + type = token["type"] + if type == "Doctype": + continue + elif type in ("StartTag", "EmptyTag"): + attrs = AttributesNSImpl(token["data"], + unadjustForeignAttributes) + handler.startElementNS((token["namespace"], token["name"]), + token["name"], + attrs) + if type == "EmptyTag": + handler.endElementNS((token["namespace"], token["name"]), + token["name"]) + elif type == "EndTag": + handler.endElementNS((token["namespace"], token["name"]), + token["name"]) + elif type in ("Characters", "SpaceCharacters"): + handler.characters(token["data"]) + elif type == "Comment": + pass + else: + assert False, "Unknown token type" + + for prefix, namespace in prefix_mapping.items(): + handler.endPrefixMapping(prefix) + handler.endDocument() diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py new file mode 100644 index 0000000..d44447e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py @@ -0,0 +1,88 @@ +"""A collection of modules for building different kinds of trees from HTML +documents. + +To create a treebuilder for a new type of tree, you need to do +implement several things: + +1. A set of classes for various types of elements: Document, Doctype, Comment, + Element. These must implement the interface of ``base.treebuilders.Node`` + (although comment nodes have a different signature for their constructor, + see ``treebuilders.etree.Comment``) Textual content may also be implemented + as another node type, or not, as your tree implementation requires. + +2. A treebuilder object (called ``TreeBuilder`` by convention) that inherits + from ``treebuilders.base.TreeBuilder``. This has 4 required attributes: + + * ``documentClass`` - the class to use for the bottommost node of a document + * ``elementClass`` - the class to use for HTML Elements + * ``commentClass`` - the class to use for comments + * ``doctypeClass`` - the class to use for doctypes + + It also has one required method: + + * ``getDocument`` - Returns the root node of the complete document tree + +3. If you wish to run the unit tests, you must also create a ``testSerializer`` + method on your treebuilder which accepts a node and returns a string + containing Node and its children serialized according to the format used in + the unittests + +""" + +from __future__ import absolute_import, division, unicode_literals + +from .._utils import default_etree + +treeBuilderCache = {} + + +def getTreeBuilder(treeType, implementation=None, **kwargs): + """Get a TreeBuilder class for various types of trees with built-in support + + :arg treeType: the name of the tree type required (case-insensitive). Supported + values are: + + * "dom" - A generic builder for DOM implementations, defaulting to a + xml.dom.minidom based implementation. + * "etree" - A generic builder for tree implementations exposing an + ElementTree-like interface, defaulting to xml.etree.cElementTree if + available and xml.etree.ElementTree if not. + * "lxml" - A etree-based builder for lxml.etree, handling limitations + of lxml's implementation. + + :arg implementation: (Currently applies to the "etree" and "dom" tree + types). A module implementing the tree type e.g. xml.etree.ElementTree + or xml.etree.cElementTree. + + :arg kwargs: Any additional options to pass to the TreeBuilder when + creating it. + + Example: + + >>> from html5lib.treebuilders import getTreeBuilder + >>> builder = getTreeBuilder('etree') + + """ + + treeType = treeType.lower() + if treeType not in treeBuilderCache: + if treeType == "dom": + from . import dom + # Come up with a sane default (pref. from the stdlib) + if implementation is None: + from xml.dom import minidom + implementation = minidom + # NEVER cache here, caching is done in the dom submodule + return dom.getDomModule(implementation, **kwargs).TreeBuilder + elif treeType == "lxml": + from . import etree_lxml + treeBuilderCache[treeType] = etree_lxml.TreeBuilder + elif treeType == "etree": + from . import etree + if implementation is None: + implementation = default_etree + # NEVER cache here, caching is done in the etree submodule + return etree.getETreeModule(implementation, **kwargs).TreeBuilder + else: + raise ValueError("""Unrecognised treebuilder "%s" """ % treeType) + return treeBuilderCache.get(treeType) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5cb8a8f4749cdd51c052dbf40539a9fbe13688e7 GIT binary patch literal 3325 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71f9f71912a350379e69135a55b1dd2c31b201b0 GIT binary patch literal 11332 zcma)CTXP#ndYv190SI0sQIurM@~myyf>$DazbJ}IGHtH4WuaUWYn?FbMTY1BIV6CA zdIlni1#>aI$!7DiN$pdz4|z>hen5Ues*+!jhj~p^s{EWh`6W50doZ|&l0|8H1~c6~ z{oT*^^}IVjU-|EU`uCsz&qs#wU&h3ri|ac$;_uN2Lzr!&V{VxpYs>1`Teiu2R@><m zwhFkmh0`u}N?WClyXAJuTV>oUY*m7}pmbu2V$0%HPz}nWbjc8I%i1wd%ukF{o|Vy8 z_o|?mHPuVsFXcVvbdPL){j{1tozI>wv@Egs`@+`zPYkgn&U|Z#Gr_`%y|swnXT>@E zJ{K(E_Zj?N7U%K%yn23C6doG2mG3~mQM1!Ue>;xa{Um6Fon9o9)D_|5Fb<<`y43H6 z%}4}|c9;axZ^tz=EhoWY(nyYa!FN_RLEMabVRz@VcF+mBNt|9t{OxvduNwz4xsT!b zgG$%$1aZ%A2625Ob#{|ZJ1uValLYUwqIPQa+i5`!PTi=N?8vC!ON+R|Vm51qx}3us zQ>PuqiCo}iF%H^6Gil;F|Fdy*2S>b(CNQ>4VQg8#+_Hrw>~D=NM>wK@b3qhE3Fo44 zMH%OkxFF_4^;>hx74u>NcgkW>Ea6-cXT({Y=fpX&jB{0-7b`f=iwYQdF?H%7a&YBA z(33$-4tRdo1IIdE*!7a#z)NHhG|4Ug@yuf#M|=&<&>R{KC?Z-@wN_~0+TLO7sJ0+X zyvZ6oSeJpH1bBhRcUCH1_IJ~lJ07`v)7#_=ef`Vx<2Y)D7$UrbFxgeB=}wKT*NUmb zk!i8#ORPREJoelDAg%aGB11?gh|@}QH*5>OGER$)R@>i+YgX!j`z^T)68_ncFXHt5 zFV}i9e2mwvJ@(~VD{6~C#%s;}wWR%aYy0rAcrX62@qTmrX#eeZTZ4m6^DX@Cbk{c5 zdSUNI*o_mv-M;Z&Cm4wMFy>8lG#&?C5y>?w%=_(ddyNd;?qf-ue%p_O)!tF+HX30! zOd5?#<ZKm<Q7T&MpIx*D^IZPws87@6bNo>hR2e0Xo463>9y|b5WoYb~d)A5ZDeU>g zJT`}>ye=HvwTEWQS}`8N7x0(5!mnDf{=MntGjrAgj)yqn%V;Rdua|#r9h=9Npx7<W z@^{uF2V>1a>1zCkuUw5^QLKbvTB~m<=E@a}RX26RslKn=q7^iwPVe?A=O-CObD-1$ zM8ZHCjn!N2s0pjRjf+v|LFv}j*t;6v9yqwTU2{@rFABTz0>-BWDs8M@TC?N}yfr`8 zf`^HmSw&jP-gJXYsGu>-inU}q=7Ke-X8cx5$(cg7=i1K^)c8GvEUa1eY*D6Of~l4; z`%Z{i!qOUz4=`HMZJ4=m^^+-E;~SN5>G>1m8`zk#r9aUQ%A+~JPCVaJO72B1WhKqN zq&29=vv!6NH*-_+k_dKAUpMYnhod}KkCJ<xo_30X_)N-3j=1XZrL%<1`Mn<We4VED zaZX!tu%s9{@vz>cYVnWfr_kqrf(IFi!cTmXNY_2`Nt5(l_j*wr(#yh6YzM7K!iDSx zxp#qC%7lzjywb#eqPs<s^wY^<=_B5;+Z+0It7E1pAH}6;-l;{M!aLP%@*Qw#vLAS1 z%R7qt-hmIH<ipgP6<OnDYmtpSBhNmTwgE$U+9YA(`7K1aT&CkiLz41!aJgn{dvLhy zv^u%ISvgkp!%Z;zE=Fn<tqc~G7{||^ONbZ7LR7qeww_)e2~P$szAck=E=PI+%1A3Z zCyZCU2YwhMqWp|bUnwa$olg*ho8V4v8~I!m`J@hwS*BwVCV#e#sBYPNbkFg!W(2HA z*8(2DW=1md4e&ZGWfRWGM81iK_a}sLhU{6Ll;U&wjNJ!8Cwd%cJ7~$MqcldX8_r^+ z{?EmhX=0_C_Y~r^8&<^4(3H;ULF@Dvf1J}c@)r{ibJFN8c&xMcYiJHH()oUBe7$gN z4b447q!ZIL9=TtsSVd5xT;>1XC(#JaKS(YG*9{K7R7heqSC-A)F!u1j8w3I_CZ@;m zVa5pKa1*=~QTL6+ixcH~=%%3QN<lrv@JVkp<;5a+>1G12a5QF~R>09JrnOMbrYYfi zpapPLxd4-BJWCzU`XYEFiP1*pU(Sh33wjiBkCqJMa=L^Fq=;8yfl~Om8yC?S<*K=0 z4$dpho9#6fA7S&SMy%gF2$H_+!W!dUkPsbs0NzKZX`L6Y2CL{t`o_R72FlAtLdd5a z<2b;30DHQ3H}W(U9{jtaQwt*>og3fjF}mDrBbJcTF3D%WH=MzOB0YcfTr_WFG$&aI zpxaSY?Lt9vxiJbsX|8)M<>e#vk_T{W&%53VW?PTC2?BnSFWAmp_V`)Ntk)KZGs(P0 zBds(Vok;ZCyskDHkNSQ)djeo2q9%~aOPEg5)Z|q*)Ft_2HuOl6xJkan=503buo)|q zx}sLeb7+XrVnRU|_{v>&%dYLZm8x5HU3cCssy<CT&i}~uJ2({f94A7;Lh52Ov&9*y z5G=fyUcB2(!pFfzBs<WDiDWMK9S&yVp?pUR7Xm1DXeP$KEq`|S`H*?DA)H^?m*`JE zIJSp2o>}tEFBOg+0yCdj^7haY)`td00%7CnW%wU!Xw&O_X*|08m66zcK-lcdOdM-N z)<=8zPBk{K{tth(LR!4<%l$y66{<u08JV9Jwbzqp&@U}&$W(JQj8yTV60qNT)JL9E zLhi_fb%NuH*|#zHmpBx&4KmwY#$lONw60k(fwNzJ8oyTcOQ(W+j(4dCaI?nH+5>Ci zCAwGbcK1yD_V`;^Alj~PY$CxbQ=2yXz>o@`kDO3}6u+IS(>t@PzlC@Fnyc4vylOfY zkHM=?UGbQI^;$u`i?Q-OHt(|`GbHDnc+XfbKg5Fpj+mMO=FCgpnbJav><*6jKhcb} zkm)$I&q5k*AqBUPep^VqwN{n|l5=QhMf_Nlgo~7XPLxFjcd9ByXX>p}^o1-%U(8bU zC2?IP>E_m%EJ;6$wEiMSo)eeE3pg(a=Yw;>@`<&zB3=}iap!_~NnFACqPQVm79QSq zN&HB>f;%sWRq?8L4R>A?SH<hNb6LD0uHpQWsEIdmzM{mnmd<S=lzpNzQvVEe^%Eqe zD!yfDs)yo=RyUtGTZfr95%!vW>fm}CnYwpF$5(ZYK-$L?z~buWc7!TPrxO9dDfb5y z=jWr9n|ssC^!b@{eZG1B3vX1A$;Kgz{J}M3ed25g*3A;oGhdbUi8ZbD+>_88a+A1% zAIPh#s_<cSp$RO8z$=(1$ZWJR3_7~(0g5NsJdV^l-osQ>X^9k$2)yYX>;?=5jAI0{ zgeRkpp5jHuv}~2k76zAhlcaZZZSCOTVD;eL)kyBFz5VgWAFmy<{s35zE{UM!_uEN* zG*wz)<tG`XcjxnWOfF`^f|Q?OX!sW#F%wgx2tQ-Nvn)@L_++($UNGk!6Mt16G7@kL zd}CDsg(KBEileMg6xFkm@}^dOqvod72#My1N6KW=i~dsrKsvV@_~J{{2#_G9bI`}m z=*ObQ&l|wOo2>Yy^Hb`KLSm-f$e~zFm}S5Q?)@tcU8{jxb?u_bdd=X>Boh>CbB9{O zfIJTU4nGp;k3hU&#EIWYP^C#MM4HzUc$iCg)<V5S-E~eZJTH7>CdDD1pbq047Y;v9 zO5l-uVj^nYJT4Ax`HNw32zM-hA#Av3yJ|=|Ebf)nJ*n;$)Ng0Mc-N3W6{y}k`sr7Q zeerKO`zUJN#o8pD@a9IXl9qrXh_uoQN~^4Mb(?`?bx4-cpz294pDx^uSxA6`P?=b| z$c$|ysQZ2|b!G4vHLpO(&pDRwsFiePT11k*6CkXi^cEsXPRqd|gjz?eNUM|cq{Xm{ zNs?2OiiOM`?sXpmTn7J!7byH-I2A;~3S!`bRYi#hF~wAc9%$|0g-LNuPmqH=(n=V- z&Kds$4Y-aVMQ%YlxJJ#~yl9}xhU=kuNnwP<LRfrn2%oTL?-%7q?0xvb(87INcC-5> zT$utr<(4QMo4^~G>7%Kc9^L%PIDEkSz#da?*mF({XpXU05YV4J$bYYd!xhf&9n}1s zA?tmZ@s^>lMDY?)jRabekU0@bsV=d}U?`Z9x(`_^+4Of<S)+?or7RuEm3xvk_Psf3 zYGrv3*QwnOy7CWrR|%GIFrC--mC0Y%0>5S#LP3OTRiHD&v_KGZgoK2kTi#(06{7Pv zoxX}BDT3C?elvL*4oERBrb{u3MbohtAnda^1NvAFz>jM!SeE756=kIk#9y^5=rvfI z6#jF(C)bFnIB*^BC8z24kIh5kLPNezTZW`xA3u3i&A1LIZfC6PMLos3%>7CqbIo$# zrDi+u<<n?);a7E%2CA3LL2Z(zXO7IH8gWkUm#7bi?{L)uI+vs3E5yACeakD*pR<60 zK+yPwEBKJJpbQ?TRv7%l`fkwNXB`F`37I{4!6AG>j0#V35TMq;L};Sqrrmd*@6b(a zAU_(<O$nh!0bV3tM}g;6?_LW#6#x=Jd>us}m0pI(qXHDm^2xIMD!0<QzM&L26M$A* zZUbZhRja(iV)CpQew2HMr-@>oqEN;A!ivpQ2MT8nZcGZ~2j`d)N**p>#|kMDBo|Cw zRB>MyJaEmlLlr-iNkh2`>3madwv5bA*`<QRbxbr>6(}UpKFs$H@6T9XRt$U)Mahek zN>()oE0Z*7Q)jn)@${CtMzPpU|E2sQydBQSs06Yt_$U&EENbYS*vE|c*tHlIm{TcY zoVpf>+v{()!{$Aay75sA;oKA0WvEU<IXNb+s6%#0nkZYj&!&wgEoDPyY0doAry3i2 zBv&UPOq<|8%)zB6NzQub@qNmUm?R@pH1=KC2(5|q!iG?(V&16uz`dC<rOFfME*1)@ z#CDC#u1@0Ik*X^C&Xcqm!DYm(YixXNEIVd^rxB9%%*DrmM`BdKV~#%-A2*mNCIwnZ z2vcCd5iQW6(|{=92%N#{2>6cO0Bbb5Sf*8m=IeKlfODmeHByBLvH&5-1|pE3;X18m zR-+*MWCW385v!4R(0hg%au@e*<npv!6tb#Muwlwvaxafj<1GrRH0225U}9#vgdIBq zo*Y7+jug{#4bX9Ky6gK~4~-k!KQB+})hT^*p-jabkE?+uA>Y7`69qyH-F0yVL;y6c ztDo^hY@Igs-f64f1x}8-%+26UM>{{0etJ|E&fRC1zPRlnHgf>|b|;Lx0W1(R5I3tw z^v>HpyuQEVhuu1=773P@p4AM>oREUqvcU)ErXJMQJ4OMJRiYUYf`v#>W?1+US?Hp( z0pJZ!Yt1n7$q_jtr?h(;GmNwwa2z2HQ2R=PQqK?@oG0ct0OflqIf1bN;TmpD=)41% z?lg*cS|YsKbK%Hf()<nBt*>bh09y1!gO!XM*v3>zUG|m2Sn)L;BgU##fYiVYE>}Ka zBiYa*WXy(8YV0Faxg$eX&tn${7`;v=F5$v}ms`m!g8+G&nWu>BbY}i3W&-J8=qOCl z>+M;Iy<d{Ak%fGM%mkSAgjtMDlnVUo%1;%7Rbi}KRY=wX`%p<kUlVLqPlz?(T5de) zTBw40nRF^h__VerC~YW?)^*e`D|euorXmA1NRk!lOE6QVqxVM|&h+EUY;#dpKk3t- z<ntZgReo4KpLWLbF`nKhpU>jLu!zwr4$E;>6t}?XE0gv=#c8#gJh(8N=05q4@B_ic zoCz*qRn>^!BFp40v`Fl7_TNJ2QS3L3F1Jp!0I1RGKD{_X5#2^%a7G)O-gM=z;cAvA zjIn=FGw};7M8{agNmU*`!o5-DQiZdp@`l~N&UFyJxq?W`B4rgEIt^rSV={NoG>jZ% zkj*IT0%qU?1@qWGyr$?Uge_!+-DN7<9)Jg6>y@FybnDTTujoJpY}}GxutkW*=to_S z=D`mpkltAr4TkS-Ma>GXGL#SP78SBMh<_5GJ_GOALXis<n`{Fj3tQI}e2qgOnC{Mm z<IQ#jQMOTk*HGuF!_(GS_`ydwDr9hk|Af<J87-5@0_axhn^tgVLbu6wd>7Fb!Qm+5 zDic5}y-KTkt$MplmGo0PXwRZvNny4rB38Rt>EXW>2+4t%92PxL_HfK)DE4&f@l12d z-3K+AKuaMF0wBfT3bd9u7s;}iJ28<yGm$otPQ9mP!U7wvGJRH1v8ox8T0-DRQmY+G zx;D9pCN+DhC3z&8Pp<qkKKpYvf59g2D*uu{zhQHN2Aunx*Yp-?83A$-Kro3E{JpXh zAZx`pL;P4G#D@}Hf%G}f02-?Fhs|~$UrQ)gGvgP2g$e$Oj3xPo@&?d<d+^GnKRA8< z+yXHCbbvBAKiYeuQiff`aJoW36r$v(AeA|Y43Jh8b$`p1DTHDTE=;c|?~^ZM3YoAz zNFgy7#u)}k7eph1$TTXs^u*#?(%(`08KelvetvXALp~*exA-Xgw8tGipM?sfVI!OD zccg)^%|J4S%y^cLQNLUnNe368l#%{y;**=dc^IHH)eZ;h^Aa!aZ<C?iz*IHu>}xrl zyCNHX)DI;;NICKl;o%zqnI_7#r+sFiu-CzENVFDVH<_QU0AH$i!V8Q`#`*r`GxpaP z_`-a}@*i_)7N-kd)7=!X#q{d`%d^`lAAli}A0lY<(c@Kz&9B+8A}lx9Y_Vyw3E1qg z*<%y2dBkRyO`pvnn$+z{)azt&Bvm+JI96d(?>5o{Nm`5iYc{`O^S5lq2Bof4Vfs@% z_<I~NSL?ct<Jj3h3%iZg%8I+{7Tg6KZUqPSA<GrZt+-2-MfZhD#dX}0<Q%ng+#zlC zQB}YWsibB|n+*d_x`?m)R<kerR^#wcVYIZY>QpFS#*&p@NexmZQe9>EmLqNY4t`aK zZ$r2Du>G(0KGmk5DrT#fpGH~g-qQQEx2d73uDJ}Sv0QNMig_98y#g?C7RN<rskwCV F{{i!p!UF&R literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..099a9b9ce5ca4cfd8f7f2b8410bce735215ed544 GIT binary patch literal 9278 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 OLe);Sz_9;TbN?S-u0y5( literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b98b3986b450dca7d93fa38ffd661f1bb87f46a GIT binary patch literal 11872 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51deff49a77c8995c359a0d3df204e78a685fac9 GIT binary patch literal 11798 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/base.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/base.py new file mode 100644 index 0000000..73973db --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/base.py @@ -0,0 +1,417 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from ..constants import scopingElements, tableInsertModeElements, namespaces + +# The scope markers are inserted when entering object elements, +# marquees, table cells, and table captions, and are used to prevent formatting +# from "leaking" into tables, object elements, and marquees. +Marker = None + +listElementsMap = { + None: (frozenset(scopingElements), False), + "button": (frozenset(scopingElements | set([(namespaces["html"], "button")])), False), + "list": (frozenset(scopingElements | set([(namespaces["html"], "ol"), + (namespaces["html"], "ul")])), False), + "table": (frozenset([(namespaces["html"], "html"), + (namespaces["html"], "table")]), False), + "select": (frozenset([(namespaces["html"], "optgroup"), + (namespaces["html"], "option")]), True) +} + + +class Node(object): + """Represents an item in the tree""" + def __init__(self, name): + """Creates a Node + + :arg name: The tag name associated with the node + + """ + # The tag name assocaited with the node + self.name = name + # The parent of the current node (or None for the document node) + self.parent = None + # The value of the current node (applies to text nodes and comments) + self.value = None + # A dict holding name -> value pairs for attributes of the node + self.attributes = {} + # A list of child nodes of the current node. This must include all + # elements but not necessarily other node types. + self.childNodes = [] + # A list of miscellaneous flags that can be set on the node. + self._flags = [] + + def __str__(self): + attributesStr = " ".join(["%s=\"%s\"" % (name, value) + for name, value in + self.attributes.items()]) + if attributesStr: + return "<%s %s>" % (self.name, attributesStr) + else: + return "<%s>" % (self.name) + + def __repr__(self): + return "<%s>" % (self.name) + + def appendChild(self, node): + """Insert node as a child of the current node + + :arg node: the node to insert + + """ + raise NotImplementedError + + def insertText(self, data, insertBefore=None): + """Insert data as text in the current node, positioned before the + start of node insertBefore or to the end of the node's text. + + :arg data: the data to insert + + :arg insertBefore: True if you want to insert the text before the node + and False if you want to insert it after the node + + """ + raise NotImplementedError + + def insertBefore(self, node, refNode): + """Insert node as a child of the current node, before refNode in the + list of child nodes. Raises ValueError if refNode is not a child of + the current node + + :arg node: the node to insert + + :arg refNode: the child node to insert the node before + + """ + raise NotImplementedError + + def removeChild(self, node): + """Remove node from the children of the current node + + :arg node: the child node to remove + + """ + raise NotImplementedError + + def reparentChildren(self, newParent): + """Move all the children of the current node to newParent. + This is needed so that trees that don't store text as nodes move the + text in the correct way + + :arg newParent: the node to move all this node's children to + + """ + # XXX - should this method be made more general? + for child in self.childNodes: + newParent.appendChild(child) + self.childNodes = [] + + def cloneNode(self): + """Return a shallow copy of the current node i.e. a node with the same + name and attributes but with no parent or child nodes + """ + raise NotImplementedError + + def hasContent(self): + """Return true if the node has children or text, false otherwise + """ + raise NotImplementedError + + +class ActiveFormattingElements(list): + def append(self, node): + equalCount = 0 + if node != Marker: + for element in self[::-1]: + if element == Marker: + break + if self.nodesEqual(element, node): + equalCount += 1 + if equalCount == 3: + self.remove(element) + break + list.append(self, node) + + def nodesEqual(self, node1, node2): + if not node1.nameTuple == node2.nameTuple: + return False + + if not node1.attributes == node2.attributes: + return False + + return True + + +class TreeBuilder(object): + """Base treebuilder implementation + + * documentClass - the class to use for the bottommost node of a document + * elementClass - the class to use for HTML Elements + * commentClass - the class to use for comments + * doctypeClass - the class to use for doctypes + + """ + # pylint:disable=not-callable + + # Document class + documentClass = None + + # The class to use for creating a node + elementClass = None + + # The class to use for creating comments + commentClass = None + + # The class to use for creating doctypes + doctypeClass = None + + # Fragment class + fragmentClass = None + + def __init__(self, namespaceHTMLElements): + """Create a TreeBuilder + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + """ + if namespaceHTMLElements: + self.defaultNamespace = "http://www.w3.org/1999/xhtml" + else: + self.defaultNamespace = None + self.reset() + + def reset(self): + self.openElements = [] + self.activeFormattingElements = ActiveFormattingElements() + + # XXX - rename these to headElement, formElement + self.headPointer = None + self.formPointer = None + + self.insertFromTable = False + + self.document = self.documentClass() + + def elementInScope(self, target, variant=None): + + # If we pass a node in we match that. if we pass a string + # match any node with that name + exactNode = hasattr(target, "nameTuple") + if not exactNode: + if isinstance(target, text_type): + target = (namespaces["html"], target) + assert isinstance(target, tuple) + + listElements, invert = listElementsMap[variant] + + for node in reversed(self.openElements): + if exactNode and node == target: + return True + elif not exactNode and node.nameTuple == target: + return True + elif (invert ^ (node.nameTuple in listElements)): + return False + + assert False # We should never reach this point + + def reconstructActiveFormattingElements(self): + # Within this algorithm the order of steps described in the + # specification is not quite the same as the order of steps in the + # code. It should still do the same though. + + # Step 1: stop the algorithm when there's nothing to do. + if not self.activeFormattingElements: + return + + # Step 2 and step 3: we start with the last element. So i is -1. + i = len(self.activeFormattingElements) - 1 + entry = self.activeFormattingElements[i] + if entry == Marker or entry in self.openElements: + return + + # Step 6 + while entry != Marker and entry not in self.openElements: + if i == 0: + # This will be reset to 0 below + i = -1 + break + i -= 1 + # Step 5: let entry be one earlier in the list. + entry = self.activeFormattingElements[i] + + while True: + # Step 7 + i += 1 + + # Step 8 + entry = self.activeFormattingElements[i] + clone = entry.cloneNode() # Mainly to get a new copy of the attributes + + # Step 9 + element = self.insertElement({"type": "StartTag", + "name": clone.name, + "namespace": clone.namespace, + "data": clone.attributes}) + + # Step 10 + self.activeFormattingElements[i] = element + + # Step 11 + if element == self.activeFormattingElements[-1]: + break + + def clearActiveFormattingElements(self): + entry = self.activeFormattingElements.pop() + while self.activeFormattingElements and entry != Marker: + entry = self.activeFormattingElements.pop() + + def elementInActiveFormattingElements(self, name): + """Check if an element exists between the end of the active + formatting elements and the last marker. If it does, return it, else + return false""" + + for item in self.activeFormattingElements[::-1]: + # Check for Marker first because if it's a Marker it doesn't have a + # name attribute. + if item == Marker: + break + elif item.name == name: + return item + return False + + def insertRoot(self, token): + element = self.createElement(token) + self.openElements.append(element) + self.document.appendChild(element) + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + doctype = self.doctypeClass(name, publicId, systemId) + self.document.appendChild(doctype) + + def insertComment(self, token, parent=None): + if parent is None: + parent = self.openElements[-1] + parent.appendChild(self.commentClass(token["data"])) + + def createElement(self, token): + """Create an element but don't insert it anywhere""" + name = token["name"] + namespace = token.get("namespace", self.defaultNamespace) + element = self.elementClass(name, namespace) + element.attributes = token["data"] + return element + + def _getInsertFromTable(self): + return self._insertFromTable + + def _setInsertFromTable(self, value): + """Switch the function used to insert an element from the + normal one to the misnested table one and back again""" + self._insertFromTable = value + if value: + self.insertElement = self.insertElementTable + else: + self.insertElement = self.insertElementNormal + + insertFromTable = property(_getInsertFromTable, _setInsertFromTable) + + def insertElementNormal(self, token): + name = token["name"] + assert isinstance(name, text_type), "Element %s not unicode" % name + namespace = token.get("namespace", self.defaultNamespace) + element = self.elementClass(name, namespace) + element.attributes = token["data"] + self.openElements[-1].appendChild(element) + self.openElements.append(element) + return element + + def insertElementTable(self, token): + """Create an element and insert it into the tree""" + element = self.createElement(token) + if self.openElements[-1].name not in tableInsertModeElements: + return self.insertElementNormal(token) + else: + # We should be in the InTable mode. This means we want to do + # special magic element rearranging + parent, insertBefore = self.getTableMisnestedNodePosition() + if insertBefore is None: + parent.appendChild(element) + else: + parent.insertBefore(element, insertBefore) + self.openElements.append(element) + return element + + def insertText(self, data, parent=None): + """Insert text data.""" + if parent is None: + parent = self.openElements[-1] + + if (not self.insertFromTable or (self.insertFromTable and + self.openElements[-1].name + not in tableInsertModeElements)): + parent.insertText(data) + else: + # We should be in the InTable mode. This means we want to do + # special magic element rearranging + parent, insertBefore = self.getTableMisnestedNodePosition() + parent.insertText(data, insertBefore) + + def getTableMisnestedNodePosition(self): + """Get the foster parent element, and sibling to insert before + (or None) when inserting a misnested table node""" + # The foster parent element is the one which comes before the most + # recently opened table element + # XXX - this is really inelegant + lastTable = None + fosterParent = None + insertBefore = None + for elm in self.openElements[::-1]: + if elm.name == "table": + lastTable = elm + break + if lastTable: + # XXX - we should really check that this parent is actually a + # node here + if lastTable.parent: + fosterParent = lastTable.parent + insertBefore = lastTable + else: + fosterParent = self.openElements[ + self.openElements.index(lastTable) - 1] + else: + fosterParent = self.openElements[0] + return fosterParent, insertBefore + + def generateImpliedEndTags(self, exclude=None): + name = self.openElements[-1].name + # XXX td, th and tr are not actually needed + if (name in frozenset(("dd", "dt", "li", "option", "optgroup", "p", "rp", "rt")) and + name != exclude): + self.openElements.pop() + # XXX This is not entirely what the specification says. We should + # investigate it more closely. + self.generateImpliedEndTags(exclude) + + def getDocument(self): + """Return the final tree""" + return self.document + + def getFragment(self): + """Return the final fragment""" + # assert self.innerHTML + fragment = self.fragmentClass() + self.openElements[0].reparentChildren(fragment) + return fragment + + def testSerializer(self, node): + """Serialize the subtree of node in the format required by unit tests + + :arg node: the node from which to start serializing + + """ + raise NotImplementedError diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/dom.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/dom.py new file mode 100644 index 0000000..dcfac22 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/dom.py @@ -0,0 +1,236 @@ +from __future__ import absolute_import, division, unicode_literals + + +from collections import MutableMapping +from xml.dom import minidom, Node +import weakref + +from . import base +from .. import constants +from ..constants import namespaces +from .._utils import moduleFactoryFactory + + +def getDomBuilder(DomImplementation): + Dom = DomImplementation + + class AttrList(MutableMapping): + def __init__(self, element): + self.element = element + + def __iter__(self): + return iter(self.element.attributes.keys()) + + def __setitem__(self, name, value): + if isinstance(name, tuple): + raise NotImplementedError + else: + attr = self.element.ownerDocument.createAttribute(name) + attr.value = value + self.element.attributes[name] = attr + + def __len__(self): + return len(self.element.attributes) + + def items(self): + return list(self.element.attributes.items()) + + def values(self): + return list(self.element.attributes.values()) + + def __getitem__(self, name): + if isinstance(name, tuple): + raise NotImplementedError + else: + return self.element.attributes[name].value + + def __delitem__(self, name): + if isinstance(name, tuple): + raise NotImplementedError + else: + del self.element.attributes[name] + + class NodeBuilder(base.Node): + def __init__(self, element): + base.Node.__init__(self, element.nodeName) + self.element = element + + namespace = property(lambda self: hasattr(self.element, "namespaceURI") and + self.element.namespaceURI or None) + + def appendChild(self, node): + node.parent = self + self.element.appendChild(node.element) + + def insertText(self, data, insertBefore=None): + text = self.element.ownerDocument.createTextNode(data) + if insertBefore: + self.element.insertBefore(text, insertBefore.element) + else: + self.element.appendChild(text) + + def insertBefore(self, node, refNode): + self.element.insertBefore(node.element, refNode.element) + node.parent = self + + def removeChild(self, node): + if node.element.parentNode == self.element: + self.element.removeChild(node.element) + node.parent = None + + def reparentChildren(self, newParent): + while self.element.hasChildNodes(): + child = self.element.firstChild + self.element.removeChild(child) + newParent.element.appendChild(child) + self.childNodes = [] + + def getAttributes(self): + return AttrList(self.element) + + def setAttributes(self, attributes): + if attributes: + for name, value in list(attributes.items()): + if isinstance(name, tuple): + if name[0] is not None: + qualifiedName = (name[0] + ":" + name[1]) + else: + qualifiedName = name[1] + self.element.setAttributeNS(name[2], qualifiedName, + value) + else: + self.element.setAttribute( + name, value) + attributes = property(getAttributes, setAttributes) + + def cloneNode(self): + return NodeBuilder(self.element.cloneNode(False)) + + def hasContent(self): + return self.element.hasChildNodes() + + def getNameTuple(self): + if self.namespace is None: + return namespaces["html"], self.name + else: + return self.namespace, self.name + + nameTuple = property(getNameTuple) + + class TreeBuilder(base.TreeBuilder): # pylint:disable=unused-variable + def documentClass(self): + self.dom = Dom.getDOMImplementation().createDocument(None, None, None) + return weakref.proxy(self) + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + domimpl = Dom.getDOMImplementation() + doctype = domimpl.createDocumentType(name, publicId, systemId) + self.document.appendChild(NodeBuilder(doctype)) + if Dom == minidom: + doctype.ownerDocument = self.dom + + def elementClass(self, name, namespace=None): + if namespace is None and self.defaultNamespace is None: + node = self.dom.createElement(name) + else: + node = self.dom.createElementNS(namespace, name) + + return NodeBuilder(node) + + def commentClass(self, data): + return NodeBuilder(self.dom.createComment(data)) + + def fragmentClass(self): + return NodeBuilder(self.dom.createDocumentFragment()) + + def appendChild(self, node): + self.dom.appendChild(node.element) + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + return self.dom + + def getFragment(self): + return base.TreeBuilder.getFragment(self).element + + def insertText(self, data, parent=None): + data = data + if parent != self: + base.TreeBuilder.insertText(self, data, parent) + else: + # HACK: allow text nodes as children of the document node + if hasattr(self.dom, '_child_node_types'): + # pylint:disable=protected-access + if Node.TEXT_NODE not in self.dom._child_node_types: + self.dom._child_node_types = list(self.dom._child_node_types) + self.dom._child_node_types.append(Node.TEXT_NODE) + self.dom.appendChild(self.dom.createTextNode(data)) + + implementation = DomImplementation + name = None + + def testSerializer(element): + element.normalize() + rv = [] + + def serializeElement(element, indent=0): + if element.nodeType == Node.DOCUMENT_TYPE_NODE: + if element.name: + if element.publicId or element.systemId: + publicId = element.publicId or "" + systemId = element.systemId or "" + rv.append("""|%s<!DOCTYPE %s "%s" "%s">""" % + (' ' * indent, element.name, publicId, systemId)) + else: + rv.append("|%s<!DOCTYPE %s>" % (' ' * indent, element.name)) + else: + rv.append("|%s<!DOCTYPE >" % (' ' * indent,)) + elif element.nodeType == Node.DOCUMENT_NODE: + rv.append("#document") + elif element.nodeType == Node.DOCUMENT_FRAGMENT_NODE: + rv.append("#document-fragment") + elif element.nodeType == Node.COMMENT_NODE: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.nodeValue)) + elif element.nodeType == Node.TEXT_NODE: + rv.append("|%s\"%s\"" % (' ' * indent, element.nodeValue)) + else: + if (hasattr(element, "namespaceURI") and + element.namespaceURI is not None): + name = "%s %s" % (constants.prefixes[element.namespaceURI], + element.nodeName) + else: + name = element.nodeName + rv.append("|%s<%s>" % (' ' * indent, name)) + if element.hasAttributes(): + attributes = [] + for i in range(len(element.attributes)): + attr = element.attributes.item(i) + name = attr.nodeName + value = attr.value + ns = attr.namespaceURI + if ns: + name = "%s %s" % (constants.prefixes[ns], attr.localName) + else: + name = attr.nodeName + attributes.append((name, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + indent += 2 + for child in element.childNodes: + serializeElement(child, indent) + serializeElement(element, 0) + + return "\n".join(rv) + + return locals() + + +# The actual means to get a module! +getDomModule = moduleFactoryFactory(getDomBuilder) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/etree.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/etree.py new file mode 100644 index 0000000..0dedf44 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/etree.py @@ -0,0 +1,340 @@ +from __future__ import absolute_import, division, unicode_literals +# pylint:disable=protected-access + +from pip._vendor.six import text_type + +import re + +from . import base +from .. import _ihatexml +from .. import constants +from ..constants import namespaces +from .._utils import moduleFactoryFactory + +tag_regexp = re.compile("{([^}]*)}(.*)") + + +def getETreeBuilder(ElementTreeImplementation, fullTree=False): + ElementTree = ElementTreeImplementation + ElementTreeCommentType = ElementTree.Comment("asd").tag + + class Element(base.Node): + def __init__(self, name, namespace=None): + self._name = name + self._namespace = namespace + self._element = ElementTree.Element(self._getETreeTag(name, + namespace)) + if namespace is None: + self.nameTuple = namespaces["html"], self._name + else: + self.nameTuple = self._namespace, self._name + self.parent = None + self._childNodes = [] + self._flags = [] + + def _getETreeTag(self, name, namespace): + if namespace is None: + etree_tag = name + else: + etree_tag = "{%s}%s" % (namespace, name) + return etree_tag + + def _setName(self, name): + self._name = name + self._element.tag = self._getETreeTag(self._name, self._namespace) + + def _getName(self): + return self._name + + name = property(_getName, _setName) + + def _setNamespace(self, namespace): + self._namespace = namespace + self._element.tag = self._getETreeTag(self._name, self._namespace) + + def _getNamespace(self): + return self._namespace + + namespace = property(_getNamespace, _setNamespace) + + def _getAttributes(self): + return self._element.attrib + + def _setAttributes(self, attributes): + # Delete existing attributes first + # XXX - there may be a better way to do this... + for key in list(self._element.attrib.keys()): + del self._element.attrib[key] + for key, value in attributes.items(): + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], key[1]) + else: + name = key + self._element.set(name, value) + + attributes = property(_getAttributes, _setAttributes) + + def _getChildNodes(self): + return self._childNodes + + def _setChildNodes(self, value): + del self._element[:] + self._childNodes = [] + for element in value: + self.insertChild(element) + + childNodes = property(_getChildNodes, _setChildNodes) + + def hasContent(self): + """Return true if the node has children or text""" + return bool(self._element.text or len(self._element)) + + def appendChild(self, node): + self._childNodes.append(node) + self._element.append(node._element) + node.parent = self + + def insertBefore(self, node, refNode): + index = list(self._element).index(refNode._element) + self._element.insert(index, node._element) + node.parent = self + + def removeChild(self, node): + self._childNodes.remove(node) + self._element.remove(node._element) + node.parent = None + + def insertText(self, data, insertBefore=None): + if not(len(self._element)): + if not self._element.text: + self._element.text = "" + self._element.text += data + elif insertBefore is None: + # Insert the text as the tail of the last child element + if not self._element[-1].tail: + self._element[-1].tail = "" + self._element[-1].tail += data + else: + # Insert the text before the specified node + children = list(self._element) + index = children.index(insertBefore._element) + if index > 0: + if not self._element[index - 1].tail: + self._element[index - 1].tail = "" + self._element[index - 1].tail += data + else: + if not self._element.text: + self._element.text = "" + self._element.text += data + + def cloneNode(self): + element = type(self)(self.name, self.namespace) + for name, value in self.attributes.items(): + element.attributes[name] = value + return element + + def reparentChildren(self, newParent): + if newParent.childNodes: + newParent.childNodes[-1]._element.tail += self._element.text + else: + if not newParent._element.text: + newParent._element.text = "" + if self._element.text is not None: + newParent._element.text += self._element.text + self._element.text = "" + base.Node.reparentChildren(self, newParent) + + class Comment(Element): + def __init__(self, data): + # Use the superclass constructor to set all properties on the + # wrapper element + self._element = ElementTree.Comment(data) + self.parent = None + self._childNodes = [] + self._flags = [] + + def _getData(self): + return self._element.text + + def _setData(self, value): + self._element.text = value + + data = property(_getData, _setData) + + class DocumentType(Element): + def __init__(self, name, publicId, systemId): + Element.__init__(self, "<!DOCTYPE>") + self._element.text = name + self.publicId = publicId + self.systemId = systemId + + def _getPublicId(self): + return self._element.get("publicId", "") + + def _setPublicId(self, value): + if value is not None: + self._element.set("publicId", value) + + publicId = property(_getPublicId, _setPublicId) + + def _getSystemId(self): + return self._element.get("systemId", "") + + def _setSystemId(self, value): + if value is not None: + self._element.set("systemId", value) + + systemId = property(_getSystemId, _setSystemId) + + class Document(Element): + def __init__(self): + Element.__init__(self, "DOCUMENT_ROOT") + + class DocumentFragment(Element): + def __init__(self): + Element.__init__(self, "DOCUMENT_FRAGMENT") + + def testSerializer(element): + rv = [] + + def serializeElement(element, indent=0): + if not(hasattr(element, "tag")): + element = element.getroot() + if element.tag == "<!DOCTYPE>": + if element.get("publicId") or element.get("systemId"): + publicId = element.get("publicId") or "" + systemId = element.get("systemId") or "" + rv.append("""<!DOCTYPE %s "%s" "%s">""" % + (element.text, publicId, systemId)) + else: + rv.append("<!DOCTYPE %s>" % (element.text,)) + elif element.tag == "DOCUMENT_ROOT": + rv.append("#document") + if element.text is not None: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + if element.tail is not None: + raise TypeError("Document node cannot have tail") + if hasattr(element, "attrib") and len(element.attrib): + raise TypeError("Document node cannot have attributes") + elif element.tag == ElementTreeCommentType: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) + else: + assert isinstance(element.tag, text_type), \ + "Expected unicode, got %s, %s" % (type(element.tag), element.tag) + nsmatch = tag_regexp.match(element.tag) + + if nsmatch is None: + name = element.tag + else: + ns, name = nsmatch.groups() + prefix = constants.prefixes[ns] + name = "%s %s" % (prefix, name) + rv.append("|%s<%s>" % (' ' * indent, name)) + + if hasattr(element, "attrib"): + attributes = [] + for name, value in element.attrib.items(): + nsmatch = tag_regexp.match(name) + if nsmatch is not None: + ns, name = nsmatch.groups() + prefix = constants.prefixes[ns] + attr_string = "%s %s" % (prefix, name) + else: + attr_string = name + attributes.append((attr_string, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + if element.text: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + indent += 2 + for child in element: + serializeElement(child, indent) + if element.tail: + rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) + serializeElement(element, 0) + + return "\n".join(rv) + + def tostring(element): # pylint:disable=unused-variable + """Serialize an element and its child nodes to a string""" + rv = [] + filter = _ihatexml.InfosetFilter() + + def serializeElement(element): + if isinstance(element, ElementTree.ElementTree): + element = element.getroot() + + if element.tag == "<!DOCTYPE>": + if element.get("publicId") or element.get("systemId"): + publicId = element.get("publicId") or "" + systemId = element.get("systemId") or "" + rv.append("""<!DOCTYPE %s PUBLIC "%s" "%s">""" % + (element.text, publicId, systemId)) + else: + rv.append("<!DOCTYPE %s>" % (element.text,)) + elif element.tag == "DOCUMENT_ROOT": + if element.text is not None: + rv.append(element.text) + if element.tail is not None: + raise TypeError("Document node cannot have tail") + if hasattr(element, "attrib") and len(element.attrib): + raise TypeError("Document node cannot have attributes") + + for child in element: + serializeElement(child) + + elif element.tag == ElementTreeCommentType: + rv.append("<!--%s-->" % (element.text,)) + else: + # This is assumed to be an ordinary element + if not element.attrib: + rv.append("<%s>" % (filter.fromXmlName(element.tag),)) + else: + attr = " ".join(["%s=\"%s\"" % ( + filter.fromXmlName(name), value) + for name, value in element.attrib.items()]) + rv.append("<%s %s>" % (element.tag, attr)) + if element.text: + rv.append(element.text) + + for child in element: + serializeElement(child) + + rv.append("</%s>" % (element.tag,)) + + if element.tail: + rv.append(element.tail) + + serializeElement(element) + + return "".join(rv) + + class TreeBuilder(base.TreeBuilder): # pylint:disable=unused-variable + documentClass = Document + doctypeClass = DocumentType + elementClass = Element + commentClass = Comment + fragmentClass = DocumentFragment + implementation = ElementTreeImplementation + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + if fullTree: + return self.document._element + else: + if self.defaultNamespace is not None: + return self.document._element.find( + "{%s}html" % self.defaultNamespace) + else: + return self.document._element.find("html") + + def getFragment(self): + return base.TreeBuilder.getFragment(self)._element + + return locals() + + +getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py new file mode 100644 index 0000000..ca12a99 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py @@ -0,0 +1,366 @@ +"""Module for supporting the lxml.etree library. The idea here is to use as much +of the native library as possible, without using fragile hacks like custom element +names that break between releases. The downside of this is that we cannot represent +all possible trees; specifically the following are known to cause problems: + +Text or comments as siblings of the root element +Docypes with no name + +When any of these things occur, we emit a DataLossWarning +""" + +from __future__ import absolute_import, division, unicode_literals +# pylint:disable=protected-access + +import warnings +import re +import sys + +from . import base +from ..constants import DataLossWarning +from .. import constants +from . import etree as etree_builders +from .. import _ihatexml + +import lxml.etree as etree + + +fullTree = True +tag_regexp = re.compile("{([^}]*)}(.*)") + +comment_type = etree.Comment("asd").tag + + +class DocumentType(object): + def __init__(self, name, publicId, systemId): + self.name = name + self.publicId = publicId + self.systemId = systemId + + +class Document(object): + def __init__(self): + self._elementTree = None + self._childNodes = [] + + def appendChild(self, element): + self._elementTree.getroot().addnext(element._element) + + def _getChildNodes(self): + return self._childNodes + + childNodes = property(_getChildNodes) + + +def testSerializer(element): + rv = [] + infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True) + + def serializeElement(element, indent=0): + if not hasattr(element, "tag"): + if hasattr(element, "getroot"): + # Full tree case + rv.append("#document") + if element.docinfo.internalDTD: + if not (element.docinfo.public_id or + element.docinfo.system_url): + dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name + else: + dtd_str = """<!DOCTYPE %s "%s" "%s">""" % ( + element.docinfo.root_name, + element.docinfo.public_id, + element.docinfo.system_url) + rv.append("|%s%s" % (' ' * (indent + 2), dtd_str)) + next_element = element.getroot() + while next_element.getprevious() is not None: + next_element = next_element.getprevious() + while next_element is not None: + serializeElement(next_element, indent + 2) + next_element = next_element.getnext() + elif isinstance(element, str) or isinstance(element, bytes): + # Text in a fragment + assert isinstance(element, str) or sys.version_info[0] == 2 + rv.append("|%s\"%s\"" % (' ' * indent, element)) + else: + # Fragment case + rv.append("#document-fragment") + for next_element in element: + serializeElement(next_element, indent + 2) + elif element.tag == comment_type: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) + if hasattr(element, "tail") and element.tail: + rv.append("|%s\"%s\"" % (' ' * indent, element.tail)) + else: + assert isinstance(element, etree._Element) + nsmatch = etree_builders.tag_regexp.match(element.tag) + if nsmatch is not None: + ns = nsmatch.group(1) + tag = nsmatch.group(2) + prefix = constants.prefixes[ns] + rv.append("|%s<%s %s>" % (' ' * indent, prefix, + infosetFilter.fromXmlName(tag))) + else: + rv.append("|%s<%s>" % (' ' * indent, + infosetFilter.fromXmlName(element.tag))) + + if hasattr(element, "attrib"): + attributes = [] + for name, value in element.attrib.items(): + nsmatch = tag_regexp.match(name) + if nsmatch is not None: + ns, name = nsmatch.groups() + name = infosetFilter.fromXmlName(name) + prefix = constants.prefixes[ns] + attr_string = "%s %s" % (prefix, name) + else: + attr_string = infosetFilter.fromXmlName(name) + attributes.append((attr_string, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + + if element.text: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + indent += 2 + for child in element: + serializeElement(child, indent) + if hasattr(element, "tail") and element.tail: + rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) + serializeElement(element, 0) + + return "\n".join(rv) + + +def tostring(element): + """Serialize an element and its child nodes to a string""" + rv = [] + + def serializeElement(element): + if not hasattr(element, "tag"): + if element.docinfo.internalDTD: + if element.docinfo.doctype: + dtd_str = element.docinfo.doctype + else: + dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name + rv.append(dtd_str) + serializeElement(element.getroot()) + + elif element.tag == comment_type: + rv.append("<!--%s-->" % (element.text,)) + + else: + # This is assumed to be an ordinary element + if not element.attrib: + rv.append("<%s>" % (element.tag,)) + else: + attr = " ".join(["%s=\"%s\"" % (name, value) + for name, value in element.attrib.items()]) + rv.append("<%s %s>" % (element.tag, attr)) + if element.text: + rv.append(element.text) + + for child in element: + serializeElement(child) + + rv.append("</%s>" % (element.tag,)) + + if hasattr(element, "tail") and element.tail: + rv.append(element.tail) + + serializeElement(element) + + return "".join(rv) + + +class TreeBuilder(base.TreeBuilder): + documentClass = Document + doctypeClass = DocumentType + elementClass = None + commentClass = None + fragmentClass = Document + implementation = etree + + def __init__(self, namespaceHTMLElements, fullTree=False): + builder = etree_builders.getETreeModule(etree, fullTree=fullTree) + infosetFilter = self.infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True) + self.namespaceHTMLElements = namespaceHTMLElements + + class Attributes(dict): + def __init__(self, element, value=None): + if value is None: + value = {} + self._element = element + dict.__init__(self, value) # pylint:disable=non-parent-init-called + for key, value in self.items(): + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) + else: + name = infosetFilter.coerceAttribute(key) + self._element._element.attrib[name] = value + + def __setitem__(self, key, value): + dict.__setitem__(self, key, value) + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) + else: + name = infosetFilter.coerceAttribute(key) + self._element._element.attrib[name] = value + + class Element(builder.Element): + def __init__(self, name, namespace): + name = infosetFilter.coerceElement(name) + builder.Element.__init__(self, name, namespace=namespace) + self._attributes = Attributes(self) + + def _setName(self, name): + self._name = infosetFilter.coerceElement(name) + self._element.tag = self._getETreeTag( + self._name, self._namespace) + + def _getName(self): + return infosetFilter.fromXmlName(self._name) + + name = property(_getName, _setName) + + def _getAttributes(self): + return self._attributes + + def _setAttributes(self, attributes): + self._attributes = Attributes(self, attributes) + + attributes = property(_getAttributes, _setAttributes) + + def insertText(self, data, insertBefore=None): + data = infosetFilter.coerceCharacters(data) + builder.Element.insertText(self, data, insertBefore) + + def appendChild(self, child): + builder.Element.appendChild(self, child) + + class Comment(builder.Comment): + def __init__(self, data): + data = infosetFilter.coerceComment(data) + builder.Comment.__init__(self, data) + + def _setData(self, data): + data = infosetFilter.coerceComment(data) + self._element.text = data + + def _getData(self): + return self._element.text + + data = property(_getData, _setData) + + self.elementClass = Element + self.commentClass = Comment + # self.fragmentClass = builder.DocumentFragment + base.TreeBuilder.__init__(self, namespaceHTMLElements) + + def reset(self): + base.TreeBuilder.reset(self) + self.insertComment = self.insertCommentInitial + self.initial_comments = [] + self.doctype = None + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + if fullTree: + return self.document._elementTree + else: + return self.document._elementTree.getroot() + + def getFragment(self): + fragment = [] + element = self.openElements[0]._element + if element.text: + fragment.append(element.text) + fragment.extend(list(element)) + if element.tail: + fragment.append(element.tail) + return fragment + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + if not name: + warnings.warn("lxml cannot represent empty doctype", DataLossWarning) + self.doctype = None + else: + coercedName = self.infosetFilter.coerceElement(name) + if coercedName != name: + warnings.warn("lxml cannot represent non-xml doctype", DataLossWarning) + + doctype = self.doctypeClass(coercedName, publicId, systemId) + self.doctype = doctype + + def insertCommentInitial(self, data, parent=None): + assert parent is None or parent is self.document + assert self.document._elementTree is None + self.initial_comments.append(data) + + def insertCommentMain(self, data, parent=None): + if (parent == self.document and + self.document._elementTree.getroot()[-1].tag == comment_type): + warnings.warn("lxml cannot represent adjacent comments beyond the root elements", DataLossWarning) + super(TreeBuilder, self).insertComment(data, parent) + + def insertRoot(self, token): + # Because of the way libxml2 works, it doesn't seem to be possible to + # alter information like the doctype after the tree has been parsed. + # Therefore we need to use the built-in parser to create our initial + # tree, after which we can add elements like normal + docStr = "" + if self.doctype: + assert self.doctype.name + docStr += "<!DOCTYPE %s" % self.doctype.name + if (self.doctype.publicId is not None or + self.doctype.systemId is not None): + docStr += (' PUBLIC "%s" ' % + (self.infosetFilter.coercePubid(self.doctype.publicId or ""))) + if self.doctype.systemId: + sysid = self.doctype.systemId + if sysid.find("'") >= 0 and sysid.find('"') >= 0: + warnings.warn("DOCTYPE system cannot contain single and double quotes", DataLossWarning) + sysid = sysid.replace("'", 'U00027') + if sysid.find("'") >= 0: + docStr += '"%s"' % sysid + else: + docStr += "'%s'" % sysid + else: + docStr += "''" + docStr += ">" + if self.doctype.name != token["name"]: + warnings.warn("lxml cannot represent doctype with a different name to the root element", DataLossWarning) + docStr += "<THIS_SHOULD_NEVER_APPEAR_PUBLICLY/>" + root = etree.fromstring(docStr) + + # Append the initial comments: + for comment_token in self.initial_comments: + comment = self.commentClass(comment_token["data"]) + root.addprevious(comment._element) + + # Create the root document and add the ElementTree to it + self.document = self.documentClass() + self.document._elementTree = root.getroottree() + + # Give the root element the right name + name = token["name"] + namespace = token.get("namespace", self.defaultNamespace) + if namespace is None: + etree_tag = name + else: + etree_tag = "{%s}%s" % (namespace, name) + root.tag = etree_tag + + # Add the root element to the internal child/open data structures + root_element = self.elementClass(name, namespace) + root_element._element = root + self.document._childNodes.append(root_element) + self.openElements.append(root_element) + + # Reset to the default insert comment function + self.insertComment = self.insertCommentMain diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py new file mode 100644 index 0000000..9bec207 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py @@ -0,0 +1,154 @@ +"""A collection of modules for iterating through different kinds of +tree, generating tokens identical to those produced by the tokenizer +module. + +To create a tree walker for a new type of tree, you need to do +implement a tree walker object (called TreeWalker by convention) that +implements a 'serialize' method taking a tree as sole argument and +returning an iterator generating tokens. +""" + +from __future__ import absolute_import, division, unicode_literals + +from .. import constants +from .._utils import default_etree + +__all__ = ["getTreeWalker", "pprint"] + +treeWalkerCache = {} + + +def getTreeWalker(treeType, implementation=None, **kwargs): + """Get a TreeWalker class for various types of tree with built-in support + + :arg str treeType: the name of the tree type required (case-insensitive). + Supported values are: + + * "dom": The xml.dom.minidom DOM implementation + * "etree": A generic walker for tree implementations exposing an + elementtree-like interface (known to work with ElementTree, + cElementTree and lxml.etree). + * "lxml": Optimized walker for lxml.etree + * "genshi": a Genshi stream + + :arg implementation: A module implementing the tree type e.g. + xml.etree.ElementTree or cElementTree (Currently applies to the "etree" + tree type only). + + :arg kwargs: keyword arguments passed to the etree walker--for other + walkers, this has no effect + + :returns: a TreeWalker class + + """ + + treeType = treeType.lower() + if treeType not in treeWalkerCache: + if treeType == "dom": + from . import dom + treeWalkerCache[treeType] = dom.TreeWalker + elif treeType == "genshi": + from . import genshi + treeWalkerCache[treeType] = genshi.TreeWalker + elif treeType == "lxml": + from . import etree_lxml + treeWalkerCache[treeType] = etree_lxml.TreeWalker + elif treeType == "etree": + from . import etree + if implementation is None: + implementation = default_etree + # XXX: NEVER cache here, caching is done in the etree submodule + return etree.getETreeModule(implementation, **kwargs).TreeWalker + return treeWalkerCache.get(treeType) + + +def concatenateCharacterTokens(tokens): + pendingCharacters = [] + for token in tokens: + type = token["type"] + if type in ("Characters", "SpaceCharacters"): + pendingCharacters.append(token["data"]) + else: + if pendingCharacters: + yield {"type": "Characters", "data": "".join(pendingCharacters)} + pendingCharacters = [] + yield token + if pendingCharacters: + yield {"type": "Characters", "data": "".join(pendingCharacters)} + + +def pprint(walker): + """Pretty printer for tree walkers + + Takes a TreeWalker instance and pretty prints the output of walking the tree. + + :arg walker: a TreeWalker instance + + """ + output = [] + indent = 0 + for token in concatenateCharacterTokens(walker): + type = token["type"] + if type in ("StartTag", "EmptyTag"): + # tag name + if token["namespace"] and token["namespace"] != constants.namespaces["html"]: + if token["namespace"] in constants.prefixes: + ns = constants.prefixes[token["namespace"]] + else: + ns = token["namespace"] + name = "%s %s" % (ns, token["name"]) + else: + name = token["name"] + output.append("%s<%s>" % (" " * indent, name)) + indent += 2 + # attributes (sorted for consistent ordering) + attrs = token["data"] + for (namespace, localname), value in sorted(attrs.items()): + if namespace: + if namespace in constants.prefixes: + ns = constants.prefixes[namespace] + else: + ns = namespace + name = "%s %s" % (ns, localname) + else: + name = localname + output.append("%s%s=\"%s\"" % (" " * indent, name, value)) + # self-closing + if type == "EmptyTag": + indent -= 2 + + elif type == "EndTag": + indent -= 2 + + elif type == "Comment": + output.append("%s<!-- %s -->" % (" " * indent, token["data"])) + + elif type == "Doctype": + if token["name"]: + if token["publicId"]: + output.append("""%s<!DOCTYPE %s "%s" "%s">""" % + (" " * indent, + token["name"], + token["publicId"], + token["systemId"] if token["systemId"] else "")) + elif token["systemId"]: + output.append("""%s<!DOCTYPE %s "" "%s">""" % + (" " * indent, + token["name"], + token["systemId"])) + else: + output.append("%s<!DOCTYPE %s>" % (" " * indent, + token["name"])) + else: + output.append("%s<!DOCTYPE >" % (" " * indent,)) + + elif type == "Characters": + output.append("%s\"%s\"" % (" " * indent, token["data"])) + + elif type == "SpaceCharacters": + assert False, "concatenateCharacterTokens should have got rid of all Space tokens" + + else: + raise ValueError("Unknown token type, %s" % type) + + return "\n".join(output) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc73f6841f16e71b78a8a3ffbfed163846a4b306 GIT binary patch literal 4012 zcmZ`+TW=f372aJgm&?`Fs-i@S<4oKtHVaE~kOT=-SEwr~7qqdBShZ2X4!hzEsTG&I z)XY*BVi^=wo(uheKKQZCbD#PL`XBZwK!E~&?PJh~erJZFC>vd3W@qPI=FB-~zB&AG zYAX2mi+?`*dcm^(WsN;0jDLlucF}Qb*WxyJV!Pw)I-SyPspIatw#7@_jmsTx*VE&2 zT<Q3`KE@uew4B{)WbFogidVV!oxMB313vMcwL8ftc?It&?mxC_)8QX&%ev1RX&j42 z7NrSGo2--aUMv)ArjkXOkYN@jEtc)ewAb2aJZd(D6iLR~QNk4jf=mi=hqXj9;!WEk zQ7qzMiyC3fvJ~>E609qsydgN-JH?Cu0i01^$iS?+8U#BjYe*4hf`yDUv*R#s3#rWs zSt5>EcG?wWs9E<k?O_%wu?SCtsMC!_hwQs5p6(rBi|jVciNU-B%}<SDn9@j-BeFG3 zYA`FzF10AAxut}R!Wd@WVjY2vV670lZ(S@ADyGsH2Fq5@ES>N`imWFS&6N!O2#3Dr zrPbgif^5}F#Z0&dExk<Cv4>P<h0mj-NWrLLwwFYWl#6<-0}`v34$0U>6_%?kOfrR! zDK45}FV5<MJX1`yM0UB&!s~Wrlw=PYBuY;Ot%UX)H1$2Y+&Zw%tO4Gc-LA+NIr6UU z$h+L(r5KqvDA`tCI&d>Px9(X<7jzf&N1&HMFAtEFxjUji0^I|>3wi}~Z%_ukJfhzP z-3R>z=vB}w17vb;^Pug^^UNRExpz>_?WUbOf3^?Y$FS-k$gMLQnL82w0;Yd1D9V?6 zWQ{mfCUK8K8Kpg?bA^(0m`YK$&-QvzoUKF&Q@t+vIS3e@bp(&8Olrm*WZ1e+&?M}b zT%%;AY}Cmo#bGa!NF$_^640fP?@<;ViQ1~xMj9U*_24=R;~oxFD8;&2jL1J{H+kB* zxz2W=`lJ)D;%l`NB@y0i>)}^yl*u@NX);m^IUQd}-Z$wKHO9|~w(_d1V&bHmDwB&N zMT`k^Qb=MYj@p7DKZI<C4Z&`=lk_;DGj*KGHajNAZ5wv-_nk2<jj?$aCY;5z8*Ss5 zH()l+!|I3KEb8De@o}p!Wk#AIfzzV)Bglm8b3LR8iLf&kva35KpBN;$be}=5@$iY& z)@7JR#;%U<14s4BzHV>!B%xk>%EE3pju1`_YT_aqBeS*t4MZjJDLkMlI=$M*NHVp~ z+Ts*m<s-aMtc$#bLxw7~?}px4Ss@%w0hV&Kgh51g2N@bEwh#D8QYL`Qjf-S9;De=J zKOV-OqJ%Vi3G@ew$N;axGtS26Bz?LR5r9gdjj7XDQ8q!f<qS9;)Fz5@oE{5V%+Q_< znr?=TeNk9OWk9K7=Cx8e4LL0=34DraAk;STe5J3PqJ-~SrSM4|9l>JyYIF<Fcu;G9 zMdRNrxd@#<e!B*kJHqv`1_)SdrZE>%tu@+fS^PnB@8pPoq&}&C+}Jy9fAC?mf81%@ z#nVdGcGkL4mrinq3u5J?j_7lBqG(dLI_?La%C-Hh6Mq~>duwFlFb-?=I*x5tudjAb zr4J+CKvOr-S#S9^{U-5ywfAk;nY9}f0(#tGYv8S7bS-OOpZqqrwyft{11ER5y=V<e zd5Krro?OlC0}FHRBJj|*4ujm5Ul0x-*tvaXbMG(C6U){*ay>c>o&sCt{_8y40-pL0 z3YT)W2sZaa88!d|s+f7)1r&@;xID~4IS1ovj(i(0dBcpa)A$`dE<BtM_^NOZ(kQ99 zg{SX$Ra~Q4oW(JHWlb`gD0n)8atWhi2^U)fQB2TA5<9xCxDUEQ$z)l!YX{oDvyN-e z=`YuoKLcgt)(L!2NH)<_jH{2_%I$%3?wmZyaMhjJTh_Vr{0r?`2QGGVm$SBaZp-)K z?DC=|zcp`MKMwa6t#)Z_ri5T{P$)3qg?u^j&3I7emAs6xzi2g`1#94G3cdy&!snti z3vy@P$~~e|7!lBkPb>tx#3#X3IpJA3uN-)1+REoU&zxt@z#mixLGH`{<UXy7^?%Uo zliqUT=KgTq>TpdruMXFnx>zp{nkBR1;XjZTE?wj2j{Jt!{}k&V&SP#GbGBT+GB=~= z{-CX&9ct6IUhF_iUens<%+8_XzZlIeS{VIZOa5de37ZWK{k-P*s~IH@f1~Ld8<WpQ z)E~6`!YlHSyx32&q&eOk=eV#fnb)+p46SJoJwSV1)E0lL=}RM7#Na|!@9S;N^)<hK z?x=6F3V-L!{*!$;pZWYou5G2Srxt&g$`)Owyw`v62vD4zqVUystFB@RI)>=33>xo* zZK@B(OBszs32tJ#QM+SGaPgpENPAhgmr-FuAT)l(jbAthpkBEJE;O5^B>|8=f`$JW zr#ssTTZO;f>1L-is!{=@2nPz6u&-ZUR%}@nF3tD7Wp!^^ZTx66Std0E2mR`@T2{Zj zxvXv$-gd%COJy_dP+{Dkg1~z#E6~7JRyK;tR@%_8<9B;|an$&d_ZNv{>*40k?;mXw z8|l&AM&YYdm5I)mTtiU*%~v^xeEpfLgblOmh0YC0Xho)zYK>Z-^?&{U;fAUGv=?(+ zvqyrp(u~Q7lizVoFb$BnwdwCpf8lq@MbU(BT`1lmSJ?s3a+%!oKDt_<0ZMup7s1H8 zs_+ryW^^Kye3wX`LTM^^QAWkzQN{Fq6bO<E!EGs1Sp-k0rqpA}NbN-7nP?ZD$&JFp z|1<bp{uE>rU?)+sM#{@!mPsXV(YP9?_)kQJ6lGng8Wh%eOi(PV=pLadj?VI3;Orbw zH*l8hX?xc3?K!js+eg2oF?bSaJdJkU3BYBV9s{kt;qS(1JnKwC%L4d_XSOu!)a(bf z>7r7v^R!W~7eT$=?BTzZsMjR`+>#~g=)Tl>U_9y7ds!4KQ&&I~(E<B4Vj}oAKBt|G g?QXQi!oO#V#tq_7v*=uB9(GMSzT=jHJO0f707Yj}dH?_b literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ffc37d3a770df6d434ed690ae6b1ccf9152aaae GIT binary patch literal 7000 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 Or9a3`pZTux_<sN;A;WtB literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..add6110a9f443e2924bab18fdcc4fcfae9cc877d GIT binary patch literal 1727 zcma)6QEwYX5Z=8z`_8W2rm0Djrbs*>Ay+h}YAblCss`Jw0`yWP4k;_(boTBgXYZZe z-Lo4<=~D{7gI8Yp6G;4oeFY))ohP1{IX8A%p{gs*?Ci|!%(t_%d%IdK|NYDF-~Ut~ z<WF*LI3Pa&(q97Ogi}cp%4lLSE3uhPQD;dfDX;>_Hg{w(ahXfWBf<;3_>%CVaQoh= z%}U(eC3Wu=#36OtTnf8-D94!y;$$>bneli$iFG_o&C)oHdqXY)8D~O;QrD?*d{Dfi zxEB`PP>UW0IvW-U4}kQizyx8G6J~MBt(Sz^2n%Ls28b27%RN{Zc?kfOO}V3l*bn7E zs2;|_fyahYkS37+2iOVilZ^JQfu%mm?7jo*0#Fgijhx*xy9Yj{$Ql&Yeef!S^+IIL ztrgh)TTEV9M_*-CuwCq5IwhyHMSl3=g$?Va6Z@2cWcM$tpMfu*SSSNsiL86%*^e_F zComUgntcL!YOwb*&<Eg8`zxm;D$H|Ug`9tY&nj5XV_5^F*K(wPfptBiyBO&@co9U* z3Dk!A^$(esLghQtkx*C=w%poo?mce%ouKpGlXl>5x7x}@g9`>!87B=BVZ70}E92f4 zH=dsAOe9;Jl{)RGoqP*hZnic%o560o+1c9mXF3PXtc3Z#4dqy{O8c93o(i)VN5(oc z<uJ=s+=a%`#u<pIW=jVm+dNZZo3IKZ(4(*?_I9>RVUh<c$zd;)K3JIhI<CpjmaD3V zp>7_=l4AhPD$VW3i_Grp6|2q<kBHdHeED!^^U>U&d1rd#?)hK)+xvdqF^(28g5p4Y zQ@}$2ew=<K>MGRl-)Uo{;z^i^#w1jYXehZ*y3rdnGI=ZN9!>Zi{dsV=*PRY--Hwi* zC%w;L9Hfm-V-$~W#;MLiDR16M#4*=L8kIQ(6Or<vY8+;Xyes2wBZF>#o_D)$@L{qs znwpDHK|FU$WMM3I3E=3Dfe~7vHEWqxtO|8#jh1N<)-}+grUDkvK3-cqpN%);%wH3} zDtx;6Ybt_(T{i14%F0o!be7k?ZmBC^RW)Q-lo?wE$y6cs!?`D-)A?hi$E$AwSUA03 z{tKx%%64OD*7V?A0P-R&Tt7L7;O!DDyxtE&c@!#<=2!481XzM6bI%*+0K8R#g_B=* zjTZ#?9)iG>gCH65u|&BN1kc8yoLSTw1XI_Lts}dRY;gg(gtwqPU`RR_sJHIfo}Fub z{7Hi#8fRk#@fBW<vXS9mYTTnlZa}-`pNJu|FJr|YraPiHRyv-D#VzLX{x7}p?#=Mu O$8OTtNi_>v(f$v&7`1i) literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a5fde2f84fabd383350d16b66e1f4237eaba35e GIT binary patch literal 3569 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b078afeba1bcc9e734b2d7d602d4f776f25544cb GIT binary patch literal 6662 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 KR4ipnFa8gLifXk0 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6dcb59711bb4f10650784c7ef60b104c464b5c59 GIT binary patch literal 1901 zcmZ`(UvJws5GN^Fl4aR(TqkX|?hp1*z(8BKXuIv9C>kWjuwik##%MaBgQl2rs#t#< zigukq9tOD2ML$9x_Okb4A7T3rd>t^LFZ%$)FzilBx?<Q!@OZpC9)INB@kYIF|Mv2i z$CWA}zmm6_4*Xph*>fPAa2k=Ax-@1ki#1oHC}WWxSKLa$Yrq?>5u2_VTdoyX-D+&R zcA?WjS95Ez<2rHOt;Y?w5wEx_ano&rzQT=YHEy{r;7x8t=i;{8j@R5ZN<JgJ%I#-_ z+d=DaeW|(YytYd^&TGI#I+|MX_p>yb%D@ZbNh+kWcsL8QFili*nuNoY2VNA)K=@JC zp{nv#-;aY%MOAhOn-2y`>-D!){n5^sUVn3^w|jqctEbHEds~CA@As5G=sg;A3}qFz zUVm2^V2*RGlx%Hp4mMR4g(b`Gf3D1}dpkS5{@^u5gjDJKeipoDxM0eer6KP{K^!D9 zQ+5JivWY(ovLW8*tfBE;7}-T20dXlOF5{H5XT;UG#&wu=UV(QolsynZu;)kPKn(Fj zY#2El=rrR%I9bs7$2mD9+vJ<e3zmb&aaG)$zXLLw)0{0CXzYcSYYzz}N0;_U&KC5@ zfw{E(_RN-(f7w3R1OI@9_ThrM1USl&={QKTj;{19h(^kqh+r0`(@a%@8C+de3WFbs zcn{G1k#{E|ocS{7&V11wr4bKA)*X(!GP*w6pU?Qs>=W<SaQ}FG{l@6zX*|3J?I7t6 zx|48nB}_8uN70p=ad5)3d4|GbcyJU?MfZt}qgzq9-$iUsi>J!E2Y~NMcy)5DEYHIP z@w_@dR|^PXI(4W;ThykOhV#j}f1dg3nf*{hTWAd!7L4M(zlSK~^s%<k7W$%+Ym$ta z_&L`fvxTuRbK{UMETC*r4avfuf0~={^4CCHTR2k7Yf@h_G02_V&TEGZ1|6~6<meho zILT|}3gS|g6;3zM`>WiN#@G<A=3hWO&Agghu$wt#@-k<fZ4haVwSw0+NN$X^rCvn4 zp4W?L|FB1rChV-1JC{WcBtHRm3%vi8>jh>VF~2!g%YH9THN~H>)5e`khTf9zU|(&_ zUQn?P8YkD6w2+TLUN7W#<}PR&r~w?#;uOaVdUP3(+yT3l!tNnhHFNzrDfV9i`Knxz zEqPA1<(ga{nPUS^nIsO_ozJ!MoFW(XzS1%50!u=y0_j{32283Nr9(f$!c)~Z<)>`; zGBAyjVIV5FWerIih-(G$L>>?P17Q|Ruo4oM%7E-baTCPK9HucAwXkue%U~`Ae5jz{ z=};a|0)Yu4YDgR;m}~+QN2~x*<}?{6>C>ds5F03b7lnEPZj?R_6RvdbOJ7k>Y0^J% zO<zh8?q^^EHxVC!wYxe@lUX2Sz`Zjq9V<E$_=^;UR+9H|c>xHXk=+GCFwdbI&~@5? zRf{!Q8)~2h-C-?O>e{r)Y}$a)EGTjf%CwW!x2mHo{XYD$P*{l0^OWs*amuF=@{Z>n zP0I*)p7;PxFTlJ75dQ>Gpj-zIUn|4k3=lR1O8TAi=y5caQvn_YewPAkQJ|SyJ1y;D zDo%rmfiI$01_9$z#OZ&-QO1-A{0vkT-W5|rW<^4jsew5D3$n6qmp8qGnU^8>Hgo7j K`XO^zQ~MkA5YF5H literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/base.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/base.py new file mode 100644 index 0000000..80c474c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/base.py @@ -0,0 +1,252 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.dom import Node +from ..constants import namespaces, voidElements, spaceCharacters + +__all__ = ["DOCUMENT", "DOCTYPE", "TEXT", "ELEMENT", "COMMENT", "ENTITY", "UNKNOWN", + "TreeWalker", "NonRecursiveTreeWalker"] + +DOCUMENT = Node.DOCUMENT_NODE +DOCTYPE = Node.DOCUMENT_TYPE_NODE +TEXT = Node.TEXT_NODE +ELEMENT = Node.ELEMENT_NODE +COMMENT = Node.COMMENT_NODE +ENTITY = Node.ENTITY_NODE +UNKNOWN = "<#UNKNOWN#>" + +spaceCharacters = "".join(spaceCharacters) + + +class TreeWalker(object): + """Walks a tree yielding tokens + + Tokens are dicts that all have a ``type`` field specifying the type of the + token. + + """ + def __init__(self, tree): + """Creates a TreeWalker + + :arg tree: the tree to walk + + """ + self.tree = tree + + def __iter__(self): + raise NotImplementedError + + def error(self, msg): + """Generates an error token with the given message + + :arg msg: the error message + + :returns: SerializeError token + + """ + return {"type": "SerializeError", "data": msg} + + def emptyTag(self, namespace, name, attrs, hasChildren=False): + """Generates an EmptyTag token + + :arg namespace: the namespace of the token--can be ``None`` + + :arg name: the name of the element + + :arg attrs: the attributes of the element as a dict + + :arg hasChildren: whether or not to yield a SerializationError because + this tag shouldn't have children + + :returns: EmptyTag token + + """ + yield {"type": "EmptyTag", "name": name, + "namespace": namespace, + "data": attrs} + if hasChildren: + yield self.error("Void element has children") + + def startTag(self, namespace, name, attrs): + """Generates a StartTag token + + :arg namespace: the namespace of the token--can be ``None`` + + :arg name: the name of the element + + :arg attrs: the attributes of the element as a dict + + :returns: StartTag token + + """ + return {"type": "StartTag", + "name": name, + "namespace": namespace, + "data": attrs} + + def endTag(self, namespace, name): + """Generates an EndTag token + + :arg namespace: the namespace of the token--can be ``None`` + + :arg name: the name of the element + + :returns: EndTag token + + """ + return {"type": "EndTag", + "name": name, + "namespace": namespace} + + def text(self, data): + """Generates SpaceCharacters and Characters tokens + + Depending on what's in the data, this generates one or more + ``SpaceCharacters`` and ``Characters`` tokens. + + For example: + + >>> from html5lib.treewalkers.base import TreeWalker + >>> # Give it an empty tree just so it instantiates + >>> walker = TreeWalker([]) + >>> list(walker.text('')) + [] + >>> list(walker.text(' ')) + [{u'data': ' ', u'type': u'SpaceCharacters'}] + >>> list(walker.text(' abc ')) # doctest: +NORMALIZE_WHITESPACE + [{u'data': ' ', u'type': u'SpaceCharacters'}, + {u'data': u'abc', u'type': u'Characters'}, + {u'data': u' ', u'type': u'SpaceCharacters'}] + + :arg data: the text data + + :returns: one or more ``SpaceCharacters`` and ``Characters`` tokens + + """ + data = data + middle = data.lstrip(spaceCharacters) + left = data[:len(data) - len(middle)] + if left: + yield {"type": "SpaceCharacters", "data": left} + data = middle + middle = data.rstrip(spaceCharacters) + right = data[len(middle):] + if middle: + yield {"type": "Characters", "data": middle} + if right: + yield {"type": "SpaceCharacters", "data": right} + + def comment(self, data): + """Generates a Comment token + + :arg data: the comment + + :returns: Comment token + + """ + return {"type": "Comment", "data": data} + + def doctype(self, name, publicId=None, systemId=None): + """Generates a Doctype token + + :arg name: + + :arg publicId: + + :arg systemId: + + :returns: the Doctype token + + """ + return {"type": "Doctype", + "name": name, + "publicId": publicId, + "systemId": systemId} + + def entity(self, name): + """Generates an Entity token + + :arg name: the entity name + + :returns: an Entity token + + """ + return {"type": "Entity", "name": name} + + def unknown(self, nodeType): + """Handles unknown node types""" + return self.error("Unknown node type: " + nodeType) + + +class NonRecursiveTreeWalker(TreeWalker): + def getNodeDetails(self, node): + raise NotImplementedError + + def getFirstChild(self, node): + raise NotImplementedError + + def getNextSibling(self, node): + raise NotImplementedError + + def getParentNode(self, node): + raise NotImplementedError + + def __iter__(self): + currentNode = self.tree + while currentNode is not None: + details = self.getNodeDetails(currentNode) + type, details = details[0], details[1:] + hasChildren = False + + if type == DOCTYPE: + yield self.doctype(*details) + + elif type == TEXT: + for token in self.text(*details): + yield token + + elif type == ELEMENT: + namespace, name, attributes, hasChildren = details + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + for token in self.emptyTag(namespace, name, attributes, + hasChildren): + yield token + hasChildren = False + else: + yield self.startTag(namespace, name, attributes) + + elif type == COMMENT: + yield self.comment(details[0]) + + elif type == ENTITY: + yield self.entity(details[0]) + + elif type == DOCUMENT: + hasChildren = True + + else: + yield self.unknown(details[0]) + + if hasChildren: + firstChild = self.getFirstChild(currentNode) + else: + firstChild = None + + if firstChild is not None: + currentNode = firstChild + else: + while currentNode is not None: + details = self.getNodeDetails(currentNode) + type, details = details[0], details[1:] + if type == ELEMENT: + namespace, name, attributes, hasChildren = details + if (namespace and namespace != namespaces["html"]) or name not in voidElements: + yield self.endTag(namespace, name) + if self.tree is currentNode: + currentNode = None + break + nextSibling = self.getNextSibling(currentNode) + if nextSibling is not None: + currentNode = nextSibling + break + else: + currentNode = self.getParentNode(currentNode) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/dom.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/dom.py new file mode 100644 index 0000000..b0c89b0 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/dom.py @@ -0,0 +1,43 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.dom import Node + +from . import base + + +class TreeWalker(base.NonRecursiveTreeWalker): + def getNodeDetails(self, node): + if node.nodeType == Node.DOCUMENT_TYPE_NODE: + return base.DOCTYPE, node.name, node.publicId, node.systemId + + elif node.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE): + return base.TEXT, node.nodeValue + + elif node.nodeType == Node.ELEMENT_NODE: + attrs = {} + for attr in list(node.attributes.keys()): + attr = node.getAttributeNode(attr) + if attr.namespaceURI: + attrs[(attr.namespaceURI, attr.localName)] = attr.value + else: + attrs[(None, attr.name)] = attr.value + return (base.ELEMENT, node.namespaceURI, node.nodeName, + attrs, node.hasChildNodes()) + + elif node.nodeType == Node.COMMENT_NODE: + return base.COMMENT, node.nodeValue + + elif node.nodeType in (Node.DOCUMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE): + return (base.DOCUMENT,) + + else: + return base.UNKNOWN, node.nodeType + + def getFirstChild(self, node): + return node.firstChild + + def getNextSibling(self, node): + return node.nextSibling + + def getParentNode(self, node): + return node.parentNode diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/etree.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/etree.py new file mode 100644 index 0000000..95fc0c1 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/etree.py @@ -0,0 +1,130 @@ +from __future__ import absolute_import, division, unicode_literals + +from collections import OrderedDict +import re + +from pip._vendor.six import string_types + +from . import base +from .._utils import moduleFactoryFactory + +tag_regexp = re.compile("{([^}]*)}(.*)") + + +def getETreeBuilder(ElementTreeImplementation): + ElementTree = ElementTreeImplementation + ElementTreeCommentType = ElementTree.Comment("asd").tag + + class TreeWalker(base.NonRecursiveTreeWalker): # pylint:disable=unused-variable + """Given the particular ElementTree representation, this implementation, + to avoid using recursion, returns "nodes" as tuples with the following + content: + + 1. The current element + + 2. The index of the element relative to its parent + + 3. A stack of ancestor elements + + 4. A flag "text", "tail" or None to indicate if the current node is a + text node; either the text or tail of the current element (1) + """ + def getNodeDetails(self, node): + if isinstance(node, tuple): # It might be the root Element + elt, _, _, flag = node + if flag in ("text", "tail"): + return base.TEXT, getattr(elt, flag) + else: + node = elt + + if not(hasattr(node, "tag")): + node = node.getroot() + + if node.tag in ("DOCUMENT_ROOT", "DOCUMENT_FRAGMENT"): + return (base.DOCUMENT,) + + elif node.tag == "<!DOCTYPE>": + return (base.DOCTYPE, node.text, + node.get("publicId"), node.get("systemId")) + + elif node.tag == ElementTreeCommentType: + return base.COMMENT, node.text + + else: + assert isinstance(node.tag, string_types), type(node.tag) + # This is assumed to be an ordinary element + match = tag_regexp.match(node.tag) + if match: + namespace, tag = match.groups() + else: + namespace = None + tag = node.tag + attrs = OrderedDict() + for name, value in list(node.attrib.items()): + match = tag_regexp.match(name) + if match: + attrs[(match.group(1), match.group(2))] = value + else: + attrs[(None, name)] = value + return (base.ELEMENT, namespace, tag, + attrs, len(node) or node.text) + + def getFirstChild(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + element, key, parents, flag = node, None, [], None + + if flag in ("text", "tail"): + return None + else: + if element.text: + return element, key, parents, "text" + elif len(element): + parents.append(element) + return element[0], 0, parents, None + else: + return None + + def getNextSibling(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + return None + + if flag == "text": + if len(element): + parents.append(element) + return element[0], 0, parents, None + else: + return None + else: + if element.tail and flag != "tail": + return element, key, parents, "tail" + elif key < len(parents[-1]) - 1: + return parents[-1][key + 1], key + 1, parents, None + else: + return None + + def getParentNode(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + return None + + if flag == "text": + if not parents: + return element + else: + return element, key, parents, None + else: + parent = parents.pop() + if not parents: + return parent + else: + assert list(parents[-1]).count(parent) == 1 + return parent, list(parents[-1]).index(parent), parents, None + + return locals() + +getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py new file mode 100644 index 0000000..e81ddf3 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py @@ -0,0 +1,213 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from lxml import etree +from ..treebuilders.etree import tag_regexp + +from . import base + +from .. import _ihatexml + + +def ensure_str(s): + if s is None: + return None + elif isinstance(s, text_type): + return s + else: + return s.decode("ascii", "strict") + + +class Root(object): + def __init__(self, et): + self.elementtree = et + self.children = [] + + try: + if et.docinfo.internalDTD: + self.children.append(Doctype(self, + ensure_str(et.docinfo.root_name), + ensure_str(et.docinfo.public_id), + ensure_str(et.docinfo.system_url))) + except AttributeError: + pass + + try: + node = et.getroot() + except AttributeError: + node = et + + while node.getprevious() is not None: + node = node.getprevious() + while node is not None: + self.children.append(node) + node = node.getnext() + + self.text = None + self.tail = None + + def __getitem__(self, key): + return self.children[key] + + def getnext(self): + return None + + def __len__(self): + return 1 + + +class Doctype(object): + def __init__(self, root_node, name, public_id, system_id): + self.root_node = root_node + self.name = name + self.public_id = public_id + self.system_id = system_id + + self.text = None + self.tail = None + + def getnext(self): + return self.root_node.children[1] + + +class FragmentRoot(Root): + def __init__(self, children): + self.children = [FragmentWrapper(self, child) for child in children] + self.text = self.tail = None + + def getnext(self): + return None + + +class FragmentWrapper(object): + def __init__(self, fragment_root, obj): + self.root_node = fragment_root + self.obj = obj + if hasattr(self.obj, 'text'): + self.text = ensure_str(self.obj.text) + else: + self.text = None + if hasattr(self.obj, 'tail'): + self.tail = ensure_str(self.obj.tail) + else: + self.tail = None + + def __getattr__(self, name): + return getattr(self.obj, name) + + def getnext(self): + siblings = self.root_node.children + idx = siblings.index(self) + if idx < len(siblings) - 1: + return siblings[idx + 1] + else: + return None + + def __getitem__(self, key): + return self.obj[key] + + def __bool__(self): + return bool(self.obj) + + def getparent(self): + return None + + def __str__(self): + return str(self.obj) + + def __unicode__(self): + return str(self.obj) + + def __len__(self): + return len(self.obj) + + +class TreeWalker(base.NonRecursiveTreeWalker): + def __init__(self, tree): + # pylint:disable=redefined-variable-type + if isinstance(tree, list): + self.fragmentChildren = set(tree) + tree = FragmentRoot(tree) + else: + self.fragmentChildren = set() + tree = Root(tree) + base.NonRecursiveTreeWalker.__init__(self, tree) + self.filter = _ihatexml.InfosetFilter() + + def getNodeDetails(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key + return base.TEXT, ensure_str(getattr(node, key)) + + elif isinstance(node, Root): + return (base.DOCUMENT,) + + elif isinstance(node, Doctype): + return base.DOCTYPE, node.name, node.public_id, node.system_id + + elif isinstance(node, FragmentWrapper) and not hasattr(node, "tag"): + return base.TEXT, ensure_str(node.obj) + + elif node.tag == etree.Comment: + return base.COMMENT, ensure_str(node.text) + + elif node.tag == etree.Entity: + return base.ENTITY, ensure_str(node.text)[1:-1] # strip &; + + else: + # This is assumed to be an ordinary element + match = tag_regexp.match(ensure_str(node.tag)) + if match: + namespace, tag = match.groups() + else: + namespace = None + tag = ensure_str(node.tag) + attrs = {} + for name, value in list(node.attrib.items()): + name = ensure_str(name) + value = ensure_str(value) + match = tag_regexp.match(name) + if match: + attrs[(match.group(1), match.group(2))] = value + else: + attrs[(None, name)] = value + return (base.ELEMENT, namespace, self.filter.fromXmlName(tag), + attrs, len(node) > 0 or node.text) + + def getFirstChild(self, node): + assert not isinstance(node, tuple), "Text nodes have no children" + + assert len(node) or node.text, "Node has no children" + if node.text: + return (node, "text") + else: + return node[0] + + def getNextSibling(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key + if key == "text": + # XXX: we cannot use a "bool(node) and node[0] or None" construct here + # because node[0] might evaluate to False if it has no child element + if len(node): + return node[0] + else: + return None + else: # tail + return node.getnext() + + return (node, "tail") if node.tail else node.getnext() + + def getParentNode(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key + if key == "text": + return node + # else: fallback to "normal" processing + elif node in self.fragmentChildren: + return None + + return node.getparent() diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py new file mode 100644 index 0000000..7483be2 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py @@ -0,0 +1,69 @@ +from __future__ import absolute_import, division, unicode_literals + +from genshi.core import QName +from genshi.core import START, END, XML_NAMESPACE, DOCTYPE, TEXT +from genshi.core import START_NS, END_NS, START_CDATA, END_CDATA, PI, COMMENT + +from . import base + +from ..constants import voidElements, namespaces + + +class TreeWalker(base.TreeWalker): + def __iter__(self): + # Buffer the events so we can pass in the following one + previous = None + for event in self.tree: + if previous is not None: + for token in self.tokens(previous, event): + yield token + previous = event + + # Don't forget the final event! + if previous is not None: + for token in self.tokens(previous, None): + yield token + + def tokens(self, event, next): + kind, data, _ = event + if kind == START: + tag, attribs = data + name = tag.localname + namespace = tag.namespace + converted_attribs = {} + for k, v in attribs: + if isinstance(k, QName): + converted_attribs[(k.namespace, k.localname)] = v + else: + converted_attribs[(None, k)] = v + + if namespace == namespaces["html"] and name in voidElements: + for token in self.emptyTag(namespace, name, converted_attribs, + not next or next[0] != END or + next[1] != tag): + yield token + else: + yield self.startTag(namespace, name, converted_attribs) + + elif kind == END: + name = data.localname + namespace = data.namespace + if namespace != namespaces["html"] or name not in voidElements: + yield self.endTag(namespace, name) + + elif kind == COMMENT: + yield self.comment(data) + + elif kind == TEXT: + for token in self.text(data): + yield token + + elif kind == DOCTYPE: + yield self.doctype(*data) + + elif kind in (XML_NAMESPACE, DOCTYPE, START_NS, END_NS, + START_CDATA, END_CDATA, PI): + pass + + else: + yield self.unknown(kind) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__init__.py new file mode 100644 index 0000000..847bf93 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__init__.py @@ -0,0 +1,2 @@ +from .package_data import __version__ +from .core import * diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4827ad6640618778244a102fdf936d70b59a4de8 GIT binary patch literal 262 zcmX|5!Ab)$6il{7MBBT+utJTc6+uM&0x$L?g-4o~En%}sNaEV|YrOg;{=;4c!C&y? zOAijrF!LS^vzSiLzTZFBcZ{(w;y)^KkHmCAf(*H39e?4x_{vr*hNEXzkAFD5Yd)L< z^g1Tv9RNjs`BaaFNsy|QTMa0)jHPiHD<Aa-izgJ0^6Ny1rk7cZUPjS)i_{}jE3%z8 zn_Z8~bPG3Xvv22%=J3|3Yr@uvl?W!xj7wQsJ6m@8fN7V?@kpBE&_`j=NdaJ-$pBYj SKb+oo9$&3~D9ckBHQ|4n^GUh@ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5bd7c1d300044ed45b53ef0e6b3f03fcb5997b8 GIT binary patch literal 3109 zcmchZ&65*F6u`UZJCkg7i3oy-0WO9rHXvAd5L{&`i%SloQZ-6V%}#gL$xbGrd$Pbf zp)A5t{TuM8XODXJf9Uc?l~tU$dy)5gvYYG&6qHqVs^4_K?)1m&-+SE`7Z&`#AOHEy zlNupU$Xv3ayaHK12EhoUDe2RI_Km>kn}ON40;_KaHYLnpX6giv{<?w7-JZv+2@NWr z5oR;z5n&E@dj7-=e9*Ye1C0loDrjn;sW2ZjK4=y|QwL3z)j(6@s9T&^!6N7uSRHhA zty==!5?f?Tk4SKcnKw!6&{GP_Y}v};Sv+7|IgFRzD2>*5s+>{zt=w4cd~#igfp`jk zAe|BHn|!_e<ok!ue*fv&A3xuYQN5i^D6Bx1O%R*}l##%IEx?u^(ZFP|QD#HQVh${# zqU>uhcdQ(lizLot{5vN6V!j4hE`ulxMmJ1xBnRvDXkkp~gg&GNl_!~fljKGL_1r|+ zHDF+;BP#H(t>%}R91Vv9k#pAMxQXVsQO43FTW_BJ?)><)BEp4^EkpS5Da)2{psbwk zK=h+r7+5h=p0!M6NuG9<#iBd{!{K=H7b2FR$3GkGp-48PoVPb4(e4gX#)WLh8|^&3 z&|SN?$u7yu;Ro^B{f!G3yIXhr@p(w=S^JCjFd3dpGMPtddhSx6Z!vjKqEhE@lV@xo z+6l{|HXcyCJiM>hgd3E&YGQb_ZdlYZwrbj(%jJ>&|JIx{;(mjQDlAptsR~4>Wr_tX z*HJ8@Kr@!&5SFm#8<1bH#}e00i|Ui!{@BV3!z}9aFjRgR_6KZ~V!0NEcSccKwrKN} zE1AuyOL}4tCPgTu1;R6YU!W$2ypxcL70B{1h#kx+Gr+%0?O&E^+{j|V`#gh#y{>&s z#5f`*JUc9FzJG(lOZaw?@1ACRY%z0e7nb;{u$Xs@$W`WGomH-otWlT}_5KxtJ+Nh+ zj2&i;-FxpB)+)JucI*{S&&ut>L;s<qaK*#IW%gw<b_+LmP><z1>=wkJo?AE*TG&Tn z6y0i<tp(JymsMZY%Vt~%j5>-g&pX`He<6vZ(4a-j)BdM%QA^<{OAz~z4RRR@u539> zlUzB`a0s3u(2ANTW%UM0)~f8GO4;2ciy)loXeL!H7g2)#j{_=4a5+kI@atp?hSq)d zaH#6x+Nj&*A}qb?BupsJgCKO<?R*N(2Q{4y2W#k#)Tec=TQcjkMz>Dw2V!~m*qxRo z8n_|kULafIG>U^LeG?kqfh>_lj|!~+Cq`Fw{C@$Xf5GT4Vbm*QaBfZvaVfWYHb&yH zm7M^lu%u%%vnK{HM|*I`Ve6FT2gon5oK9H=el^ReuWFVbypUx#_vTps6<BtsELV0| z{z0?s?_#-9>}9$3`YbCul5vuVBVZfN^*q!wo=d2!b5Q$<)bT!xxpJp`i??u;V<40X zm!UY0ReVxtxW(I0+Q+syf$a!^Kq|$%D4Hlvp_oyFVQt27896@&o%|5Q4#%cXYo-U( z`kLOC@NDekc?!=C&)d;?AJ6Z>gmWvKMcp&da24`4&sg8ZGe(XT?0~n&Eat*(Z>ZYM zT=1xWOC&iL9k^Qdc+t!hvk6-;%sP%Ybs((2?u4K72(I~8obW76(3_hO>$@hzTj3gZ zXoAQ|k20DY6Vfxagt(nMIS|i`AK^}DnH^=}tDxm73-7hrt)?2u?CL3_me{2$Pe-U4 zkOpSEtIf7u0}bp6-e!(|Zb((pkBS=^yoc~2oXw+SjyQulG@if>9dx#;y3S#ub+`(} z{XTS(cnSn!qd^_`8TuzKg09t2Ry+`Mn<*o__5^&Ei3=c<0T+QA5BkF-<)!D~%GB{s yb)@EOf27rGJ+Q+R-M#z3)f~7P@1ycnaTS4-2-*pV{qRmO8b=zZ8m+_TVe>fz;Fp#F literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc9ac0903355343e6ee28fbc31615a6f9183d9a5 GIT binary patch literal 622 zcma)3!EO^V5VbeiWK+=-Kd{%J7N@ib4hT`T9CF!9!v!H#8_xu->a{J~4Q<4U_CvVx zCH%u)kr4a>CuTM(s*sQvY37aX@za}`!`<DT@1MWE`yqt*M*hb#%3hJjJqjQ|8nM`- zB+OuNE8b=>gq&~yBN!77p*R!M$xlgNrm~ZdG-qs#%y>c`3kpem6gQHpWkr=EwAuku zmYaHs=8Fh975y^Ghh|+TRO>pZl{0`LDt)1nIan>P)^HS`oj=vf>x+ZK)#gL1XJqfK zS}5Q6{l>;r8?%4Z;s)YX<jdaA*J!~7)qt&)cCD||V}IR^7w-7%WIi9VNLDLk7*qW3 zE&#V(1ZL<v*oF}uyUD`6u?-h6=N<p#pZpK#CDGh(<R=M&CY4p2z4>W%Tt1o2o|oV- zme!^6GBu`&SlYTpAJCURxa71mG|h*VOY_znY|$o!*CDvTi-~`WEAD>p+|$Mis%hR0 pwF}tgEM4~l39LHs^F1D3Sm-+~UbGG_4Zh^9_uDRHkrjht@EiCfiRAzQ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/core.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/core.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffe5ffff9ef936359701d5146900c6eaa7114d9f GIT binary patch literal 9162 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 S!lYL&_=UrT1Kx!9$o~VdvqQrG literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9795ab9e25f5a8e92d115be26251c852f0261f71 GIT binary patch literal 29801 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 T!0)%f|1Y;dREyt!&-&j0@j^4I literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d3a106d6ee166dea52cd62379c243476f4e731a GIT binary patch literal 1823 zcmZuxOKT)I5SG;4<Jqwd`$)1j2^-<S;sNiB9~%O}`yesNWpQBF5HK6s?UrWTJ3Ufc z(u^PUu!l)*`4PG1m*f}Z($_%1e<2sAN<DsLi5k61s#5j$Rn^wwV(ahU{&@RmgOI<- zt;S&e61rW7L6ChSs9-tWry>yH&t#v8NHky$#GGit9Ev-l1#=|W8`7Rn?odKn-)Cc~ zc*66{I<9*>Q%?4!v1@#o2+2nU3RjPGA$y}dKWoEPJ52JNtI_aK8a&Ol>T@$vwgsD1 zD=X8H1GBemrFvM5oCIYf3nQ&mE^(PwsP2v=?`bn^t*%;^7`L&;r4k$MHD2#G{eH8} zJDpCu!}pHRUu93=aa27XN$X9moFtZ?@|pQoru?xsSwB-r?tk#b3i!lbHkAB_)m-;i zzwmyy+nv@0U`TdTfW$YznqdDHy8RUfM@llK6WS*eCW1+DY8-W}q*M5I$WMopunYx# zNNU-Dm{%n&!)1aa%9nwiB{E><)$t>c1t_aeeqqaG5|!*-;KCBP0i8&ICf=B`DW!04 z5*$DJkvO<DrNCX3d<u@fzJl_9=;MF|FeL#Ul}d!!B&sj%*DVfhhIG8{p^ewCv5sr- zV?-a}UgLI@9s!Vv`wyDl%2lZF#7HhrlhoyBa7$YWG~DQUQsazoKLhbLatj+EoLdb% zWSy2b_S(Bwn^LJ3Qs6JxO!f1dK$=Aa-`?h1o4iC@;G)tF@48WuOWX0*E|5oq!^I^u z6Tqt7s2WxqCq)%`FsdMzs%j)f0d}gz7?6T@<N7S}=0GRH%!sS`S~bR9)u_R&T6qFz zCnj^UqFJ?=j*NlOu1)+-%w2f)AKfiXHcp)EjuX@E>0Cg1b<;uD<r}@j)3JDJzly(1 z56=c0TfOs>VY&{juey8PA}gL`3h>MGCr^j+T-Z~KLf>P^TcJ%i6DsKf6}3y9;;edb zy^DKB553DR@Wg%s18FvC2;Y5rmo8C8Kcb(}CNuZpB*lV)4QK2=_!nSNLNGpuQ2vHM z@Uh(s4l@69ZB|8|-zorayr>@T;f*E?pF_9aF!lTE3`254=>8D|3LklaWB8KvutG(< z<^jkJYUjuxwy<7azQ24Q%zU5~H6J_;Yzle9<_aiYIq?wI*MB<aEzX=chYhB=pi?$s zj=qERhJ<620Mm64nq3$8)MZPM&Qto9O+rZAumq<9GN5{=j0Qx7j8I~BMev4{n9@)n zpd5^A-D|xD>Onae<2@1L@18%~kxrUnrXb>b`~YZ-4|osQw^&Lw*KjZ^m^Is2%?|42 zLC1%?2W#)UcI3gX8iyHFV^_`BbDYbbGl+n};?|z4LVUy^$5q2ed|U;EwpEBXAy2aY zk*jF@A-wl)LJSJNOEUEsOw<9!T67_3LSQY?kS#!%VZa%V?=`BqI2JmMW3vQ%A9dc* k+9$ko>m>{dgMm~vw})Dca`_y+wiwGHYqI9Y&7c|n3o_^14FCWD literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7aace283edd20a06f772cc29324fda18125c844 GIT binary patch literal 216 zcmXr!<>h*|;CPHE0|UcjAcg}*Aj<)Wi#dQq3PTh_3S%&XCQ}u&k)DO0CgUyc`1rEa zqT<Z_y!iN)3`I;pRbb**k$yo@W?5oMs(x8wk$zf!P6|+&esZ>cNseJ!Qbk#cNwImn zX>w9!wxMxaRe5f*0T86;>4)eSWESXV<`tJD=H%#_<fc}o6jv031i=_+TV6_jk$z@M mUZQ?MVsdt3dTM-1Vo9Q2LFFwDo80`A(wtN~kgJP<m;nH3^FChy literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..339e05e04a1c53cf7be36a1e0afe2e0694d9d104 GIT binary patch literal 241811 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�@!zaoC|wnVNCc5LLY@E34IlwBJ@*unh;j# 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 TY3|;<S?jg`!T+^z-12__M4Nn= literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/codec.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/codec.py new file mode 100644 index 0000000..98c65ea --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/codec.py @@ -0,0 +1,118 @@ +from .core import encode, decode, alabel, ulabel, IDNAError +import codecs +import re + +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') + +class Codec(codecs.Codec): + + def encode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return "", 0 + + return encode(data), len(data) + + def decode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return u"", 0 + + return decode(data), len(data) + +class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + def _buffer_encode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return ("", 0) + + labels = _unicode_dots_re.split(data) + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = '.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = '.' + + result = [] + size = 0 + for label in labels: + result.append(alabel(label)) + if size: + size += 1 + size += len(label) + + # Join with U+002E + result = ".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return (u"", 0) + + # IDNA allows decoding to operate on Unicode strings, too. + if isinstance(data, unicode): + labels = _unicode_dots_re.split(data) + else: + # Must be ASCII string + data = str(data) + unicode(data, "ascii") + labels = data.split(".") + + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = u'.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = u'.' + + result = [] + size = 0 + for label in labels: + result.append(ulabel(label)) + if size: + size += 1 + size += len(label) + + result = u".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + +class StreamReader(Codec, codecs.StreamReader): + pass + +def getregentry(): + return codecs.CodecInfo( + name='idna', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/compat.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/compat.py new file mode 100644 index 0000000..4d47f33 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/compat.py @@ -0,0 +1,12 @@ +from .core import * +from .codec import * + +def ToASCII(label): + return encode(label) + +def ToUnicode(label): + return decode(label) + +def nameprep(s): + raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") + diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/core.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/core.py new file mode 100644 index 0000000..104624a --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/idnadata.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/idnadata.py new file mode 100644 index 0000000..a80c959 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/intranges.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/intranges.py new file mode 100644 index 0000000..fa8a735 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/intranges.py @@ -0,0 +1,53 @@ +""" +Given a list of integers, made up of (hopefully) a small number of long runs +of consecutive integers, compute a representation of the form +((start1, end1), (start2, end2) ...). Then answer the question "was x present +in the original list?" in time O(log(# runs)). +""" + +import bisect + +def intranges_from_list(list_): + """Represent a list of integers as a sequence of ranges: + ((start_0, end_0), (start_1, end_1), ...), such that the original + integers are exactly those x such that start_i <= x < end_i for some i. + + Ranges are encoded as single integers (start << 32 | end), not as tuples. + """ + + sorted_list = sorted(list_) + ranges = [] + last_write = -1 + for i in range(len(sorted_list)): + if i+1 < len(sorted_list): + if sorted_list[i] == sorted_list[i+1]-1: + continue + current_range = sorted_list[last_write+1:i+1] + ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) + last_write = i + + return tuple(ranges) + +def _encode_range(start, end): + return (start << 32) | end + +def _decode_range(r): + return (r >> 32), (r & ((1 << 32) - 1)) + + +def intranges_contain(int_, ranges): + """Determine if `int_` falls into one of the ranges in `ranges`.""" + tuple_ = _encode_range(int_, 0) + pos = bisect.bisect_left(ranges, tuple_) + # we could be immediately ahead of a tuple (start, end) + # with start < int_ <= end + if pos > 0: + left, right = _decode_range(ranges[pos-1]) + if left <= int_ < right: + return True + # or we could be immediately behind a tuple (int_, end) + if pos < len(ranges): + left, _ = _decode_range(ranges[pos]) + if left == int_: + return True + return False diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/package_data.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/package_data.py new file mode 100644 index 0000000..257e898 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/package_data.py @@ -0,0 +1,2 @@ +__version__ = '2.8' + diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/uts46data.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/idna/uts46data.py new file mode 100644 index 0000000..a68ed4c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/ipaddress.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/ipaddress.py new file mode 100644 index 0000000..f2d0766 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/ipaddress.py @@ -0,0 +1,2419 @@ +# Copyright 2007 Google Inc. +# Licensed to PSF under a Contributor Agreement. + +"""A fast, lightweight IPv4/IPv6 manipulation library in Python. + +This library is used to create/poke/manipulate IPv4 and IPv6 addresses +and networks. + +""" + +from __future__ import unicode_literals + + +import itertools +import struct + +__version__ = '1.0.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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__init__.py new file mode 100644 index 0000000..a6f44a5 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__init__.py @@ -0,0 +1,347 @@ +# -*- coding: utf-8 -*- + +""" +lockfile.py - Platform-independent advisory file locks. + +Requires Python 2.5 unless you apply 2.4.diff +Locking is done on a per-thread basis instead of a per-process basis. + +Usage: + +>>> lock = LockFile('somefile') +>>> try: +... lock.acquire() +... except AlreadyLocked: +... print 'somefile', 'is locked already.' +... except LockFailed: +... print 'somefile', 'can\\'t be locked.' +... else: +... print 'got lock' +got lock +>>> print lock.is_locked() +True +>>> lock.release() + +>>> lock = LockFile('somefile') +>>> print lock.is_locked() +False +>>> with lock: +... print lock.is_locked() +True +>>> print lock.is_locked() +False + +>>> lock = LockFile('somefile') +>>> # It is okay to lock twice from the same thread... +>>> with lock: +... lock.acquire() +... +>>> # Though no counter is kept, so you can't unlock multiple times... +>>> print lock.is_locked() +False + +Exceptions: + + Error - base class for other exceptions + LockError - base class for all locking exceptions + AlreadyLocked - Another thread or process already holds the lock + LockFailed - Lock failed for some other reason + UnlockError - base class for all unlocking exceptions + AlreadyUnlocked - File was not locked. + NotMyLock - File was locked but not by the current thread/process +""" + +from __future__ import absolute_import + +import functools +import os +import socket +import threading +import warnings + +# Work with PEP8 and non-PEP8 versions of threading module. +if not hasattr(threading, "current_thread"): + threading.current_thread = threading.currentThread +if not hasattr(threading.Thread, "get_name"): + threading.Thread.get_name = threading.Thread.getName + +__all__ = ['Error', 'LockError', 'LockTimeout', 'AlreadyLocked', + 'LockFailed', 'UnlockError', 'NotLocked', 'NotMyLock', + 'LinkFileLock', 'MkdirFileLock', 'SQLiteFileLock', + 'LockBase', 'locked'] + + +class Error(Exception): + """ + Base class for other exceptions. + + >>> try: + ... raise Error + ... except Exception: + ... pass + """ + pass + + +class LockError(Error): + """ + Base class for error arising from attempts to acquire the lock. + + >>> try: + ... raise LockError + ... except Error: + ... pass + """ + pass + + +class LockTimeout(LockError): + """Raised when lock creation fails within a user-defined period of time. + + >>> try: + ... raise LockTimeout + ... except LockError: + ... pass + """ + pass + + +class AlreadyLocked(LockError): + """Some other thread/process is locking the file. + + >>> try: + ... raise AlreadyLocked + ... except LockError: + ... pass + """ + pass + + +class LockFailed(LockError): + """Lock file creation failed for some other reason. + + >>> try: + ... raise LockFailed + ... except LockError: + ... pass + """ + pass + + +class UnlockError(Error): + """ + Base class for errors arising from attempts to release the lock. + + >>> try: + ... raise UnlockError + ... except Error: + ... pass + """ + pass + + +class NotLocked(UnlockError): + """Raised when an attempt is made to unlock an unlocked file. + + >>> try: + ... raise NotLocked + ... except UnlockError: + ... pass + """ + pass + + +class NotMyLock(UnlockError): + """Raised when an attempt is made to unlock a file someone else locked. + + >>> try: + ... raise NotMyLock + ... except UnlockError: + ... pass + """ + pass + + +class _SharedBase(object): + def __init__(self, path): + self.path = path + + def acquire(self, timeout=None): + """ + Acquire the lock. + + * If timeout is omitted (or None), wait forever trying to lock the + file. + + * If timeout > 0, try to acquire the lock for that many seconds. If + the lock period expires and the file is still locked, raise + LockTimeout. + + * If timeout <= 0, raise AlreadyLocked immediately if the file is + already locked. + """ + raise NotImplemented("implement in subclass") + + def release(self): + """ + Release the lock. + + If the file is not locked, raise NotLocked. + """ + raise NotImplemented("implement in subclass") + + def __enter__(self): + """ + Context manager support. + """ + self.acquire() + return self + + def __exit__(self, *_exc): + """ + Context manager support. + """ + self.release() + + def __repr__(self): + return "<%s: %r>" % (self.__class__.__name__, self.path) + + +class LockBase(_SharedBase): + """Base class for platform-specific lock classes.""" + def __init__(self, path, threaded=True, timeout=None): + """ + >>> lock = LockBase('somefile') + >>> lock = LockBase('somefile', threaded=False) + """ + super(LockBase, self).__init__(path) + self.lock_file = os.path.abspath(path) + ".lock" + self.hostname = socket.gethostname() + self.pid = os.getpid() + if threaded: + t = threading.current_thread() + # Thread objects in Python 2.4 and earlier do not have ident + # attrs. Worm around that. + ident = getattr(t, "ident", hash(t)) + self.tname = "-%x" % (ident & 0xffffffff) + else: + self.tname = "" + dirname = os.path.dirname(self.lock_file) + + # unique name is mostly about the current process, but must + # also contain the path -- otherwise, two adjacent locked + # files conflict (one file gets locked, creating lock-file and + # unique file, the other one gets locked, creating lock-file + # and overwriting the already existing lock-file, then one + # gets unlocked, deleting both lock-file and unique file, + # finally the last lock errors out upon releasing. + self.unique_name = os.path.join(dirname, + "%s%s.%s%s" % (self.hostname, + self.tname, + self.pid, + hash(self.path))) + self.timeout = timeout + + def is_locked(self): + """ + Tell whether or not the file is locked. + """ + raise NotImplemented("implement in subclass") + + def i_am_locking(self): + """ + Return True if this object is locking the file. + """ + raise NotImplemented("implement in subclass") + + def break_lock(self): + """ + Remove a lock. Useful if a locking thread failed to unlock. + """ + raise NotImplemented("implement in subclass") + + def __repr__(self): + return "<%s: %r -- %r>" % (self.__class__.__name__, self.unique_name, + self.path) + + +def _fl_helper(cls, mod, *args, **kwds): + warnings.warn("Import from %s module instead of lockfile package" % mod, + DeprecationWarning, stacklevel=2) + # This is a bit funky, but it's only for awhile. The way the unit tests + # are constructed this function winds up as an unbound method, so it + # actually takes three args, not two. We want to toss out self. + if not isinstance(args[0], str): + # We are testing, avoid the first arg + args = args[1:] + if len(args) == 1 and not kwds: + kwds["threaded"] = True + return cls(*args, **kwds) + + +def LinkFileLock(*args, **kwds): + """Factory function provided for backwards compatibility. + + Do not use in new code. Instead, import LinkLockFile from the + lockfile.linklockfile module. + """ + from . import linklockfile + return _fl_helper(linklockfile.LinkLockFile, "lockfile.linklockfile", + *args, **kwds) + + +def MkdirFileLock(*args, **kwds): + """Factory function provided for backwards compatibility. + + Do not use in new code. Instead, import MkdirLockFile from the + lockfile.mkdirlockfile module. + """ + from . import mkdirlockfile + return _fl_helper(mkdirlockfile.MkdirLockFile, "lockfile.mkdirlockfile", + *args, **kwds) + + +def SQLiteFileLock(*args, **kwds): + """Factory function provided for backwards compatibility. + + Do not use in new code. Instead, import SQLiteLockFile from the + lockfile.mkdirlockfile module. + """ + from . import sqlitelockfile + return _fl_helper(sqlitelockfile.SQLiteLockFile, "lockfile.sqlitelockfile", + *args, **kwds) + + +def locked(path, timeout=None): + """Decorator which enables locks for decorated function. + + Arguments: + - path: path for lockfile. + - timeout (optional): Timeout for acquiring lock. + + Usage: + @locked('/var/run/myname', timeout=0) + def myname(...): + ... + """ + def decor(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + lock = FileLock(path, timeout=timeout) + lock.acquire() + try: + return func(*args, **kwargs) + finally: + lock.release() + return wrapper + return decor + + +if hasattr(os, "link"): + from . import linklockfile as _llf + LockFile = _llf.LinkLockFile +else: + from . import mkdirlockfile as _mlf + LockFile = _mlf.MkdirLockFile + +FileLock = LockFile diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..672284f6e2694d135a9a8ce09cf97f14cfa35c3c GIT binary patch literal 9914 zcmcgy+m9R9d7l{$$sw1!TCFU}l5fYBRx74juG}~cqR6TgJF=D9+eBWc1`%K|%X26W zcgUg747FNfg#cX@(o3464+Yw!MT=h0{0V*RQ~T71qEGW$pn(5?zO)bN@B8LLa;??P zb-0)_bMD{wo$r43n~RI}|N85H`N=QN8^(VcGrvWAU&j+YFbzW*Z9|&U3e17kwoLji z1*LY0-*(&Pce!2Wccoq7cePzrj;cuez>0pLD*c+OxOHmjFUT_5w&|<ipweBG6<L*z ztjW4ukPW#gm*g?IERV~TJB#h54-9!iRvs9#qK+Mu+RLcFB&(=b)iUbGQ9mgi)E#vk z^%c}l$r|c4uAe~tw5+3E=lV;izbqF}U*P#CQ9mOas5jI}%s++tS-FV%BG*r&{)&7R z^;gx)=s$z{Yw|ei$JH6s&&t>38xM^3D^kcMykC`X%42xHCf}0Fc)u<$%5!q%f!Tfo z_}lXQf%PY*?#oqqArON%+i#hMdaHk~eSWxtwl%b^wlARVLVvA&UY&1Wl%-FMX48AU zY#8+*?Cf;?K($7DVqN?&@ZxT$2kZV&s*yr5jD;uf`cbI&1dS6kA!^m@x7FukU#m#` za4+tKL-E_KZ;A0RP*EiI!m;p1qhJq>@3f@f?bbiSEPr@M_>qv|Pzg-%#7OD&xTlpT z#kLor%O6HD)xvJpJJMl?R^)DM`f23dQCI5qYuBzZAmUv?E8hfQ7uTY2pa{gZCilmB z?@GPZY6<!g)Ge>WAYW{9v%1$&qgdPs2!K6WM#<@fk@kW5bj?d*4FJ+IN(wKX(^{Kd zhyn4i|C3kgc*CEp#bP_9q>}j}K?KBdaI@X-gfVZqR?oi}v$U5{@*_8e2}o_}u_`Fj z(kf71q|jcpJ&9UJta;M|T)e=pANLrT0?H$%6kr_DpDy`KK%En}Vq%$a$J-Ne$lHr} z*Y7CN)!{(IJtZP<pzuM52<jaHD$krhe;#>GZ1uwNot_wmq7#mXvC_2P4jAK-h(hLM z92m|Etc|l5gK-f1BZxul4^)(I_+(7K&y41W!w8&9%=mq+Lk(#IS1Zv8JTN$fPJ}>5 zi<B*CG>@h6#92qo@q&PHBiVY)OqxB%;Mn!XFx@DVJZzjxS;p3)7X~t7;u6jU7&$06 znaQyd!6mwBjSwIK%&@?5MB%WQ`YBWI2{@$WeL5EDLJ+}qK|(Kfy$ENQN(p4C*pOh| z4C9Yku4e}mMwq@mj(OfT_zFza8EZ|dE~UvvMv(d!WWkzda?IO~!eAUL*B^{R9d9N} z*$g+GkvMl$><+<-Ntv-sYQ>=?3-q}KehJ5MvN(4f2`k2wpvl4vm695ur+G^9XNpMD z_{bl!wxh0O@#7uoYoY^Jmp=K?M}Dk|x<jqs1CJ$@fLH1eI{6QFIJL;j_)tdMlt$Z< zCakap>rm1#4#s4c2})}`flr~AiQJ@<S?5wERb<-pF_Q_xL#Q=VyM<6(DSCt$K@_;U z*|ZbKWrDhHQg_`!D93@qcf)l*AA13j8nvqH%CO_QzcTbGz{|z|Xq=ya*NfH0T~BXx z!OTiW8=akvIC#6eeebS(C;GPgt<Lt|&fDMYPId>K%lO?HZftFg{1Gf)6ho@k-x;Wh zjP6C$$d7v$_At~NL`yO=8?NgQ{n&M3I+<EO00fbZ!f|Z#xoBM>TK^eieu&nJRfVVh zh-8D6o)^bzFp43dp~x&+A*)Y23gU>z9|!Go)KTaaqU{MPUZUb86$QQ1uhY~<c>Ea8 zi&3G9nUlY~O*|vTZchzUecypDiJ=c!(?o*okWb#jID-2iVey9;4p+ht*>NDn{48Y1 z1hU}1j4ulcePv=0I@<*?s?W(14iV$gCsU0&ubRk85hD^;kOCuyd>Ynsn&<1on;;*& zFy1x7`yrh|>Tb@RJ`Vb^cIIiA({ibj{rb=*!0){<+I2$v&yUmqkvLKXWPaW=tAH6J zbC?*c8NM>#6DkJ<A)Z$iE)XI9bXEy?5cX8%5z`Mm3Fj-!{V{Z=t^={gGsr+;RS)An zLzb^h0m9+u1qGg0@*6~fUp_kpQaK^tivlYJf1Nc0c|(lkk#@Q8kG@V?5H^2tBrQtl zxlX;;P)wZ=X(7xlA!xT{8DXwX;XGQ(6w>2ep|BqBDuwoVI~>p+OBUQudY)F2Y-q>A ziu9v5J@4U(h&T7meZxf#0$z@}3Fpopd2z34C3d8Ou0DeiGq#P)8hIkArT+(7gBLa@ zFU@S$$_H#dep@0!j5NoA`G-h*kbC9*9R3&6oxG(RX<&L-hN<ft;#QY~4LFY+3JrV+ zgA^CxZ*Stjo0s4N`!VT7br<0SJTSHid9c(|#V%r2LcX;2HF5b8&3>F)!CE)&c`?Lq zxF<l}a3~{0*0;JdtCJlfo0J=4b#KH80&ge_8$~EYv7bdPN?sD|BhIWsx;nGX83TU_ z)T{3jtUU2hbmI>OO8Rj9kbCe!x6CqP*O?viFo$5BjTt5<;oS#nK!E@}jA*>gu^I8m z5@h98-l=5M(r1Y=s^o0oU=A}(HS^1URq)Hw<isq$Wc?j-!s$ovf=R#3EtAg*@NcJK z{o`1L7-fp^OjwlDs!)E@IO%Ad^{arXX)>Z;!Y?yA|AZl_JXGfK%lhZ=BOF->3BP@# z4<ljXO=39tMuFdZA%gIG%xFmUAf_CTDB_wz43J(w8nT+};`o$y-G3(7$Qw6o$DEv; zrG7D{fRAWT@O^+MnuSlAfX{j!_`oju4J?!Mi0#6&JWN1n6m^echkvCFS)<s8HA*_5 z0Fl5Wb;%?ohg?FB^^HE2R@XX3gtRs%&ehfEidfaxnxzE9U=DWO)PpD8cEpJSAgx9q z+rMGV5h^YnKuWWAI3jojv-nsTbuFm+78S??&#F@n8aPyV86AI*hpFwDPN}}^I8N26 zXzJ<UDSmv2s72pHF*OooARZcBlZ`~}=|<wAVH@olsB}zI$UA8r3bjUg?lT&xj^Fh= zS@=Qu8Kio)Haj^W<k^##OUDuYBZ}CFaSR7m-`a<cH;uT|xBF%KmgZ^jxLb*<edmC_ zYUr!;*TTM~x8p{C@xZum$4mRRwBlp?_JMg&x?h&1{j#*L8>eW_@~|Sy^yYPs<G?Ei z=KTuSR`x5hf|eSdWjqU5!{}p`u6+s+Vb+QL5=tbvfx0vC3rRbaLnUg=<xolO((lRR zU^6)PrsTVv*lQN+Ps%OQuu0jcEb^qZzIrbpiv9Yhzy4{-NQ_BsHCl~YRBSd+CS^!E zqFp)~P3)9dVZ_!rsUrJAHae-%dM>$nNhKoX9VZLOyY#{+=G2Q*d{xjq@?}z@qLxAk zv#4qRq>4^>lsd6{Uers<>EtR>DZGl^5B*`XFdq7!j}@mN^lO;btfs1vgeY-xq`50G zW4(%I{SJ*Y^*Q>UvN~b&A9x~x!YD7BD`p*kHkf|dT(&CaQq3_dsN3k7947-vhfz2c zb1Hyz#d~;IZsvW8$#)9cZz)(<gwU`D$SZ2L1+%u{*-hV*%s{QkKL0mCl&P_m0)e9Y znK8IgU~pT-V?7j<OinF19EWhbuR81n5&ZL^Z_2AeyqH02_^vnLOgdKm-x*|1PLY`z z@yz&a&fqf$?<(Q3Qi136X{5U2fKW@DQfw%Too7^wAZKd(UJSYVHkRFC>`YjZ{G3h{ zs7?Fl5F>TRtVXOnYi*!lO5IX!ah5WRBi7g1?${~+bI#~@Fq4J&@n(n3LzQ4+)oM28 z**`Nl*4AdTe%Ru04vNjrcW93*RD73;^C*(V%<^?02e51`i&W&o$tH+Y&A;QxOpt9Z zz3EiwuW;fCD$0ZYK8?DKB8I&MCCpPsY)MO&epVu7zi&zVj1kk#WDDPAY5b9O#<*|A z<$Vh#puA)05BEzALw^WWU6R$SQ0n{Ee(8_Nxo|coZ^N~OkCUeNRuSWJvUBz}jQE}O z9x|kz9r#6GkgUNkts__2*$LqJ2bvs&FR0kk-=^M5;_P~Q2*!#Mo4%5j_hI5yhqGya zkai_?$}D1)VMisU2uiUOs3EeirA`nfB|wtco~9Lcc4agrq~^e=?sfyWrvfPM2A$#( z_BBYk*-KUf%FHn}B}F^bOuth0Fg*n-xY@M=V_@FLEpTk@Tm6zObz!vr3Wk)aV^99( zrq_x2_HjJya2^oZ`Ma<wX)b6R_yalIS9HPwtc1Vq2Y$Slg%0nBtoo2DB#(Zmb}>pS z3S82g#!Dhi=nKlLlRVrcBIkEYEWA1CTLFgTmF$R8$<)6KOmG;D*%6bI`PjLMO<P~U zX#IOs5N*<we!eyG?jKUmtzt~Ux=e9R_vmMd)Rby9Dh&|(D^d4ve<Rf8dx{*#Bgi|T zyNsM>kEQS8+>ptsd~j>7J*V);L_(%;dQFmVKSyF7bcn>n#H;_0B>ubK2#M3XpB%{- zrtwnrImAchq@A43zgqJhIh9G0Qz~b-PdNm0Wad$a$b1YlFCQW^dk|>P^#r{mG9(X; zhi2CzZSlal4?O|BS@Imrejlj_?Lj}l+wnU+p@!Zz{s)1rY<jCI(-EXDG6j<9h8z0M zm|}h0%ChsY4&@s6u5if-j{^0)Ka2K}dl``;@`C0Sk)<klLK@YRC8w!*_9FYAh1@|A z*Qry<i)(y6rN_gK!5%rDYjCC0bi%urr(U$c4TnevT*UQRGXpkXjc%anyD;2DLNZ%) zTN6>BOeX7*abOY&A6i}dCmRqE@dL~lk#TcQe^7#qqSvU!Qy-a+K=q$lMDxB$0sEx> zh^!ZDXS7+=_F0-uvncdsSGklpq)3Surcq(W5lMygHCYs*1EN%$&Lz#e(d4P)oK$x; z{*6TG4~b0(G6Pn{F)g!hO)jKVY+c10|D$lN#pgV&W>b;ZtMR#qA?#V1S|dc}TeQ)q zDDX`VeG0ajwzFv~^Lii9&Z%#5)=5=5GDh=zGQdEtSVw<GE3&&WvwEt(kE83m#iEU+ zI>-RKl9>=T3m_t?C5p3~eAPzxpWQLsVcd9XI$!-`DlSs-TU1=8;yQ|?iin0oo5k#Y zdW(azH14US6^?&4!El-oqbpQgcj7L!R$R&QZ6;slX$o~U#k!jAH#8lBru4R^BuP?9 zJ#r4&)5wh!E*mLLYE+YuYr=VI^%C0+kZ1h}jS1gS6Q?l7ZQC87XOo8ih>EGk;4eNG z=W6O5U87hlx{1QJ8Ws`=>0haicf(9uDimQg@VCH!>3e<oinHV_&|m!wMw$+os$%^g DP#B-G literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3f394ce643b0bf92c020ddb37588284a68ef506 GIT binary patch literal 2293 zcma)7&5smC6tC*<>75-Gm>?f&T7=!51Q-yM#K?lE5EC3smIUaKbb7jKuxI*XwyI{? zoh%oJKY)W5O-#I+c=G07;Q!E9jmcg)dh)&M0d~o1?4(}3s`ski*RNh*UR?D5`sw#a zk9<P@AbUOw_!}_f*FYFyG$T0;DMjAMjL^`t8Jf&wR%YdPXy;Do<ZkHZUg+hGu#x+r zPswe<Z00;8%;EOT3>TQOPCD)`+)6sMIu!S1nN1Xr(tKPB)!U^ga4PRknT&46l2<-* zx8gM8tZMX1h08hn)iy4w1*G@VoR<?-Eq<B_9y2ZBEI~UjKNFZ6FyzNTI0-2u5C?@A z7BPxvG_-18Lz}tGdqzTsHJA^x%NAG@W>0(Hs+xDwVx;{7x28WL7sN@zr3_RV#K8cz zgNaOw$3d*hJWYbJD92o=?Vub485~~ypmV|Z1Nhd~)`AQ#xEAcab#+CSIme4uI{#De zT%f+e*g3m)E6yaZ&-D@m!o?43dKAWIFyv`S^mbd39Wtbh&WxckBb3}H#c7KubL5MU zD6A<_7Bf)i7@5&;=|fT&56BK=ZqyK;@6f^mnf;V1XXwnxQ)4a}!fcK#G2DTjtFXWI zE7)>}9^M3_F*CHS@4%Kn@}E=Do?CN=3#c=r!{$?S2dXkM#4n7jzqI+HwzOlw?JwZQ z#af%994-E-TFi#ML$$v}OD!?y^%_neu6+cXK5*_S@|=#F%$otWACisi0U&%G=KFf? zG<ucsq(416&;Z2hCXiyqgR@c~RCh7C)8#q(f+umRu<D3{WMh&FUe|U|3OF%spOrx> zgSdvM7IC%<Z;w3w;d}gkyWTlcSpb!yT9_2+#)L;job$>~vJ&2c`{ms)geZlu;Yj7G zIp!^7Dx;K@h1jYZh^Gj#Q@MB7^@+-oDpr*zRa9slXQF4};Z4>!2Iw@9wPnWnxMRTq zo(;qi-1B(BB5lLbhvd&h1R(f(vpW{)CZwag8H?_q%orE4n~b_DyEN!;ZL%x!YV={! z-yU7MJeWSolZ)^@F1q)+<8*vJEx@NNJAWnTQzo}0Zt4+jg27UBF$|2NiypsRTo`Xx z?mW4N!3lX02%!dT(-v(TN2o`asAs?jJ4;53dZuNzX%qG>qiI;wr)SJ*d+%GjFuyLr zisFYeb_@Mdumb{u$c)J23f>Cv#vEO5D|2WJ^&6N`c||$;t<0q$b3xZeWX*YvGQ?NM z>`j+yFchVl17Uiq-oZ#YI~VjPDnMy}JIHybQ8iK-)iU9LPvR7kHjv8UTd7o19KszJ z$w?%~fOM#M2l?O?c@MbC6+Gk6Ua!JJHh~bGw-)5EN#DrMTy<Y|5cWDdEnpP9*dcZa zb4DRH+Ur=_uiC>ipz$BBi1$H$9fs6>icXL1E6uBz4>rFF2kYXL%L<$rny|8FRIjiR z06%mX9pP`s=m`w9<7%64x~P+P9OU8zDjl4+W*Wu0t^z#so1iDL6qvjgou1h5`5w)K zoqrcj?#-Pz2`fYs<Prb0buR5U9mTTh0{@GTeji%YNIQ8OR3-L(g8sd=&%f7NSg}Us zMY`8SQRPQbUb0EXfp139#w5<L3&F~bB333*Bu=9bXOUp}#4?f<B*A`yU=!HjaA=@; zwq^Lsp68jKttFi%8XQd2M1To_C=mFYs-aB;y005vjd~4l>{_~C=^G9*T6v$;F|6TZ NmUy6Pc+eOE>mSrFBHsW2 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8aad69ce9922b883e97d022a73d63755ff9d211c GIT binary patch literal 2655 zcmb7FOOF#r5bmCr$K%JEWr5{!7@;i039NY~T*3wtAR+<>X;*?+iAJ;TF^oMAZ+Cki zmiH3#3vvsmT=Nqm<(&KhPJN0LDH7Klb4pc@%|65>ZFP0Et9$zEs;{bV)@t70KmYOF za+Q$3$f0I|eiyo6AQ)jZAt~+9)aV!#=SE_7Og&m1OOJNP)}zyLn8~c9l)4=^EqBVP z*YVOyr;=7X)wI^BQSudGHgjGP=0xt)?9`dDPMW2+a1v=6Y9ZVdc`}kw5U0bOOXae7 zI~H-Cwck=);wblV-W_}qib#2=Jq+U{VyfKEB~EARlRccM3d)T*jq;IHwR;JVLZ&Sd z>*9&?W`c4Ty0{M_A|1*|$6yq0*<cp4Us1T{3Ffd8Xf|_M`4xeidaMFtiB(w*Mwivu z0*qy5!i^SH?a6?}Ttfte<BO>IJy8A4J--V`WSqV5Lmw7JU77Q})s1!+U5^b%2l|)L z#it-7>C*|B(1|fIrxqpB=$n0OLi#p?|N9Q~5_Gp`o+eXcLV~h(tT`5*KWl4iYkq<t z?)XQbeRx^qX@tlwH~-J#E53Y*4vpBIhhZY3gU#d8idbC{E27=>xDDu)8w7C{%OFrj zE|fJ4<x6Gt^EgvwgcRWE%6*v&nT2Vj>|!v7F;kUM7H^HB01Zt`St3e$yskewKVOw( z5#wJ7Uk1y+JFOv)w?i4VwnN_P<q3<pXmtlInOyH}?ryVN;&$*!cXMxW{bp~xlXkB` zdy%y^TElpFHO_<#ljQ2HG#WFpEAUU<gY76|Id36kMBGX-#PiweaF0VO5yU1u5X5en z9(AZi$ES~Ye0A=Pu7S&-p_3}mb-WwE^a)UKQ0CPM%`nPjpGw-NQ?hT&EH_}J1B>4P zM$p^y|6P8U8T)2dmq1@wVV(yz?3=s4?KR|#FH=g%Gm`yi5$Oy({tqSilcl~pCCoZY z_N|H4FUxY@8yNgg*j4FQ0YPm_`D;ej=g8g^cqRs5cr(NDyR0)C)>eRn^alzk78o*f zHisPzU@x2xmJ<y5Y8NZNC0kFQ6S;`zFn4P7Pfh_7p0@S$nI4<vHpc?+;`LA1e*OF{ zdYEILj4#bH+}{afom4XS!|v7y600D5FX#S>7%!~|KNfyilmTsu*!W~mR}ddI>8y-k zsWNspn@ju*d|g?{EoG+RF0bL-)<NeD)Jxy2Kj1v)$`pG-xzTPHXx__}9dVxJ%6ahM z`J?rXf~`)p8w)A;5^UsU6nFz=izJGM9FtvH`7p|q-A!`HCYztaMH+((ybClA3-72* z_`YU(A<p9F((KCTVIppTAas$sv_W0NrH)ZI3~IovPOG#EGm9>P)iSE4MLk+Imy8A- zpE^p@*%!O$cx*Ugsnjfe3JS!FOo>>Qz(vrFS==uGYmA~gO{usg9R?L?ZUvi;Jn{f^ z7c6DeG1^VDJ#G|H%5pi6(D~vY%(IAH@i#}(M=O+3s0f}a$08_fyabrEw{@ua2RPOK zc0p6lC`;mOplqH(+Uf{4Y2jt88i#$!qa=bS<{tblFsF(3WL<mjxR+*Yk9Z05T6+nL z0oLw5dH}c&ccks6Rp3Ko0TS8tek}Y7m>xkFx>nHfnWHg!clr09e;Rhe$q=P{3GxqK z4VYPT9Jc=YaWLqy_k&T@I0#eiZFsyMBP#u3fp^B|j^R4A@EtU~0+u@Mny*1Q>>B=X z_am5NxdTVtC*Plgq6Z~HufZ~6PUzG?s%%|&hC7i)x}0e0fLq<;Hz|@dfxN?jUxfqt z0*X}-O+$xXS@^IVPbO~@Ubcb0DDqq&e+Wc>k)EUD<)b$}SlTo;+8ACB-#h#)ymwv@ zq&XWUs8@qvYZN9kODPCg-VFl%Xz-8W0Nz4@0q56H+(dCeO|4<Bb9^e0mI4_BSxmi} zcgb~K)3vm%xq#>PMsmdAT#jz%n7I4`3M^yXM{yB^BKnEe6{tucyzD`R(jR;u3gv!Q S+-wc&f=-hLlp6greCt0b)paBQ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea59b22cbde07732a7f7817bc0db262b0c3fd8bd GIT binary patch literal 4855 zcma)9&u<(_74GWpndupi9Vc<JL0M2~A;}JMVm8StD+Jk1g0qSg#>g?mI|8-aQ#E$m zJ>5=qjem^Bt5qCv+7l;Ofdmp9;DGjo#9x5Kg$t)X1_>!A?wt5ubx(V25=2YgU0wC+ zb=CXc``)Wt)6<QA{`xOJ{_9(o^$%;}a?$<>cdGFaR>u-d*b(d79h*_xiJXpO-fqV= z?@Fg4Tv3Ut{aUBi_c~s`-l_K+okoAEGu3Z)n#}sx5>-)qVTqco9XXw8;feYSt1}}S zVhZmwqA8~Fo)yj$t2HzHfIm*U+r2Q7d|hq^yJ0d=JnZj8vM*yT1>X$={=+!j=RbJ# zJx+4zjRwc{3Tw7nEISjdr%5!>(#Nbs>Gmr|1J%qU#rK0$X4Cf~B?ECl9a3ZsdOr-H zN@VqRqKj^7e&5JsQ`EH*_GL2AUHZ@Xa?tn)clsC)X>}N^W(x)@og=%vV6c<fJ?xb4 zyISnKCeE9kvyLZb#2HwiE@s79yc@<6bJ-L&XjX=W1^2LtW6Mn1BS`rvgWPBsgRE>y z9%0?aNIWF5I8pr|$~)qq4{NR;a1FUYYZb1;Xnbua(3@+yN$;8Y*V59|yqm;22xHQf zhVceKio#g(q{p?~*Yo3X44Ea6>K&DIWtwuJ^)7bQGQt!6dNa^G=sp{S3hSX6wCG|F zckkZK_wZd>!`K?{UQ3g{B<!!X%zyq*v4`z0xj0?)uHb%vJAE4uZEdlUHDZE|oFkW6 zBWueZS-vAIxTW2G*m4!k$voc=<52s4=8~ndsX-h*8%Uqb*>W>Cl~GSMjilZrFN0In zbnZI8x71mT{Clvlqr%-l%Z1%QE%cH|NR=*hw-<EuUT=MWSKLnT`0sbu54PXC)f?{h zyWhgK5ihJP?1VelVSXJ%(e>MXITY!BN}cBRcV#RRwLtbG<DgTF+c$O&)D-^x4cw_Q zf-}p8a}!3rG2U30;)O1H+qjL58fa*;3Oi!32peAKA4_fUf)d_SNxuZoI9TpN6q$6j z?Cb(r!^fI@5~c<%(%7oS)C}|+>*SAf_{_ZVjBnyArKMQT$u*A!UcYA2Nw^Y{<+^wI zicB>R;j)FVQEYSvN`YUZ1HLIEQFvdzbk0{M1Zj9Y*=!tp;Jrja8`O}wx!ey^4OTL) zIo8o~GCN6g}SZ`gG`OnuTL#X`C5>hQuORHel0_k9WTuw(1UN-k>b{)oPuBWv3> z$o=NE7BCwt=%BF1ICdwtvMlvLA^z9aR@6YQt&L4_Y6eAnKhWJxnUa}HOT>fzx>P*X z2?cu?8w|!~JoXp_8*-DSF5r<>H>8HMs5yMR!DP+Q5BkPvV4gdW%ble<ymZ296GC0% zO^~Emn8j_J{3RMh0o!%e9I@CXBOWrCkR4fvb}@1jZ+qKSH%I8XgZ}+L9L#8PG3SUe z>!}t0%(b+;-B5pL)}h0!;qJ)Us_4pAb=y{d%C(J1!xx3d&kK#8>zZ&#&qeEqJ!kQZ z_5`h=_{Pk7G2@STS1wySUy3UI6Os*4JC=NEeM0$~9Xg*ntJbsItN40?_fzw3dBdOb zdpYBlK`?>w14Nb1fjegY6D~f_;qWR5Q%D6dmrCI~?3FN=k=0EG2$wj~NaiKUALHCs z#4*FGMQY`HL8yTs*U4Bok0|>2m2^0FB{g|0&)#N8idV!;8(;i_u0MY`Jl`{koK$qp zJ}|L0r3m88B_7V^_Ed=KfQU#ZCuk_EEj?MJy<`<^DNeHL;^OL~Co8Is*^1IdR!Ji% zcT^Q^IH@5mquK-Y`bNDY_q(TwtXAZ=4>2tz3btzJn8#+BXWPtXGiWvKCZ4X{v|ZL< zZ`<4+o}YByLc@uGcc94l?YGeY`Uv<G0gn`h<dypn`2>3BwJXR&i(Xx!HhGSzHQeFv z__9Qmk;>Qk15wzr>?gaYeF8RCr>33sjM5=U#n?;CFHZA?NT8hjWE0u&O^X=L<_<t| zIYSOF=RNt?JVyzWd)oo;%XX`p(?|{GG0dyJLM;!E>@8(><Qpo6&y5}74GdE&HtJ(; zN*-s`Jm5z6Nt_C~6F8MgG*3vdJ(4I@)KppwpY!{0)NK<;lsPB>Xg?DXN#=Vk0?1+^ zs;43#^0Wd75Pxb9(aFiICqRJdHt~Z~y4x*Vkz4++WZYP%RT`3w$Owi&Yr~6^PI@fT zvLCivtlgTTf{AJ)6if}@?<ZmqQM>8;&jvwMjMRKzBwgP(C5j>X95@5l*J)u_=y8=E zR6$KVs8CP@2+5`ti(cKe8&$93;c9Si+KiTX5Z|B2ZQ^Df4X`8we<OZ`ePkcn;O{x` zHv@lPWvGD|xHSG?)f(B9NGX~Qor9)!Q6^$$Azgv=N-1p{>FN>YjtFCC_%Fa0<bF-r zPRVYfP#KOhU|x&U2$e(=;FwuKEHH!et_cj}P^rSMq2^K%P61SbpHNr=Un=I0@~UUt z!Mj0RkTbv)CU}d&h$?*)MBv*}4M_%kH;6((Kc62jYHh8Z#Ha-(*4@sSYSl6~*^zNp zd$g3Zs;TGbzyKP>d1EJY!dPdG9|h4s7QEYyl9cM`W>FscrpR{imDP%_%q114U4Ss% z#hp^|V|lKj)frZ8HqmM#OsgPUMN*|J5Q&pJ7*|+EgK9<G_I+wO_mTSH95&iW!Xq}a zkDNmXUzL$#T*XBjARksn?iMBP3Q;Z~cegx(Ubuk1GWZgT`BO?c20b!;QTMzN^>JZ6 zMtbrH_42b{LdDC^epMc%PElzI7rBi|bwm-MYD&uaFUiTcIX6z8-X`D+e~Y}FvAv;l zC2h1@^}G<PE%^_Y7w@fP)g^y%^}*xJTk@YSFSQ?kqUN#5tlATVw;}|xiutv=i8g5X z7G9kOjrzSP*ho8d(*_;LPGbypPpJ1Hr*6~ZILu9i(-H0GxKpA~%APJDZPtl@6^)gk z5-kx67*HRgL9tCoJAww$dK0m2BU(Q~ZHAuV#Sz<bw6o=+HoFnq&mmLPPV7^*YQ>1< zf~WshQ1FBy%Q(t;_`eE&!`Z~=!EqsF&b!3R@wHRT&36Vm<pb0>CeTYDg-p%a7{@*> z=Xsj&J;}oj9OiSELZ}MVO-Vd1#tpvXj9RKOtD6A1-KrD?cAg5=S79ynH9S!Fw3im! zE6552oO*{IrvRaJL9U(BS=aK4B8J&{B59pfbY>&U?+w6QpnOHh81?3_>N1U6=1^@) zD^pV`ld35}=QS4*y9rtYa-O4(7h+oE9+~%@JhR-L##c&RR7rWr&z{ZQ*`Ijtc$fYI D0Hf0^ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0a5b8124d7a4269ee949f4e73dbc5d506d6462a GIT binary patch literal 3754 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 D`{0Pq literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a14b6b9834160f587a83a7c32a68b0e7edb5b27 GIT binary patch literal 2178 zcmah~OK)366rQ<nKk{e@ZPSKw1r%zD#xxC-1(W~<HpMIwsbC>pU3<pqweQ238K<%3 zZg748Vh4+gEn9X-?2-5hcZ-CSzrc!f=H8IhwZvF6bMBm(Gv9pY;k!#q)xUrK<J<SE zg#1M=Gz;Wi=<*>9j4&FLgtjR~*@%s{p=YygGLu=cmDp`NaoSGew%x>Qdr75Tq2vp~ zZ04L0=5TvvwyVt8BMtWyERqJzSHh0W;*sJ(lngVWTBj5hcJ4jQx`R(b$@5ApQ~1G| z7QY<hM_$8mKT3EuQu)%yvEU)o8qT_C`>dHD>_V3hVBn-p83EiBFt0L;*(bDZu}jQh zE=V@>SmlJY9ad#Em|a$9OE7zEnXSNFVJ2W-%UAZsNgSmEgz$M3^T}H%`C+%qrSw(i zhkg&1{gI5)178-KZ*4cW_FG-#6dTSq^iQG7TQDfnr&BVeQ)6n*EJ~EoH~ZF<^z9jC zbc0MuU^4>u8!ds4YB&OI<X#X&X{3T6H!_)9!%#iWZ8?l1mDfgTbU5Nc8YaA9<(A}e zPt^4x^%w~QN?lcO_zMwhp!sLq9E#{DRJ?f<ie@j185gqI9W+&Zr`I_?VmtC)@NTy= z9^ARxn><On??5|9oBPdSG`t<9QiXARdne%&CXXd9>K+{Nlx3nB15wCLvt;G$duuor z5PoC{y3`yQtH$K&9MM~6Z|xee4;wO3gRW`(6ND)^cu*1bDNT_)@{}str!(@@C^g$K z(}5+nfoOUU){lP}uOr#8yP(^k<Pk}gMU*qBir*>0A86ef5e!{WT6$Jko*H27S!wlq z<uL>HRxXnn{f?%~s>;xE`3)y(<>_Bxwyu-ZVBla%z9EM@UqfQ;!Td<i4W}hA876O* zVeUT(BZU!#5!O8%MS}atpWn-be^XA@Z%RLsepuv!R&jQUtRDRIBevf@YShIg_|7f# zx<KM`xAcTq#;*z*4A4Wl`_<lOLS!PZM?shbsDR6b3)^%M2@en0GUj~PFvSY4YvUfc zI?xwjMCq^+FX3LdM2#Qv4H$^CMm@SpJp&qDr^|+CSmrvcSw`KkXqEcr<jQ;ylvcV( z4mO-I4s;CM2LbpdGa|1l@HEIq>5I!Co3Os6EbXImUD<sHG%k8UCz#oqtQJ(JnJQ_V zTrXCT1<u~~J0s<zwlnr2x4gU(NzD*v0<*dxXagk&2hFrIO0jB)E3nd_1!40H2_ADO zdhfv&iJl_`KXjSC$V0jJIUX=CG!N)aEGd1AMsr4?aL`u6(nyLL;6(C&;D}ei$cNCS zPB%K)n0Lj0uU-top97KI07#f*00>5Vfd2&m%Q=T7@QkJ?_pn51i1?Vrj0xm;7kW`N zkf+TTKwb#n#W-((fs15`Yv(x2pa7KiB9sEpF2<HuJMe;mj*AD+LA*8(@qA;$*l!^v zRV?gSxS_CDgCNP+C`P#+1c#$AE;Vitu&f&dx^{|9xJ0~)13FGqBVI%4Jj%3$`6ntc zV1!8|7Za}PRA2X8&-5&<Yt-=G-bjrE+$%5wiub<^Qcm=rPZ8@n!gX1|il7fKx-s`Y TC|+?N6ISBhy5T|YZ(9EX<Ja}{ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/linklockfile.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/linklockfile.py new file mode 100644 index 0000000..2ca9be0 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/linklockfile.py @@ -0,0 +1,73 @@ +from __future__ import absolute_import + +import time +import os + +from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, + AlreadyLocked) + + +class LinkLockFile(LockBase): + """Lock access to a file using atomic property of link(2). + + >>> lock = LinkLockFile('somefile') + >>> lock = LinkLockFile('somefile', threaded=False) + """ + + def acquire(self, timeout=None): + try: + open(self.unique_name, "wb").close() + except IOError: + raise LockFailed("failed to create %s" % self.unique_name) + + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + while True: + # Try and create a hard link to it. + try: + os.link(self.unique_name, self.lock_file) + except OSError: + # Link creation failed. Maybe we've double-locked? + nlinks = os.stat(self.unique_name).st_nlink + if nlinks == 2: + # The original link plus the one I created == 2. We're + # good to go. + return + else: + # Otherwise the lock creation failed. + if timeout is not None and time.time() > end_time: + os.unlink(self.unique_name) + if timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(timeout is not None and timeout / 10 or 0.1) + else: + # Link creation succeeded. We're good to go. + return + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + elif not os.path.exists(self.unique_name): + raise NotMyLock("%s is locked, but not by me" % self.path) + os.unlink(self.unique_name) + os.unlink(self.lock_file) + + def is_locked(self): + return os.path.exists(self.lock_file) + + def i_am_locking(self): + return (self.is_locked() and + os.path.exists(self.unique_name) and + os.stat(self.unique_name).st_nlink == 2) + + def break_lock(self): + if os.path.exists(self.lock_file): + os.unlink(self.lock_file) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/mkdirlockfile.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/mkdirlockfile.py new file mode 100644 index 0000000..05a8c96 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/mkdirlockfile.py @@ -0,0 +1,84 @@ +from __future__ import absolute_import, division + +import time +import os +import sys +import errno + +from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, + AlreadyLocked) + + +class MkdirLockFile(LockBase): + """Lock file by creating a directory.""" + def __init__(self, path, threaded=True, timeout=None): + """ + >>> lock = MkdirLockFile('somefile') + >>> lock = MkdirLockFile('somefile', threaded=False) + """ + LockBase.__init__(self, path, threaded, timeout) + # Lock file itself is a directory. Place the unique file name into + # it. + self.unique_name = os.path.join(self.lock_file, + "%s.%s%s" % (self.hostname, + self.tname, + self.pid)) + + def acquire(self, timeout=None): + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + if timeout is None: + wait = 0.1 + else: + wait = max(0, timeout / 10) + + while True: + try: + os.mkdir(self.lock_file) + except OSError: + err = sys.exc_info()[1] + if err.errno == errno.EEXIST: + # Already locked. + if os.path.exists(self.unique_name): + # Already locked by me. + return + if timeout is not None and time.time() > end_time: + if timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + # Someone else has the lock. + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(wait) + else: + # Couldn't create the lock for some other reason + raise LockFailed("failed to create %s" % self.lock_file) + else: + open(self.unique_name, "wb").close() + return + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + elif not os.path.exists(self.unique_name): + raise NotMyLock("%s is locked, but not by me" % self.path) + os.unlink(self.unique_name) + os.rmdir(self.lock_file) + + def is_locked(self): + return os.path.exists(self.lock_file) + + def i_am_locking(self): + return (self.is_locked() and + os.path.exists(self.unique_name)) + + def break_lock(self): + if os.path.exists(self.lock_file): + for name in os.listdir(self.lock_file): + os.unlink(os.path.join(self.lock_file, name)) + os.rmdir(self.lock_file) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/pidlockfile.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/pidlockfile.py new file mode 100644 index 0000000..069e85b --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/pidlockfile.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- + +# pidlockfile.py +# +# Copyright © 2008–2009 Ben Finney <ben+python@benfinney.id.au> +# +# This is free software: you may copy, modify, and/or distribute this work +# under the terms of the Python Software Foundation License, version 2 or +# later as published by the Python Software Foundation. +# No warranty expressed or implied. See the file LICENSE.PSF-2 for details. + +""" Lockfile behaviour implemented via Unix PID files. + """ + +from __future__ import absolute_import + +import errno +import os +import time + +from . import (LockBase, AlreadyLocked, LockFailed, NotLocked, NotMyLock, + LockTimeout) + + +class PIDLockFile(LockBase): + """ Lockfile implemented as a Unix PID file. + + The lock file is a normal file named by the attribute `path`. + A lock's PID file contains a single line of text, containing + the process ID (PID) of the process that acquired the lock. + + >>> lock = PIDLockFile('somefile') + >>> lock = PIDLockFile('somefile') + """ + + def __init__(self, path, threaded=False, timeout=None): + # pid lockfiles don't support threaded operation, so always force + # False as the threaded arg. + LockBase.__init__(self, path, False, timeout) + self.unique_name = self.path + + def read_pid(self): + """ Get the PID from the lock file. + """ + return read_pid_from_pidfile(self.path) + + def is_locked(self): + """ Test if the lock is currently held. + + The lock is held if the PID file for this lock exists. + + """ + return os.path.exists(self.path) + + def i_am_locking(self): + """ Test if the lock is held by the current process. + + Returns ``True`` if the current process ID matches the + number stored in the PID file. + """ + return self.is_locked() and os.getpid() == self.read_pid() + + def acquire(self, timeout=None): + """ Acquire the lock. + + Creates the PID file for this lock, or raises an error if + the lock could not be acquired. + """ + + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + while True: + try: + write_pid_to_pidfile(self.path) + except OSError as exc: + if exc.errno == errno.EEXIST: + # The lock creation failed. Maybe sleep a bit. + if time.time() > end_time: + if timeout is not None and timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(timeout is not None and timeout / 10 or 0.1) + else: + raise LockFailed("failed to create %s" % self.path) + else: + return + + def release(self): + """ Release the lock. + + Removes the PID file to release the lock, or raises an + error if the current process does not hold the lock. + + """ + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + if not self.i_am_locking(): + raise NotMyLock("%s is locked, but not by me" % self.path) + remove_existing_pidfile(self.path) + + def break_lock(self): + """ Break an existing lock. + + Removes the PID file if it already exists, otherwise does + nothing. + + """ + remove_existing_pidfile(self.path) + + +def read_pid_from_pidfile(pidfile_path): + """ Read the PID recorded in the named PID file. + + Read and return the numeric PID recorded as text in the named + PID file. If the PID file cannot be read, or if the content is + not a valid PID, return ``None``. + + """ + pid = None + try: + pidfile = open(pidfile_path, 'r') + except IOError: + pass + else: + # According to the FHS 2.3 section on PID files in /var/run: + # + # The file must consist of the process identifier in + # ASCII-encoded decimal, followed by a newline character. + # + # Programs that read PID files should be somewhat flexible + # in what they accept; i.e., they should ignore extra + # whitespace, leading zeroes, absence of the trailing + # newline, or additional lines in the PID file. + + line = pidfile.readline().strip() + try: + pid = int(line) + except ValueError: + pass + pidfile.close() + + return pid + + +def write_pid_to_pidfile(pidfile_path): + """ Write the PID in the named PID file. + + Get the numeric process ID (“PID”) of the current process + and write it to the named file as a line of text. + + """ + open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY) + open_mode = 0o644 + pidfile_fd = os.open(pidfile_path, open_flags, open_mode) + pidfile = os.fdopen(pidfile_fd, 'w') + + # According to the FHS 2.3 section on PID files in /var/run: + # + # The file must consist of the process identifier in + # ASCII-encoded decimal, followed by a newline character. For + # example, if crond was process number 25, /var/run/crond.pid + # would contain three characters: two, five, and newline. + + pid = os.getpid() + pidfile.write("%s\n" % pid) + pidfile.close() + + +def remove_existing_pidfile(pidfile_path): + """ Remove the named PID file if it exists. + + Removing a PID file that doesn't already exist puts us in the + desired state, so we ignore the condition if the file does not + exist. + + """ + try: + os.remove(pidfile_path) + except OSError as exc: + if exc.errno == errno.ENOENT: + pass + else: + raise diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/sqlitelockfile.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/sqlitelockfile.py new file mode 100644 index 0000000..f997e24 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/sqlitelockfile.py @@ -0,0 +1,156 @@ +from __future__ import absolute_import, division + +import time +import os + +try: + unicode +except NameError: + unicode = str + +from . import LockBase, NotLocked, NotMyLock, LockTimeout, AlreadyLocked + + +class SQLiteLockFile(LockBase): + "Demonstrate SQL-based locking." + + testdb = None + + def __init__(self, path, threaded=True, timeout=None): + """ + >>> lock = SQLiteLockFile('somefile') + >>> lock = SQLiteLockFile('somefile', threaded=False) + """ + LockBase.__init__(self, path, threaded, timeout) + self.lock_file = unicode(self.lock_file) + self.unique_name = unicode(self.unique_name) + + if SQLiteLockFile.testdb is None: + import tempfile + _fd, testdb = tempfile.mkstemp() + os.close(_fd) + os.unlink(testdb) + del _fd, tempfile + SQLiteLockFile.testdb = testdb + + import sqlite3 + self.connection = sqlite3.connect(SQLiteLockFile.testdb) + + c = self.connection.cursor() + try: + c.execute("create table locks" + "(" + " lock_file varchar(32)," + " unique_name varchar(32)" + ")") + except sqlite3.OperationalError: + pass + else: + self.connection.commit() + import atexit + atexit.register(os.unlink, SQLiteLockFile.testdb) + + def acquire(self, timeout=None): + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + if timeout is None: + wait = 0.1 + elif timeout <= 0: + wait = 0 + else: + wait = timeout / 10 + + cursor = self.connection.cursor() + + while True: + if not self.is_locked(): + # Not locked. Try to lock it. + cursor.execute("insert into locks" + " (lock_file, unique_name)" + " values" + " (?, ?)", + (self.lock_file, self.unique_name)) + self.connection.commit() + + # Check to see if we are the only lock holder. + cursor.execute("select * from locks" + " where unique_name = ?", + (self.unique_name,)) + rows = cursor.fetchall() + if len(rows) > 1: + # Nope. Someone else got there. Remove our lock. + cursor.execute("delete from locks" + " where unique_name = ?", + (self.unique_name,)) + self.connection.commit() + else: + # Yup. We're done, so go home. + return + else: + # Check to see if we are the only lock holder. + cursor.execute("select * from locks" + " where unique_name = ?", + (self.unique_name,)) + rows = cursor.fetchall() + if len(rows) == 1: + # We're the locker, so go home. + return + + # Maybe we should wait a bit longer. + if timeout is not None and time.time() > end_time: + if timeout > 0: + # No more waiting. + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + # Someone else has the lock and we are impatient.. + raise AlreadyLocked("%s is already locked" % self.path) + + # Well, okay. We'll give it a bit longer. + time.sleep(wait) + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + if not self.i_am_locking(): + raise NotMyLock("%s is locked, but not by me (by %s)" % + (self.unique_name, self._who_is_locking())) + cursor = self.connection.cursor() + cursor.execute("delete from locks" + " where unique_name = ?", + (self.unique_name,)) + self.connection.commit() + + def _who_is_locking(self): + cursor = self.connection.cursor() + cursor.execute("select unique_name from locks" + " where lock_file = ?", + (self.lock_file,)) + return cursor.fetchone()[0] + + def is_locked(self): + cursor = self.connection.cursor() + cursor.execute("select * from locks" + " where lock_file = ?", + (self.lock_file,)) + rows = cursor.fetchall() + return not not rows + + def i_am_locking(self): + cursor = self.connection.cursor() + cursor.execute("select * from locks" + " where lock_file = ?" + " and unique_name = ?", + (self.lock_file, self.unique_name)) + return not not cursor.fetchall() + + def break_lock(self): + cursor = self.connection.cursor() + cursor.execute("delete from locks" + " where lock_file = ?", + (self.lock_file,)) + self.connection.commit() diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/symlinklockfile.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/symlinklockfile.py new file mode 100644 index 0000000..23b41f5 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/lockfile/symlinklockfile.py @@ -0,0 +1,70 @@ +from __future__ import absolute_import + +import os +import time + +from . import (LockBase, NotLocked, NotMyLock, LockTimeout, + AlreadyLocked) + + +class SymlinkLockFile(LockBase): + """Lock access to a file using symlink(2).""" + + def __init__(self, path, threaded=True, timeout=None): + # super(SymlinkLockFile).__init(...) + LockBase.__init__(self, path, threaded, timeout) + # split it back! + self.unique_name = os.path.split(self.unique_name)[1] + + def acquire(self, timeout=None): + # Hopefully unnecessary for symlink. + # try: + # open(self.unique_name, "wb").close() + # except IOError: + # raise LockFailed("failed to create %s" % self.unique_name) + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + while True: + # Try and create a symbolic link to it. + try: + os.symlink(self.unique_name, self.lock_file) + except OSError: + # Link creation failed. Maybe we've double-locked? + if self.i_am_locking(): + # Linked to out unique name. Proceed. + return + else: + # Otherwise the lock creation failed. + if timeout is not None and time.time() > end_time: + if timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(timeout / 10 if timeout is not None else 0.1) + else: + # Link creation succeeded. We're good to go. + return + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + elif not self.i_am_locking(): + raise NotMyLock("%s is locked, but not by me" % self.path) + os.unlink(self.lock_file) + + def is_locked(self): + return os.path.islink(self.lock_file) + + def i_am_locking(self): + return (os.path.islink(self.lock_file) + and os.readlink(self.lock_file) == self.unique_name) + + def break_lock(self): + if os.path.islink(self.lock_file): # exists && link + os.unlink(self.lock_file) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/__init__.py new file mode 100644 index 0000000..2afca5a --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/__init__.py @@ -0,0 +1,66 @@ +# coding: utf-8 +from pip._vendor.msgpack._version import version +from pip._vendor.msgpack.exceptions import * + +from collections import namedtuple + + +class ExtType(namedtuple('ExtType', 'code data')): + """ExtType represents ext type in msgpack.""" + def __new__(cls, code, data): + if not isinstance(code, int): + raise TypeError("code must be int") + if not isinstance(data, bytes): + raise TypeError("data must be bytes") + if not 0 <= code <= 127: + raise ValueError("code must be 0~127") + return super(ExtType, cls).__new__(cls, code, data) + + +import os +if os.environ.get('MSGPACK_PUREPYTHON'): + from pip._vendor.msgpack.fallback import Packer, unpackb, Unpacker +else: + try: + from pip._vendor.msgpack._packer import Packer + from pip._vendor.msgpack._unpacker import unpackb, Unpacker + except ImportError: + from pip._vendor.msgpack.fallback import Packer, unpackb, Unpacker + + +def pack(o, stream, **kwargs): + """ + Pack object `o` and write it to `stream` + + See :class:`Packer` for options. + """ + packer = Packer(**kwargs) + stream.write(packer.pack(o)) + + +def packb(o, **kwargs): + """ + Pack object `o` and return packed bytes + + See :class:`Packer` for options. + """ + return Packer(**kwargs).pack(o) + + +def unpack(stream, **kwargs): + """ + Unpack an object from `stream`. + + Raises `ExtraData` when `stream` contains extra bytes. + See :class:`Unpacker` for options. + """ + data = stream.read() + return unpackb(data, **kwargs) + + +# alias for compatibility to simplejson/marshal/pickle. +load = unpack +loads = unpackb + +dump = pack +dumps = packb diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..673795256049ae9a228387077fa68bcfb10e9b61 GIT binary patch literal 2076 zcmb7E-HsbI6t-t3lgT9emo5vmw2V+C2vU=7Tc}ha1fr_~RhLzFOSdDW$z<#-N#?J% zliiI{kjP5Cfj$G5@Fcte7rsS8>ML-?u_p;z6fSV&<1@$3vA^?u_RW<Q_s^ey`{pMb zp+C^MRt5hP==^su1Q8sg1p62(--wL^HJY)RSiXhPJwz;0IzyyHVI=m{n3{eGR+MAg zx2fGP_Z{L)F>6Dt5?2z}cay4LO=^A(qx8#D58`gTqT+goYP|Z-{9}~9XCb;aaM>>y zso%0JPf%(cB2ptOXUJbCt7Hwv4YE!)V64-+e}Pv0O}g&CMmPK|Qr<_6`b)ru8d#P` zl<{7cf{Wh=<ECLki5TWFjntBPGiMI>z@f;;1o;NRzWE$=F)@gF=J?igWFfx<=`C5_ zIS~h^IUT<{b38_KMmbFd_vnf61WbCp)JynL9!7&^G~Ypu7IZc8LofnOu)tG;*9Gi2 z#Xn$(7{Y|eRfrfWLd*%a;4cH5eMqbUPAvn9#qSCrMgOBD><OA0{qh8|O@JggrM){| zk1|5NWXOfrQO6PEItfL%h;&W`<qX3qUVaZ|Tz_T#_3yTC+-^A1?eSj9MVLlZnvg_R z6!aa&GA2tpg>=6T<KaBShdE`e1PNt12vT|+1PxP~QOu>KHjtJ&1h7#Ff+!9-4}xFO zUr$>(>y1J|TceP*x>-zsx>hu3iFmu)IT?{#{C4m`)Hxk&-|UW$lju6MqqKF<%6s`W zeZV-rb}OM{!cVvg>K=?}N;1}(5zz{QUfL5u(9BQS3LMde&R4-8>|#gvH((sE&4_Kz z5!liJ7vvKJ(hY(nBg0tvwIFyp4CC1h047-!1Uk1|nE{Mw97C)QyJ*wEY(x1Mlu?Cp zpmQY)2U}Q2#ud$ls?@Guf3SaV@6*rj2YZhm?(97|`24F~sHnXM%A!n`hpEz7M>>zR zLmA|M6OuIyb`b`42~1>wQEe{1`{45{U<B%d;9lToAhJH5n0*7J1VV({h(Sii_|WyB zsm;8s)2ET}+F9ERQ{o-7o&a5e+%vDu1*2iocJ=CgO1(Rp+&k^!m~F3{F)zynTu0v2 zivWZ^r!472(o!(scHvCgMK);<jzf0DrLCqwRf`f9wYv=Ge_H`jsF3YqrXrD2v}y{o zx@a2fIyf3DexYyzMnH$hkN*=LqhiQXPwz}TE%g5Z4vMch&<6rvRhoIqyb3{<RQ^r_ zX1J!vX77N%fS``QfUpT46Vyjj^vn=&&%1a6U^I*$HH<<4z|EYgF3XYyHO=Dq55pd( z+-rlvS$G!&*7lCSrRids7iFmk;YO*KjD-dAg0b_o&c(Kb*oGl35ChTj1CkX*1$afm zzbjxD`n>^D1&?J1v#apccwN2)_qaK`!_E0)3g7xwXR2WG%CaT&B%+1XWHriSc<#0C zn9@n{G#MF}Wtxt9EK8+%M8)#Gx?vo5fT4oS#dY#8E!#CHRO(+|I$6Mk3tRmn$ulPO z3##>@Dc6vt6=xxlC1v5cB*P?^C1v@!s%ZtOw?jG~74Oi;suEn)tcD$<W^UCST*F(2 U0d^Cw;)|x^Iu)m8Vau@a-?tAM761SM literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37a92ded31da1458d202ea5d7481915ee43e0080 GIT binary patch literal 238 zcmXr!<>h*|;CPG(0|UcjAcg~GAj<)Wi#dQq3QH723Ue@nChJQekKrXNh+qQ}ewxfh zj6k}G2}FSOXfobnFH0>d&dkqS$xsAR2qu0N>K7DcmL-;?>X#)J>8IuAqyQD^Cui%I z<QS$URg|Te6r0DJCMQ*98ycromFFfK06}`5eu#cSW`S;IUU5lcPL8fgZfaFZaYZpm s5RBu?Qu9*si}Z7g(+d)TrUCh2yY&hxZ*kb<=BJeAq}qX8SPaAr05YIJ5dZ)H literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1a69f0ce6175b18a200dd71d92d8474e73a44e1 GIT binary patch literal 2179 zcmcIl&2HO95GF-RqG-#O9iWFI2=>sTRZxp{oFJE?Fp{`MQ9v%xrU$jag61w2!W79Y zN!b>BOHRotZ;)%Ar0>9Mfj&e|`DSJPShj)q&=q#Ivp=&l-+VLNYq#D1-v9GAvkl{4 zW2x0K-$&2iVEEY(hA>~FOXHO_Fd^531=*4&<QimK)FIckY(Z{_Cgi3xrTxkt)Uo1- z7FJrajvEcgu2_S-rZqMpuZuS1wruJf4puhACRR43BU{kniq7vwcPoHB^JZeUkDhlh zNMm3MV^9<3z!Ei_wW`hMN#+N~2d9C|iYQGczdn<hl7U}H(PQj+F4=sKMM+*rU$7!& zI1s#GejGD7yUIkVqGZTQtr4?cziU?x=ZQa(oL4UAqg0eJ&DS}9S^DwCPLp$y2AqE| zR0C$};bZP)DjLHMZ|o~COk*Kc?ghtQ5$}dar(^Ljf6N~RM`y>od*S3{6nu|1OuRq5 zEXsDsR9Lt3a3m)pKZUX=)18lHB2wjz@*z3y&CSny*_k4^sOL2dj;ZDA@m$A&1)jjN zR=H2gFqG=2GLHLQOOXm?(E#c!c{cU2Nox)U;?e9ml0W;o)?ry3hR^)M|IF7~&`y2! z8qKeN?FO=Rreyikk4t%=RH`OlU17^&b4C}U!73Q!^di<vh`88jFWE@)B^wFVeL8R# z!y*8p_SyicEn(vysfK_ws@B12p?pFppg2&Ye^T)jUFXEPd2VpyyoM3Efoo<Tp>(Ds zmZGXl(t%8|a~X$<!mh}`CF?1a#PcYL3eLAlGez7m8|GwtZbEN%ARvNKn~_c1LN|m- zJnB#GO<(`^sLPOwG8#*PG=mvTz?YtWx@)QpTv;^(sgxIr^DnTc<7}9dtz{eZZogY! zjmRb`qqr|=)XAucx`vG{Qb}eyreiBw3DD<_yxB*;snWE6yHsa>xx$>=))`9Qiz>6~ z%#HLSAHF0bi37-Ql5ge326?gI_~h+nnMFBMev~6%Cog2einC0zG(;+7Wuc=-C-O4O zQiTf3j<6aP-{fpeIYoPAGT-gFE<?Kl)Z+Phis^&5$unZ<y*UuJBKcN8Y?0%KW2wS8 zJ((7RcUP8H;fRt#4y9Uno5Fv<qx@v3ak{9=GlbY*I}h&P-`o9;(cgpa|B1*QAn^4P zA|&^_Yg9xozK!~8pli0G(pkBSKq#tHIwv%xG@MoY5<H3&UYA^z^TYJJ_@n;vP*!(r L`fb~t7RKf$``6mk literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47e75c72e72540466a6fc71e67f05b95cbe6bbdb GIT binary patch literal 24702 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 I(0}{?FFhA?6aWAK literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/_version.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/_version.py new file mode 100644 index 0000000..d28f0de --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/_version.py @@ -0,0 +1 @@ +version = (0, 5, 6) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/exceptions.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/exceptions.py new file mode 100644 index 0000000..9766881 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/exceptions.py @@ -0,0 +1,41 @@ +class UnpackException(Exception): + """Deprecated. Use Exception instead to catch all exception during unpacking.""" + + +class BufferFull(UnpackException): + pass + + +class OutOfData(UnpackException): + pass + + +class UnpackValueError(UnpackException, ValueError): + """Deprecated. Use ValueError instead.""" + + +class ExtraData(UnpackValueError): + def __init__(self, unpacked, extra): + self.unpacked = unpacked + self.extra = extra + + def __str__(self): + return "unpack(b) received extra data." + + +class PackException(Exception): + """Deprecated. Use Exception instead to catch all exception during packing.""" + + +class PackValueError(PackException, ValueError): + """PackValueError is raised when type of input data is supported but it's value is unsupported. + + Deprecated. Use ValueError instead. + """ + + +class PackOverflowError(PackValueError, OverflowError): + """PackOverflowError is raised when integer value is out of range of msgpack support [-2**31, 2**32). + + Deprecated. Use ValueError instead. + """ diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/fallback.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/fallback.py new file mode 100644 index 0000000..9418421 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/msgpack/fallback.py @@ -0,0 +1,977 @@ +"""Fallback pure Python implementation of msgpack""" + +import sys +import struct +import warnings + +if sys.version_info[0] == 3: + PY3 = True + int_types = int + Unicode = str + xrange = range + def dict_iteritems(d): + return d.items() +else: + PY3 = False + int_types = (int, long) + Unicode = unicode + def dict_iteritems(d): + return d.iteritems() + + +if hasattr(sys, 'pypy_version_info'): + # cStringIO is slow on PyPy, StringIO is faster. However: PyPy's own + # StringBuilder is fastest. + from __pypy__ import newlist_hint + try: + from __pypy__.builders import BytesBuilder as StringBuilder + except ImportError: + from __pypy__.builders import StringBuilder + USING_STRINGBUILDER = True + class StringIO(object): + def __init__(self, s=b''): + if s: + self.builder = StringBuilder(len(s)) + self.builder.append(s) + else: + self.builder = StringBuilder() + def write(self, s): + if isinstance(s, memoryview): + s = s.tobytes() + elif isinstance(s, bytearray): + s = bytes(s) + self.builder.append(s) + def getvalue(self): + return self.builder.build() +else: + USING_STRINGBUILDER = False + from io import BytesIO as StringIO + newlist_hint = lambda size: [] + + +from pip._vendor.msgpack.exceptions import ( + BufferFull, + OutOfData, + UnpackValueError, + PackValueError, + PackOverflowError, + ExtraData) + +from pip._vendor.msgpack import ExtType + + +EX_SKIP = 0 +EX_CONSTRUCT = 1 +EX_READ_ARRAY_HEADER = 2 +EX_READ_MAP_HEADER = 3 + +TYPE_IMMEDIATE = 0 +TYPE_ARRAY = 1 +TYPE_MAP = 2 +TYPE_RAW = 3 +TYPE_BIN = 4 +TYPE_EXT = 5 + +DEFAULT_RECURSE_LIMIT = 511 + + +def _check_type_strict(obj, t, type=type, tuple=tuple): + if type(t) is tuple: + return type(obj) in t + else: + return type(obj) is t + + +def _get_data_from_buffer(obj): + try: + view = memoryview(obj) + except TypeError: + # try to use legacy buffer protocol if 2.7, otherwise re-raise + if not PY3: + view = memoryview(buffer(obj)) + warnings.warn("using old buffer interface to unpack %s; " + "this leads to unpacking errors if slicing is used and " + "will be removed in a future version" % type(obj), + RuntimeWarning) + else: + raise + if view.itemsize != 1: + raise ValueError("cannot unpack from multi-byte object") + return view + + +def unpack(stream, **kwargs): + warnings.warn( + "Direct calling implementation's unpack() is deprecated, Use msgpack.unpack() or unpackb() instead.", + PendingDeprecationWarning) + data = stream.read() + return unpackb(data, **kwargs) + + +def unpackb(packed, **kwargs): + """ + Unpack an object from `packed`. + + Raises `ExtraData` when `packed` contains extra bytes. + See :class:`Unpacker` for options. + """ + unpacker = Unpacker(None, **kwargs) + unpacker.feed(packed) + try: + ret = unpacker._unpack() + except OutOfData: + raise UnpackValueError("Data is not enough.") + if unpacker._got_extradata(): + raise ExtraData(ret, unpacker._get_extradata()) + return ret + + +class Unpacker(object): + """Streaming unpacker. + + arguments: + + :param file_like: + File-like object having `.read(n)` method. + If specified, unpacker reads serialized data from it and :meth:`feed()` is not usable. + + :param int read_size: + Used as `file_like.read(read_size)`. (default: `min(16*1024, max_buffer_size)`) + + :param bool use_list: + If true, unpack msgpack array to Python list. + Otherwise, unpack to Python tuple. (default: True) + + :param bool raw: + If true, unpack msgpack raw to Python bytes (default). + Otherwise, unpack to Python str (or unicode on Python 2) by decoding + with UTF-8 encoding (recommended). + Currently, the default is true, but it will be changed to false in + near future. So you must specify it explicitly for keeping backward + compatibility. + + *encoding* option which is deprecated overrides this option. + + :param callable object_hook: + When specified, it should be callable. + Unpacker calls it with a dict argument after unpacking msgpack map. + (See also simplejson) + + :param callable object_pairs_hook: + When specified, it should be callable. + Unpacker calls it with a list of key-value pairs after unpacking msgpack map. + (See also simplejson) + + :param str encoding: + Encoding used for decoding msgpack raw. + If it is None (default), msgpack raw is deserialized to Python bytes. + + :param str unicode_errors: + (deprecated) Used for decoding msgpack raw with *encoding*. + (default: `'strict'`) + + :param int max_buffer_size: + Limits size of data waiting unpacked. 0 means system's INT_MAX (default). + Raises `BufferFull` exception when it is insufficient. + You should set this parameter when unpacking data from untrusted source. + + :param int max_str_len: + Limits max length of str. (default: 2**31-1) + + :param int max_bin_len: + Limits max length of bin. (default: 2**31-1) + + :param int max_array_len: + Limits max length of array. (default: 2**31-1) + + :param int max_map_len: + Limits max length of map. (default: 2**31-1) + + + example of streaming deserialize from file-like object:: + + unpacker = Unpacker(file_like, raw=False) + for o in unpacker: + process(o) + + example of streaming deserialize from socket:: + + unpacker = Unpacker(raw=False) + while True: + buf = sock.recv(1024**2) + if not buf: + break + unpacker.feed(buf) + for o in unpacker: + process(o) + """ + + def __init__(self, file_like=None, read_size=0, use_list=True, raw=True, + object_hook=None, object_pairs_hook=None, list_hook=None, + encoding=None, unicode_errors=None, max_buffer_size=0, + ext_hook=ExtType, + max_str_len=2147483647, # 2**32-1 + max_bin_len=2147483647, + max_array_len=2147483647, + max_map_len=2147483647, + max_ext_len=2147483647): + + if encoding is not None: + warnings.warn( + "encoding is deprecated, Use raw=False instead.", + PendingDeprecationWarning) + + if unicode_errors is None: + unicode_errors = 'strict' + + if file_like is None: + self._feeding = True + else: + if not callable(file_like.read): + raise TypeError("`file_like.read` must be callable") + self.file_like = file_like + self._feeding = False + + #: array of bytes fed. + self._buffer = bytearray() + # Some very old pythons don't support `struct.unpack_from()` with a + # `bytearray`. So we wrap it in a `buffer()` there. + if sys.version_info < (2, 7, 6): + self._buffer_view = buffer(self._buffer) + else: + self._buffer_view = self._buffer + #: Which position we currently reads + self._buff_i = 0 + + # When Unpacker is used as an iterable, between the calls to next(), + # the buffer is not "consumed" completely, for efficiency sake. + # Instead, it is done sloppily. To make sure we raise BufferFull at + # the correct moments, we have to keep track of how sloppy we were. + # Furthermore, when the buffer is incomplete (that is: in the case + # we raise an OutOfData) we need to rollback the buffer to the correct + # state, which _buf_checkpoint records. + self._buf_checkpoint = 0 + + self._max_buffer_size = max_buffer_size or 2**31-1 + if read_size > self._max_buffer_size: + raise ValueError("read_size must be smaller than max_buffer_size") + self._read_size = read_size or min(self._max_buffer_size, 16*1024) + self._raw = bool(raw) + self._encoding = encoding + self._unicode_errors = unicode_errors + self._use_list = use_list + self._list_hook = list_hook + self._object_hook = object_hook + self._object_pairs_hook = object_pairs_hook + self._ext_hook = ext_hook + self._max_str_len = max_str_len + self._max_bin_len = max_bin_len + self._max_array_len = max_array_len + self._max_map_len = max_map_len + self._max_ext_len = max_ext_len + self._stream_offset = 0 + + if list_hook is not None and not callable(list_hook): + raise TypeError('`list_hook` is not callable') + if object_hook is not None and not callable(object_hook): + raise TypeError('`object_hook` is not callable') + if object_pairs_hook is not None and not callable(object_pairs_hook): + raise TypeError('`object_pairs_hook` is not callable') + if object_hook is not None and object_pairs_hook is not None: + raise TypeError("object_pairs_hook and object_hook are mutually " + "exclusive") + if not callable(ext_hook): + raise TypeError("`ext_hook` is not callable") + + def feed(self, next_bytes): + assert self._feeding + view = _get_data_from_buffer(next_bytes) + if (len(self._buffer) - self._buff_i + len(view) > self._max_buffer_size): + raise BufferFull + + # Strip buffer before checkpoint before reading file. + if self._buf_checkpoint > 0: + del self._buffer[:self._buf_checkpoint] + self._buff_i -= self._buf_checkpoint + self._buf_checkpoint = 0 + + self._buffer += view + + def _consume(self): + """ Gets rid of the used parts of the buffer. """ + self._stream_offset += self._buff_i - self._buf_checkpoint + self._buf_checkpoint = self._buff_i + + def _got_extradata(self): + return self._buff_i < len(self._buffer) + + def _get_extradata(self): + return self._buffer[self._buff_i:] + + def read_bytes(self, n): + return self._read(n) + + def _read(self, n): + # (int) -> bytearray + self._reserve(n) + i = self._buff_i + self._buff_i = i+n + return self._buffer[i:i+n] + + def _reserve(self, n): + remain_bytes = len(self._buffer) - self._buff_i - n + + # Fast path: buffer has n bytes already + if remain_bytes >= 0: + return + + if self._feeding: + self._buff_i = self._buf_checkpoint + raise OutOfData + + # Strip buffer before checkpoint before reading file. + if self._buf_checkpoint > 0: + del self._buffer[:self._buf_checkpoint] + self._buff_i -= self._buf_checkpoint + self._buf_checkpoint = 0 + + # Read from file + remain_bytes = -remain_bytes + while remain_bytes > 0: + to_read_bytes = max(self._read_size, remain_bytes) + read_data = self.file_like.read(to_read_bytes) + if not read_data: + break + assert isinstance(read_data, bytes) + self._buffer += read_data + remain_bytes -= len(read_data) + + if len(self._buffer) < n + self._buff_i: + self._buff_i = 0 # rollback + raise OutOfData + + def _read_header(self, execute=EX_CONSTRUCT): + typ = TYPE_IMMEDIATE + n = 0 + obj = None + self._reserve(1) + b = self._buffer[self._buff_i] + self._buff_i += 1 + if b & 0b10000000 == 0: + obj = b + elif b & 0b11100000 == 0b11100000: + obj = -1 - (b ^ 0xff) + elif b & 0b11100000 == 0b10100000: + n = b & 0b00011111 + typ = TYPE_RAW + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b & 0b11110000 == 0b10010000: + n = b & 0b00001111 + typ = TYPE_ARRAY + if n > self._max_array_len: + raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) + elif b & 0b11110000 == 0b10000000: + n = b & 0b00001111 + typ = TYPE_MAP + if n > self._max_map_len: + raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) + elif b == 0xc0: + obj = None + elif b == 0xc2: + obj = False + elif b == 0xc3: + obj = True + elif b == 0xc4: + typ = TYPE_BIN + self._reserve(1) + n = self._buffer[self._buff_i] + self._buff_i += 1 + if n > self._max_bin_len: + raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) + obj = self._read(n) + elif b == 0xc5: + typ = TYPE_BIN + self._reserve(2) + n = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0] + self._buff_i += 2 + if n > self._max_bin_len: + raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) + obj = self._read(n) + elif b == 0xc6: + typ = TYPE_BIN + self._reserve(4) + n = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + if n > self._max_bin_len: + raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) + obj = self._read(n) + elif b == 0xc7: # ext 8 + typ = TYPE_EXT + self._reserve(2) + L, n = struct.unpack_from('Bb', self._buffer_view, self._buff_i) + self._buff_i += 2 + if L > self._max_ext_len: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) + obj = self._read(L) + elif b == 0xc8: # ext 16 + typ = TYPE_EXT + self._reserve(3) + L, n = struct.unpack_from('>Hb', self._buffer_view, self._buff_i) + self._buff_i += 3 + if L > self._max_ext_len: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) + obj = self._read(L) + elif b == 0xc9: # ext 32 + typ = TYPE_EXT + self._reserve(5) + L, n = struct.unpack_from('>Ib', self._buffer_view, self._buff_i) + self._buff_i += 5 + if L > self._max_ext_len: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) + obj = self._read(L) + elif b == 0xca: + self._reserve(4) + obj = struct.unpack_from(">f", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + elif b == 0xcb: + self._reserve(8) + obj = struct.unpack_from(">d", self._buffer_view, self._buff_i)[0] + self._buff_i += 8 + elif b == 0xcc: + self._reserve(1) + obj = self._buffer[self._buff_i] + self._buff_i += 1 + elif b == 0xcd: + self._reserve(2) + obj = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0] + self._buff_i += 2 + elif b == 0xce: + self._reserve(4) + obj = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + elif b == 0xcf: + self._reserve(8) + obj = struct.unpack_from(">Q", self._buffer_view, self._buff_i)[0] + self._buff_i += 8 + elif b == 0xd0: + self._reserve(1) + obj = struct.unpack_from("b", self._buffer_view, self._buff_i)[0] + self._buff_i += 1 + elif b == 0xd1: + self._reserve(2) + obj = struct.unpack_from(">h", self._buffer_view, self._buff_i)[0] + self._buff_i += 2 + elif b == 0xd2: + self._reserve(4) + obj = struct.unpack_from(">i", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + elif b == 0xd3: + self._reserve(8) + obj = struct.unpack_from(">q", self._buffer_view, self._buff_i)[0] + self._buff_i += 8 + elif b == 0xd4: # fixext 1 + typ = TYPE_EXT + if self._max_ext_len < 1: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (1, self._max_ext_len)) + self._reserve(2) + n, obj = struct.unpack_from("b1s", self._buffer_view, self._buff_i) + self._buff_i += 2 + elif b == 0xd5: # fixext 2 + typ = TYPE_EXT + if self._max_ext_len < 2: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (2, self._max_ext_len)) + self._reserve(3) + n, obj = struct.unpack_from("b2s", self._buffer_view, self._buff_i) + self._buff_i += 3 + elif b == 0xd6: # fixext 4 + typ = TYPE_EXT + if self._max_ext_len < 4: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (4, self._max_ext_len)) + self._reserve(5) + n, obj = struct.unpack_from("b4s", self._buffer_view, self._buff_i) + self._buff_i += 5 + elif b == 0xd7: # fixext 8 + typ = TYPE_EXT + if self._max_ext_len < 8: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (8, self._max_ext_len)) + self._reserve(9) + n, obj = struct.unpack_from("b8s", self._buffer_view, self._buff_i) + self._buff_i += 9 + elif b == 0xd8: # fixext 16 + typ = TYPE_EXT + if self._max_ext_len < 16: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (16, self._max_ext_len)) + self._reserve(17) + n, obj = struct.unpack_from("b16s", self._buffer_view, self._buff_i) + self._buff_i += 17 + elif b == 0xd9: + typ = TYPE_RAW + self._reserve(1) + n = self._buffer[self._buff_i] + self._buff_i += 1 + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b == 0xda: + typ = TYPE_RAW + self._reserve(2) + n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) + self._buff_i += 2 + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b == 0xdb: + typ = TYPE_RAW + self._reserve(4) + n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) + self._buff_i += 4 + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b == 0xdc: + typ = TYPE_ARRAY + self._reserve(2) + n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) + self._buff_i += 2 + if n > self._max_array_len: + raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) + elif b == 0xdd: + typ = TYPE_ARRAY + self._reserve(4) + n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) + self._buff_i += 4 + if n > self._max_array_len: + raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) + elif b == 0xde: + self._reserve(2) + n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) + self._buff_i += 2 + if n > self._max_map_len: + raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) + typ = TYPE_MAP + elif b == 0xdf: + self._reserve(4) + n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) + self._buff_i += 4 + if n > self._max_map_len: + raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) + typ = TYPE_MAP + else: + raise UnpackValueError("Unknown header: 0x%x" % b) + return typ, n, obj + + def _unpack(self, execute=EX_CONSTRUCT): + typ, n, obj = self._read_header(execute) + + if execute == EX_READ_ARRAY_HEADER: + if typ != TYPE_ARRAY: + raise UnpackValueError("Expected array") + return n + if execute == EX_READ_MAP_HEADER: + if typ != TYPE_MAP: + raise UnpackValueError("Expected map") + return n + # TODO should we eliminate the recursion? + if typ == TYPE_ARRAY: + if execute == EX_SKIP: + for i in xrange(n): + # TODO check whether we need to call `list_hook` + self._unpack(EX_SKIP) + return + ret = newlist_hint(n) + for i in xrange(n): + ret.append(self._unpack(EX_CONSTRUCT)) + if self._list_hook is not None: + ret = self._list_hook(ret) + # TODO is the interaction between `list_hook` and `use_list` ok? + return ret if self._use_list else tuple(ret) + if typ == TYPE_MAP: + if execute == EX_SKIP: + for i in xrange(n): + # TODO check whether we need to call hooks + self._unpack(EX_SKIP) + self._unpack(EX_SKIP) + return + if self._object_pairs_hook is not None: + ret = self._object_pairs_hook( + (self._unpack(EX_CONSTRUCT), + self._unpack(EX_CONSTRUCT)) + for _ in xrange(n)) + else: + ret = {} + for _ in xrange(n): + key = self._unpack(EX_CONSTRUCT) + ret[key] = self._unpack(EX_CONSTRUCT) + if self._object_hook is not None: + ret = self._object_hook(ret) + return ret + if execute == EX_SKIP: + return + if typ == TYPE_RAW: + if self._encoding is not None: + obj = obj.decode(self._encoding, self._unicode_errors) + elif self._raw: + obj = bytes(obj) + else: + obj = obj.decode('utf_8') + return obj + if typ == TYPE_EXT: + return self._ext_hook(n, bytes(obj)) + if typ == TYPE_BIN: + return bytes(obj) + assert typ == TYPE_IMMEDIATE + return obj + + def __iter__(self): + return self + + def __next__(self): + try: + ret = self._unpack(EX_CONSTRUCT) + self._consume() + return ret + except OutOfData: + self._consume() + raise StopIteration + + next = __next__ + + def skip(self, write_bytes=None): + self._unpack(EX_SKIP) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + + def unpack(self, write_bytes=None): + ret = self._unpack(EX_CONSTRUCT) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + return ret + + def read_array_header(self, write_bytes=None): + ret = self._unpack(EX_READ_ARRAY_HEADER) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + return ret + + def read_map_header(self, write_bytes=None): + ret = self._unpack(EX_READ_MAP_HEADER) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + return ret + + def tell(self): + return self._stream_offset + + +class Packer(object): + """ + MessagePack Packer + + usage: + + packer = Packer() + astream.write(packer.pack(a)) + astream.write(packer.pack(b)) + + Packer's constructor has some keyword arguments: + + :param callable default: + Convert user type to builtin type that Packer supports. + See also simplejson's document. + + :param bool use_single_float: + Use single precision float type for float. (default: False) + + :param bool autoreset: + Reset buffer after each pack and return its content as `bytes`. (default: True). + If set this to false, use `bytes()` to get content and `.reset()` to clear buffer. + + :param bool use_bin_type: + Use bin type introduced in msgpack spec 2.0 for bytes. + It also enables str8 type for unicode. + + :param bool strict_types: + If set to true, types will be checked to be exact. Derived classes + from serializeable types will not be serialized and will be + treated as unsupported type and forwarded to default. + Additionally tuples will not be serialized as lists. + This is useful when trying to implement accurate serialization + for python types. + + :param str encoding: + (deprecated) Convert unicode to bytes with this encoding. (default: 'utf-8') + + :param str unicode_errors: + Error handler for encoding unicode. (default: 'strict') + """ + def __init__(self, default=None, encoding=None, unicode_errors=None, + use_single_float=False, autoreset=True, use_bin_type=False, + strict_types=False): + if encoding is None: + encoding = 'utf_8' + else: + warnings.warn( + "encoding is deprecated, Use raw=False instead.", + PendingDeprecationWarning) + + if unicode_errors is None: + unicode_errors = 'strict' + + self._strict_types = strict_types + self._use_float = use_single_float + self._autoreset = autoreset + self._use_bin_type = use_bin_type + self._encoding = encoding + self._unicode_errors = unicode_errors + self._buffer = StringIO() + if default is not None: + if not callable(default): + raise TypeError("default must be callable") + self._default = default + + def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT, + check=isinstance, check_type_strict=_check_type_strict): + default_used = False + if self._strict_types: + check = check_type_strict + list_types = list + else: + list_types = (list, tuple) + while True: + if nest_limit < 0: + raise PackValueError("recursion limit exceeded") + if obj is None: + return self._buffer.write(b"\xc0") + if check(obj, bool): + if obj: + return self._buffer.write(b"\xc3") + return self._buffer.write(b"\xc2") + if check(obj, int_types): + if 0 <= obj < 0x80: + return self._buffer.write(struct.pack("B", obj)) + if -0x20 <= obj < 0: + return self._buffer.write(struct.pack("b", obj)) + if 0x80 <= obj <= 0xff: + return self._buffer.write(struct.pack("BB", 0xcc, obj)) + if -0x80 <= obj < 0: + return self._buffer.write(struct.pack(">Bb", 0xd0, obj)) + if 0xff < obj <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xcd, obj)) + if -0x8000 <= obj < -0x80: + return self._buffer.write(struct.pack(">Bh", 0xd1, obj)) + if 0xffff < obj <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xce, obj)) + if -0x80000000 <= obj < -0x8000: + return self._buffer.write(struct.pack(">Bi", 0xd2, obj)) + if 0xffffffff < obj <= 0xffffffffffffffff: + return self._buffer.write(struct.pack(">BQ", 0xcf, obj)) + if -0x8000000000000000 <= obj < -0x80000000: + return self._buffer.write(struct.pack(">Bq", 0xd3, obj)) + if not default_used and self._default is not None: + obj = self._default(obj) + default_used = True + continue + raise PackOverflowError("Integer value out of range") + if check(obj, (bytes, bytearray)): + n = len(obj) + if n >= 2**32: + raise PackValueError("%s is too large" % type(obj).__name__) + self._pack_bin_header(n) + return self._buffer.write(obj) + if check(obj, Unicode): + if self._encoding is None: + raise TypeError( + "Can't encode unicode string: " + "no encoding is specified") + obj = obj.encode(self._encoding, self._unicode_errors) + n = len(obj) + if n >= 2**32: + raise PackValueError("String is too large") + self._pack_raw_header(n) + return self._buffer.write(obj) + if check(obj, memoryview): + n = len(obj) * obj.itemsize + if n >= 2**32: + raise PackValueError("Memoryview is too large") + self._pack_bin_header(n) + return self._buffer.write(obj) + if check(obj, float): + if self._use_float: + return self._buffer.write(struct.pack(">Bf", 0xca, obj)) + return self._buffer.write(struct.pack(">Bd", 0xcb, obj)) + if check(obj, ExtType): + code = obj.code + data = obj.data + assert isinstance(code, int) + assert isinstance(data, bytes) + L = len(data) + if L == 1: + self._buffer.write(b'\xd4') + elif L == 2: + self._buffer.write(b'\xd5') + elif L == 4: + self._buffer.write(b'\xd6') + elif L == 8: + self._buffer.write(b'\xd7') + elif L == 16: + self._buffer.write(b'\xd8') + elif L <= 0xff: + self._buffer.write(struct.pack(">BB", 0xc7, L)) + elif L <= 0xffff: + self._buffer.write(struct.pack(">BH", 0xc8, L)) + else: + self._buffer.write(struct.pack(">BI", 0xc9, L)) + self._buffer.write(struct.pack("b", code)) + self._buffer.write(data) + return + if check(obj, list_types): + n = len(obj) + self._pack_array_header(n) + for i in xrange(n): + self._pack(obj[i], nest_limit - 1) + return + if check(obj, dict): + return self._pack_map_pairs(len(obj), dict_iteritems(obj), + nest_limit - 1) + if not default_used and self._default is not None: + obj = self._default(obj) + default_used = 1 + continue + raise TypeError("Cannot serialize %r" % (obj, )) + + def pack(self, obj): + try: + self._pack(obj) + except: + self._buffer = StringIO() # force reset + raise + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_map_pairs(self, pairs): + self._pack_map_pairs(len(pairs), pairs) + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_array_header(self, n): + if n >= 2**32: + raise PackValueError + self._pack_array_header(n) + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_map_header(self, n): + if n >= 2**32: + raise PackValueError + self._pack_map_header(n) + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_ext_type(self, typecode, data): + if not isinstance(typecode, int): + raise TypeError("typecode must have int type.") + if not 0 <= typecode <= 127: + raise ValueError("typecode should be 0-127") + if not isinstance(data, bytes): + raise TypeError("data must have bytes type") + L = len(data) + if L > 0xffffffff: + raise PackValueError("Too large data") + if L == 1: + self._buffer.write(b'\xd4') + elif L == 2: + self._buffer.write(b'\xd5') + elif L == 4: + self._buffer.write(b'\xd6') + elif L == 8: + self._buffer.write(b'\xd7') + elif L == 16: + self._buffer.write(b'\xd8') + elif L <= 0xff: + self._buffer.write(b'\xc7' + struct.pack('B', L)) + elif L <= 0xffff: + self._buffer.write(b'\xc8' + struct.pack('>H', L)) + else: + self._buffer.write(b'\xc9' + struct.pack('>I', L)) + self._buffer.write(struct.pack('B', typecode)) + self._buffer.write(data) + + def _pack_array_header(self, n): + if n <= 0x0f: + return self._buffer.write(struct.pack('B', 0x90 + n)) + if n <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xdc, n)) + if n <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xdd, n)) + raise PackValueError("Array is too large") + + def _pack_map_header(self, n): + if n <= 0x0f: + return self._buffer.write(struct.pack('B', 0x80 + n)) + if n <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xde, n)) + if n <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xdf, n)) + raise PackValueError("Dict is too large") + + def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT): + self._pack_map_header(n) + for (k, v) in pairs: + self._pack(k, nest_limit - 1) + self._pack(v, nest_limit - 1) + + def _pack_raw_header(self, n): + if n <= 0x1f: + self._buffer.write(struct.pack('B', 0xa0 + n)) + elif self._use_bin_type and n <= 0xff: + self._buffer.write(struct.pack('>BB', 0xd9, n)) + elif n <= 0xffff: + self._buffer.write(struct.pack(">BH", 0xda, n)) + elif n <= 0xffffffff: + self._buffer.write(struct.pack(">BI", 0xdb, n)) + else: + raise PackValueError('Raw is too large') + + def _pack_bin_header(self, n): + if not self._use_bin_type: + return self._pack_raw_header(n) + elif n <= 0xff: + return self._buffer.write(struct.pack('>BB', 0xc4, n)) + elif n <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xc5, n)) + elif n <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xc6, n)) + else: + raise PackValueError('Bin is too large') + + def bytes(self): + return self._buffer.getvalue() + + def reset(self): + self._buffer = StringIO() diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__about__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__about__.py new file mode 100644 index 0000000..7481c9e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__init__.py new file mode 100644 index 0000000..a0cf67d --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d6ae8c58ef1800e98c059707503eb2b6006c348 GIT binary patch literal 736 zcmYk3OKTf35P)~Rem@fTLC$KR2Sekv6PJ=wO4{UDO2DOur6A-Ttu4GOEqb`|{+eF< zOZp#tEtK{z^wg0}Ni^tVMvUfpF&K1zef#m{cP$8h1`kdf^((yQ76Ac-c~FE&Sk#hQ z5hYO=Kn)_OLj#)7f;M!P?W7LfqyfF83H_u6gQN{dNe7OTE)0_%JmQ^`AnC*7c`$nN z2crg~Xm`vOM&-_ODvDBRyK95k2qTo-9hF*0OEV`^>+KGuR@j_Vy6aJDTv0H+MWaQj z)8g>D;oAR2qf04scBM4x_>&h*<OiQzq+A*wW<Y7G%B>d5mGy2VOV?~E<gz-wR+<xM zMJ}x1hGa^U+bxEZ<lw|j^=xHrX<o<iQrMMSj8j#_<+fz;eVF?6ay+R<H%hV`$lSUt zvxG??Li#qrv7DqzS}hjNDs8GE>|L+S-gPWgb^3mOLooY0jJo3F!=d;W<ny6Za*hd3 zuK#yI&L`8^8RC*WHy=j>KZeX%r?Fj)D-LwzQAhZ>u^eZj8~&;3(em({*By_pN6({= z_#Wt?*FFB)7`L-wmd6{W<4om%^~C8qw)r$$+-+cHUeTB7V!NJRWYyOqo#0u@_)}bp z@=Qo$G56W5;1!rV;~)2zZny-c??)J8kqhN;J>zn_YriQJxSYTB4H$xW8r8yw(v0dM JN)5#`{0ILN+#LV_ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec91752ff718a69f79804c953f7ae0eaf70eb6cd GIT binary patch literal 574 zcmYk2&2H2%5XYTlck|r}#6z%$5=x7>AjA`Jp(hJz<c*!wT04pS5xRYvUU?GUA=gSs zeFaX8cO|s8{FBF;`On{TQ`g0xr{6z5#DqMPvz6ifD;|4?;Dkqt=!ix-rm;?F5)mHr zM6L9iuJwj)bV^g5(M;zw*99$fNlRVP3iDQc%{M&d8P9pa%RZwuufCIQ{esG5n=F@X zXGi6o0I8?ZxFzFqmR63#axob>IOzP)I*ebUP?0SK0Q2sCGyqEt(2mo=$o}48m;(sS zq{3?npkylsD^7v+S~GJvB{}I-cuxVmk*9=Nn9vo#l-S1<0aZX9un7obF?m3W__n<W zUOMl*K{10vBqj-1A%YjS8$H@O6^D{Dg`@tl)Bh&H4pV6U7cs9wcEDfT;237+L^Ctf zbfe;Ev}yN^Q`g<@Vdl5?6MSrUhyC?U_xMw{?{W1*bJt9Ax{`x+sCjj(#Ur;5C?==l sfmsZEG|j}?J?rJrHvn>wX!qT8ShCN0<X(v{;Vbqv;!XUvilg)W4|b}X8vp<R literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be2ab3c624c67ed06c1e6b9e3fa798117f29066e GIT binary patch literal 1009 zcmah{OKTKC5bnq9BkN{!Fa&%Y){C%*>=+aA5`v)MEeML>AT+(xJ;}K9Si5^S*(IJ5 zNPdP_e~JI0uY!=j;K{09T_YYWsG6$kp0B>D>fQDA&iBt>-%C!&H*!N5_|HJ?TQG_! zT9A?^v}6e@dBQ2?SP><Wjy^OLxkD5mv!uC-B8XbLWnSoZMw7LwsXO>p4b{9L$t}fR zlR@hmu*rb?4LP!PF?Cwx<)k*ww^csNZC+QtH!*qTL^iEb2l3%G61xVrB&GN_2nG$% z7N~s)<|Vl#mo#IFDt6IU?24ZAPt1`I^o%K<k(``IP(E73oj%BOqovb**&j)(`)MJq z?VsfC7&4`HG9-rKW(wdd!Llg!E*MP`sz}0a7EZY0q09qB6MwMwi#nBsJs7T1X%wIc z!7u7<P}>D_MbGFJIpgODMGwCKZO_xf`lynn_8oVeTY<!_r)t1_W9df-ZEzw#ObjEO zL5J~7nmDTqrHzf#aqNnnY;-zPd-kb#l8)x%o!xA4Ql^hUj;i=gJjo~9d1aj}itW8p zFO)sCm<%drx>7ZO%XBP{^6DrSX<bgF8&2lFB}Ao9gt(7w;Km4D4E{TX;jh0Ap~p7( z(4Y{$BScxNX@P!Mh>ufQEKke^;D#Ot%;2od`tOA4f#=s&^SuXQ;L)ZAN9#A7#+N3| zT!j6?<RUkp=zuxkOQe8_*Z(aN@OyuEw24K+B3oOL*@9@$MfTa$O%1R&I0%E!#^5c_ z?cDnA47LFeTjW(%d;aR(V>G*P=#1}zfyoMFW_>5DHe>>NV0FU;PVN2Wunw?<#ndKi N^B(O*5pA<3{|Oyh1JVEh literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56076131f30c4c69d7060cc1ea2c0e6ecaab4ad2 GIT binary patch literal 2866 zcmcImPjA~c6elHHmK`T?+HCy;6zHuribM;VqCl|@0a|R>#h2w|3?LLe+EF9RE=hZh z(VKhN$JlkBq~Af;0R#3Gdg^;j)Y^emxm`<xd=ekY-}}S&vmS14w*LL=?eBlq8T*GV zwHiJjVb{-b00ul^Bi`pDr|*p1zRTG!3><LZFmPpU;r8pYzF_@2&eougvvoV`Ne^c| z@P1?6#(#Jc>$=%?c%sM2)JPGJCSzqXAL3c8<8hj8O;ns3F_@;2!S{%E<jui{BkcMZ z2g&*zSl<B-&KuTu!G#)1#0C##9U9=H^q>hXlnvN`HcB5hVGCswwxNTv1v_vJ<px|w z3wJaB*K`o4u{n=8f>0w#{TX&mK>>~{ou0ygvA<cDXEiO8f%5Rx4)10GIx!243}&GU z2IB;z(m`|<nB-t^@@fW$`muNvot&Q?JRHpb7)3u|8>Yc=Fo`F7ajH$2BzuP=IS2hp z)1>WUCQ}%zU=l`W;V@2zfzU=xBQsS}?@!J%UkD{9N(i4!rD!oe-^m@?&$TO_xwy!B z*2V|J41diQd_f-aUf0QLr=dR0YIJOus|K$5=%*qW0;M%VY~WiF=!G`2=HL>NMdAF} z9^7>-NLC-4Q>m_Ec|s&ch^-~0?Irg}_jx#K6OSrFkwWa0p`dOB<w^)&V+ddHg_DP{ zg%_Jrnnp5f;?^Y8T8K+W%M6e&h1e}IfON$MP+$zp4QR7V6I6%1B!4PUQ*`Y{2`cGU zP>Ygyyqv@`--ei`+a)NZ`${Ni@0~If@`dcDMsmd$a~U_Db$W6bns_GjOIA_?4IxrF z6yh!(m6t##--C5$mA!78iX{z4h@Q2C7>!|?&~saem(wu0(5NOJqNo}brBiLwaE*rR zG|;6`-_bycTDrQHeyAcXFHxmx+U0ZKUHw^ogsKmXO7aN%H{@0IJ)U14@=HpcH}~?W zU0kF>%CQl;Pxe|);qzNp)AS`&r&@TTA`&Z3vQ5c@3e+{ZuCh#Q>i3txZWOq<7Tr}t z(FHrGf}(=4(Z+=&Kh1e-5stmohZVrzhU;u8J+6RWi||(dwTcMO7VMJ>sI^$H8j5J) zX%*CZ)MrVeq!5UBj+S6<7TnF8@zhORsBY0fl>h(9jd<i9_A+uKeXrXfejQBd%Lu=E q=)x+xv5G$5GH-nHLPo~AXnCoKMKk}$3x58I_Glv3UAJ?`!~Pz9r~*y^ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a036ac10bbc433e18b1b201ef778482cc932aa38 GIT binary patch literal 8884 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 TO#V63I+ix9A?u7~Srh*YHiO6F literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc29366e41bb571e946a5e3eed0190efc8f48b57 GIT binary patch literal 3995 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d563425ae79890b66a197da5de33ce1ac75496c9 GIT binary patch literal 19800 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 YOn-LbD@JPKnOq*fUoj@~JQ+6m-zw49xc~qF literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..649d897f74c0799c5faee1ca522989b23c183e27 GIT binary patch literal 1452 zcmbVMPmdcl6t_K-nPfIeOS>Q;aTpMyM9WULYO7vWD+FBNu$NW^g;t}<*hywG|FE5G z5_T_yGoOJgd=U5!K7xc)i38_7@t!wbx`-1_{2R}E&(FX2$Mc}q3;y`=*XMt=2>G47 zHW;iwhN->);DpnHlypQ(He#hSawy7J;f`GHaJOic-pDKckxz+m^EPj7>8Qg!?tf24 z0dMmTJoh+zLI%N0@J9xYxs{AnT`aVSv$CnBHf^3QGnLhq={GW~bUay9sfPE{mlU@! z)Bn6$CPl`d32E*8-D2Z?eHceC4pOwkflmkKr!duR08Mhr={ec5oNWovV5gV#5Ln!e z)1<1aECs(C5lb-@E90oe*tClJOvnK>Zk3ecCn9^`=du|Bw`HQmaGA*Aq%Jsc8K(20 zF78jpt0jM^9><T;@p^v$!DMq*rbjTQ)$r-C$(qBgQaUM$!-u8VaJ5n>v@>3ciq~@3 zB<VbvX4Q1K&{?6PW^LZMK@hq0F)FMNVe%H>b=W9FferglSggC6K+yDpd`YT(muNZ< zWJn=D6y#6HS7b^qAT2rLbneJc&S~y&mb)m~(k%rmkmy$KVU>9+_pfRS`u1nw7k-Yl zB6)|m=N<Wj_27bC2Wt;@ot+)}B02N|Sp96R0((xdJBQ?ZR`-k5?OEO4wXSP*zgb<^ z>bh4t4riSM4=8DG^IZ_acsk2e2>+#!>riE7RwOdib+~JmD2|nuar{v@Ug&U^sIaa? z2o=|b2zfS{2q~&mDC_Gi)3Z>|M0l30!wk(UUI=AHQWPRluvJV;QR&ETkl1<~_uHe3 zcQ^ir&!eNk!TW|78r>)o_NK!57Qi`q(Z8TjC<x;j6y_Vou|w%8^qvD$q48OCWa!Fv z;1ysCTy~D9q7th{p4>xUSbdjl?%n7YNCIA!=(wn%#nnl4z323QF_L%SlmU}>;UV`C z@LK#sO1=rN2QXjJX-7@1G~{FBM_ep%;T`}EdeX<89)M|yrcP(ZOPU7mf$=7_EE8>* z6f!`)o7Y)o{9VS4(@0@l^lKdOiB}bZgFN}Wa80X8q*njpX7>LpH5iF{4}f@#c4?n^ z%yj~K$Nd2C9bCPdOrqJKYl0ZQO?n|k981i)#Cl2>;cbKv0Ryuk8b7VeCM$&Opa?Ih hb@UoLn?tOrX&;w0Ulig5y(tWSpS9U-Cve)WzXA3uW>)|J literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d046cedc2a55aea67a459bf227cc849e6ecbb5c GIT binary patch literal 12005 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 K^<Lhv2LB(CHB)f_ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/_compat.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/_compat.py new file mode 100644 index 0000000..25da473 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/_structures.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/_structures.py new file mode 100644 index 0000000..68dcca6 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/markers.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/markers.py new file mode 100644 index 0000000..5482476 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/requirements.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/requirements.py new file mode 100644 index 0000000..dbc5f11 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/specifiers.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/specifiers.py new file mode 100644 index 0000000..743576a --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/utils.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/utils.py new file mode 100644 index 0000000..8841878 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/version.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/packaging/version.py new file mode 100644 index 0000000..95157a1 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__init__.py new file mode 100644 index 0000000..9c1a098 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..741c612f62a1fa7f057e798532ba10450f6e881a GIT binary patch literal 287 zcmX|+!Ait15QfvPqO9&a<hqA#T6XJRM7(&Ff(ybT3~AGLL(?QAY2Ef|y!s@*L$87l z;mPbC{Neu?hGG7h^<pvq`S^O<A%woY{}uS^(c9j7FtkT3*as|pLCe{A_iCutrLov4 zoOfI>oDJ@vB-XTOXkA*|SuSgwJ!Lpew)mh_W9Q>#9HmkGybPx+0Hz9n=?0+pi@1^i zpUBL7*crc?Xv2HzO43t9DkYd7BSk};NUHqUvyI(CTI55MtgG?8En=@)k{!`pueh|1 t3bER><;d*Oo|<R-G|7}9y43zK0>CAA0FfT1>-$!*PLvPf>FpCP!at-eRhs|+ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca8aa57fa141cd938b2b1618c017329c06ea5618 GIT binary patch literal 5630 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff8d9c7b29149222064770b63db3069da17ae9fb GIT binary patch literal 2769 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 WgHCuOU@rbL1h)Hs+Q1Du0sAjxo6!6K literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e4d1c854010de696faaa6a348f6410fbd9fbb02 GIT binary patch literal 4813 zcmeHL&2JmW72hwCONyc>$@;QvXYJTE=*E&&J9XNoZ4%dRg1U-Z8MUz~uw8LR(o*}u z&J1O7LG_{lJ+<+n#~yNQ|A8KQ%q7<xdfID&q5=9B6e!T&8&VRb#J=?7lqKftz4>_a z=FOYm<L$}G+TT9@^ymMYH;lg;V_ymNw~*vNkTJtIn8~cz^i5q_zNJgsw^7=$la%~Y zQuZq*^>bo3sruEV=1=Ih71#Yb=%sivY50v1ZOWh0b2R-X%5prN%=j}S-mE{%D$I?~ zC3F59XcbnC=aU70LDy^XVzT5fnFhBy=lSxX>0e+Itp1_lUu2W4f$|cYVoj8<uw^#Q zW<E51kIk}kY>v&dh2J~=Wwywcz`w$m+4)^d{GEG;2IjUljMjzx-FrK{z3YWuS7aUD zR$iDgZ!>J~aw_{?s1#4SDoVFKm3f=JC}v(yQuERMN8amecfFk~+m$P|&!IbGy=4{U zNNz<jFPu&mrD#_lXGwfth)fhtoQ14q7Blz4IOgn;$l6>=%>%WP>@r&Ha}zV6y};9O zGv+}%i?g2C>cv6UQ{A2dtN9KIazEXRM3yEz)wD;v3whp!IC^@~wn!v=6{K58_mJer zm|Yo%#&h$d-yT@~#evl^2j-z^8p`V6gsJw#NG~~ta&~LtEfc!Zyb`mB$LtN`snI__ zFgoSPI5ZDzJ<b`}hn60B1tTjM`Kz&!C01sY-+(_FJzUj3Ue!Ib>Yv8OR!>${?xAtu z==Ev?ht|vg+`j-xssjhISO+D|n;4WvvRoa?^4t{l;~8yMKP}Cm)Tyz_L-V;QZ(w|h zHHPC!Ry8qjsC7_Q^+B2Xh=+QODYUSD+SDVO!<HT~*=dY=D&2FM<WC#A-^|fop5UIT zsZJBS0QafE${WT{jGt1?fL+e6=dZq(N~O)jL#d+n$oLrV!Zdl>j=0Rf{vd>@F*40) z*!{(wALR2t%+zQW!GGC{1ef3TuF3p5&C(Mbb9mca1xL(aD-(e>`9QKrs>iTAm+!ZO zDBa5Pt0w}oei|lUF5zoml<+0JmmiD%sjH^fCAlEx!k8$Y;HoE5Z2g+Z=f~t9>yuYj zR47)q^ZdpGXbB>6OyjYP%k;YPcEUaGje2-|U-48%S(?wiuP>QLcbK~Kee7K37tfGs z7B7W9H9ub(XGaqL1WW5VPLBkO2A!~5)1roJSxj`JF7&F8ys+bJyKqR$qD;&ZC->oB zc-i3;)%*Kx4o{V(f-by2F{TO}Tgv3KNbMA*F8L)vzM-f<NbRd?kqnONWx3N+QCyTo zq6FuyN>S1-u9z83*q6r^QrJA*D;yY%EG)$emu4eH7fv@+JAX99D_G~B$!b?bd!gd1 zd!bm}%3{WaTy5{Js(5W{bAONBk#~dF+nfE}wcA_yv!s0s-*&qCcokZ?Inv6_I|<L3 z+?PbuDcHlVGO^m#j&HS1o_wX-FQ#>E+;Z{a8S-by46|lhNDcgIX4#^8Q@4ioBYN4a zqo0MmsrhBAZaSuGI#!KFQwyn%mTT87aTzmz<!;lj-0g{P{;#-OQHNpue?0B89nRy^ zo_0ujxu?~Aa%bh)PK<Ztg>Dw?|ACLqqwdRm>=Aq9W5pztDH@bbQAVy+G?Bf~vFgo< zY3eubQitRjBF|Db^rcws*q4s#g8YtHK-Q{=MXE1RcAm0j$}UiLk+Msak+U3T9%`rk zm|paKkmX}!|A`+X-}R+l>?-DM6ZoW$UL{hF2919~MHvGCen25pX}~BhX?UYSp@ugO z(}0dS8%F;fRU%ONQRBc;<pKH}*aUfo5NBYs(h`8&z+q*SC6pDEWj)^!6#N=NH|1_w zfRevE25%0lvKpJvP!j7rHB@zA5coQ%sM?^Sp_&WOHmp?#uKWbE)>)lk)}Sgs(=C8K zv|IqK#(Li9_D9%%MFFYj=N@D|VE;4J`5#A8!~WCs2YFq;iZ^9n0=pOP5q8QahxAb> zk<UE@^aoryJv^U(FWn2{=qw#bYk2jqZ4mJC^n)h7EsgfR<H@$j;@InT3HV9Q^Vui* z_MYn2nmn=2F{`IDEu0LFs;JU_1Byw6Lsa)iysv{1F@dIj)CAc?QF#`M6u7KaD{2z4 zNSg;N5`Oh~GljY3pXf1Qp$dIhD*$>C*Yq4CP3U{zyBgR9*{<(u!$$3_^_TQ+evPqm z1sPeqt6yA4zuGgFi?)lmdj_d&)ySqT2fdIiaT6nsZJBmQN!#)-P*Fz5L?{6}?&#o_ z*<?{@*#in`Eagy$2phIK0R0E{z!pCsYh(^XFhJImF6uVInqga25kzR))d0S_E^c6* z{My?dG=;b_6Me6pr7Da_k!Q>RxZ2s_aW|j5M;JzW-B3!-iqbX!Sb9ty9)DpA&V-BE zTN8yFitTPFBrh6oi|rnTf{&;vih9Uc0IsGLHQkBYQdBWi>qm<SKq#VA6;25JTi7_S z!U3jLEe9mAz2{qDSJ!~>zIaGZf(`uv6H0P*1|cM%CKo3_C*qh*t6_>a!O5NF4{jxt zuO)eD`Geb|;u{GTDj^c#%6B$_3<X81Vinmjpd$ZjBkALN0~I<xX71YJHF6mp92RPD zI7<ec4GwStN5`xsV*#<$kg_q1tL*i{N|pF7<^Zm>GVGPms<;b6QI?7!!lnQoQGdUv zkwy@GGcKVQB@oM-7yzC)W2@qu82<^9q&LMd&zXysrWI}wkcNVwWv;hgEh<64vUU)N zHFPT~fce|72JwB}%H#@xX8oK9+ONL9{tV#m$_VNL-O`=a*HzHpHsU&Eq<h@V-X<Iw z{i85^+Gtba9I;&bTY(-Y{fvn#p!qKStso$Qwg(>p!k)gcIvl~R6k)dul&)PtQAOnO z5W>Q)up?3#_Ml%<LcZEb3@wU|TF^P^?T@KRKW!cuh5Kfbv0lu-N5?AfAR}N+KZ4r0 d;<}EU05)BC+x?dNhI_d-OMo24<+v5s{5P95`a}Q# literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56840a07f0f0903589a7b3df936c4a96ea438e75 GIT binary patch literal 2934 zcmZWrTW=f36`s9vxuRr8aAL=8(*=qaCK^+AoJ%1XK?GTL6{u7pD|NeYuv~G5)KYuP z>`=FmPxNE+ANtxqk=MTU2kdKs0{#nm>UV||Wu;5Z;hEX9XU?4S%{TL8b=CjxKmPUF zyv^8u*gH=P`d4Vx0D`lSaf6$w5gPj649$y{)~wKa#qxVL6ZVNO|6nlsaWl03#&Ywo zj9c7(!$Ri;;|_P<FzyOt<j$<Hfq!pc@CNtZ7-5r}FIl^Jx!+CtLI!Cu3<ibFVx^LN z7@Q^QIOrE?F_u-w_qPi!&@B_egMlov;INQ+%!`kMtupQ(iy(!Qyb`?QzeVt@+b2nn zfwqFSjaK~yf*Vt&m^@I1GDj9SXC`!LBYTF?i;ol=IWv5Qf0tV`gWD&z+~m%bVbOPN zrW#oEpXZC7FL=VR5V!lhc9RO>U(_xIE-OiMAGSU8u?kVujpLXMWNlR!Rqa-a3n`@u ztFT!KH7=EqS?H-`C{#Yq>gLXQUz92-^0rYs+UY-;^kM%~xlzjGG*)8cG?p8KB897J zqkpoY(#M0N^Hct5^+ohq|LEf6@sq*jS=N7qXP9psZj?#+Fv%+wr|H8_GjYkQ^NI#_ zi%vz(3%OB>^0UWZZ0IRbnNE38e-O>%jjC~37E)D_e)~&AQ>{ZV!#3_4rr{ZDy19lV zKrIVFCLY>XXw{bxf&p19G`SI4!X7!?gha|A8{CHUxSiO*$;tvTK5ud#$Xekp65gs? zd&Thi95O;){tmq>1OZR)04P{Q><4(>Qo7$-By@SYebVV^pgCw7DgTB71Q;W8!X^mu z2h(5)o3O~581hF&Sou*o2-ln$<>y)hR?5%0J+=6%YK%OaS?q)rdwlJL<+ce#$=9km zvA8!gr`CCA!bbjRWyYSdZ-dw7)Sf!32|ulgHF0JpS;4}Z*iYGa$FG=v=kg}-sNY1Z zuw9$6sXK8;w`Pp{A5wI;G5Q{%H*awp{Z+m~qr8QL-HP|IcAW%D#AYmq!BJ79dYj43 zU?-1{Qc=yjS2^q4w6Bz;-8snAW<dGQL{-H@vB>+i@vcGv(lj^{L0pz8ZCh0Y3LBO1 zpB#-9CgMq71;s#beJT2d<W(m)JQm9-l{i;$q0WTJgI@2q4>aQ1Rj(JsIoBhA>l}xA z^lDCRC-~A47bOfS@*>w!q~cVhK{B|x*dVE3aJ>qhA|0i6SZyxMGpq^DsyP*5e+<d> z+$Sv)yEw_?MPiph^ub}vj&{AsCdW3`8GQytCE5R{^BXW5<@gHUG+nRvAg=mk-bOyk zH13OIO#?wf$ttB7B<B(Q_IlSV>U4rr5Cs^ee;nsS!8bR9C!J50VQq1anR-3_*&@k{ z@F?kWIL<__z{rFkdO%E#g+b_m!{R|`<8M$ic?(-eQ=nXfRy&9`N$_?kA4wcN?Co=i zZri*zY+G}k?6uZjuN#Z>*3IQsue~Tr@<c^Z-Iy1@(o`dDe7B%aq*l7<)~&^Q@x`D3 z@q&HVp6xu}`eyGi+TP#WKX_R?i4s{AI;xCi2A4T;N*Xq3j;b$14|JTx=NIR7lS+G* zaCIEI0MuEMw;MIqn+{}?Vt!8tFc{9GLhJ;yyr^xeeQ3d%X79P6Q%T;1_ynyAAlTY% z!!>-*2Zi1@eDe<I^uDof5~cd4YhAvNJ-19l=PC<*qBMGLFxcNQpxDG188c%F1_P5B zbl!m{jFHW)AHYHr6BgjDyWozIbHe1;#2O>#di)-{!=`p_<NUMnor|}P6IbT+PyG+s z)Pe3z-Q44@jUE^Yb53mdbkHm`_b#1~jqc^`?<uEAoK7EppU0V)YJ9ZKTIU+$wN1l6 z8NsC)1d@)GcC)rpk=Km{)zmKb0d5I(bDmt7%iq9GencW5agW5WAleQ2Yy8#joLy== zgQw7!$?#Z3L@u>c;rbxL6�B&8rqRmz?smV%4kjssA)5y>H>V`T&9%zR^NkH}09X z*@Etwo_TryMzL;u+BOfnIKY5oS}t(xM^RSraY}kCioP4i>EcZzig?kFBKbb8#NO>b z->)05whp?x-50g9b8xVKP<z`4yNA2mTYK^sFw&TkACpE`g?EHT+$zQ%pjEWXJOu0l zb3mQt|6bC&J{^nn5UQx@^Y9TAIuCK;7^ttQtQngb`j&*FdjgCtbRdLuP8B!0sDO@p z^`(*`&i)A6PKB&npok@o^{llmi$c|Y%=wj(2ctdOK){Eii%l0O?cir?s_zPYcIg6+ z<zSpf#aNYNRUqn$E*%V45-N;*3cc-1T8@rPlY}OYdSy4Gd(DoNg`D#V6<0?mACpGk jzB98<E~T{gp3aN+B@vLm4B59lfWX9z*twS1T7U6B(PaS_ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4f42cf3c18e463f3dddce054a7e7c9ea0008ae2 GIT binary patch literal 1023 zcmaKqO=}ZD7{_O3C+Rk(r9CKkkv(`>Fj@OXdnh6ZQWWA#DoPNR&CYJR$!2Dm*(Oa$ zPxY!jdiClj@jJ{_5c(B7`OKu&D6Ip}^X$C;_xGQzm6h6$FW=se2}0k|LW4ef451Dn zG1Nf}Gm_&Dwv}{9Li!HFcM)?26}inQt9(Em%BpM$YK5;c_i|);KEg;F`L*f(LBv^} zcruAt#(N(0ys^wm^Zl&-qUB}Wdvo}-vG>3e+<Q4GkDzSXWt+_l(1KbQ4&>MfG>t;k zAf7|0CZrP0tVrg3bk6UbIwkIt8JamMnUPNzqqp!ouh47s4k}2ZEse+1%5j-C_I#|} zgvY`t^Bqk^k#J4>N<e1E!@{T95#7F~MN}T?>R=qnp3*q|iew#b{>g(vW}~P~f>9)c zROBp?Du@R`nQx@slM&liyWvjUoeVa%(&=~@KZMrf!C_EjMI+;?jPks(Jxr!dohUPC zBOE212^kbgv9qxo#9|2dH;aj`8FEQz1TLB1H!Kid!*UgBj7<-kA+-$g1VY`11ca=e zmQei^TSE8@xBulLueeBawC~6Y6j_C&X)Yq>6KPJCw@fk!=4r(&ST+`0ZD#h5wsq+J z<(`?g?rp-y+`Th$es9q^MwpY~8TovJgJj&b3V-We5GoBBpGp_XT&#I5*D1EtjJiv$ zb$mTS50=akg3O!nk(MU1yGTr~!M^_hljiE%5LegxRlO93OvGV0XYQzp()AHMs!Z@O n<EgNk?al@K)(Go?yFV1{I8Pp#x1h|cpxDJOStTy5RbBcEI$qQ+ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..327c5a4034b45b34bc30b2ae286a107a0ee96350 GIT binary patch literal 4207 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 DnO|++ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ed31db4128ee8bc813134f6cbe1fdd6e186c818 GIT binary patch literal 5488 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 XMnqh}MgQAY+gi5UttDs4aa;ca6``ks literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/_in_process.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/_in_process.py new file mode 100644 index 0000000..d6524b6 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/build.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/build.py new file mode 100644 index 0000000..ac6c949 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/check.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/check.py new file mode 100644 index 0000000..f4cdc6b --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/colorlog.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/colorlog.py new file mode 100644 index 0000000..69c8a59 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/compat.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/compat.py new file mode 100644 index 0000000..01c66fc --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/envbuild.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/envbuild.py new file mode 100644 index 0000000..f7ac5f4 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/wrappers.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pep517/wrappers.py new file mode 100644 index 0000000..b14b899 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py new file mode 100644 index 0000000..fdd40de --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py @@ -0,0 +1,3286 @@ +# 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 +import ntpath +import posixpath +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 _get_metadata_path(self, name): + return self._fn(self.egg_info, name) + + def has_metadata(self, name): + if not self.egg_info: + return self.egg_info + + path = self._get_metadata_path(name) + return self._has(path) + + 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): + self._validate_resource_path(resource_name) + if resource_name: + return os.path.join(base, *resource_name.split('/')) + return base + + @staticmethod + def _validate_resource_path(path): + """ + Validate the resource paths according to the docs. + https://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access + + >>> warned = getfixture('recwarn') + >>> warnings.simplefilter('always') + >>> vrp = NullProvider._validate_resource_path + >>> vrp('foo/bar.txt') + >>> bool(warned) + False + >>> vrp('../foo/bar.txt') + >>> bool(warned) + True + >>> warned.clear() + >>> vrp('/foo/bar.txt') + >>> bool(warned) + True + >>> vrp('foo/../../bar.txt') + >>> bool(warned) + True + >>> warned.clear() + >>> vrp('foo/f../bar.txt') + >>> bool(warned) + False + + Windows path separators are straight-up disallowed. + >>> vrp(r'\\foo/bar.txt') + Traceback (most recent call last): + ... + ValueError: Use of .. or absolute path in a resource path \ +is not allowed. + + >>> vrp(r'C:\\foo/bar.txt') + Traceback (most recent call last): + ... + ValueError: Use of .. or absolute path in a resource path \ +is not allowed. + + Blank values are allowed + + >>> vrp('') + >>> bool(warned) + False + + Non-string values are not. + + >>> vrp(None) + Traceback (most recent call last): + ... + AttributeError: ... + """ + invalid = ( + os.path.pardir in path.split(posixpath.sep) or + posixpath.isabs(path) or + ntpath.isabs(path) + ) + if not invalid: + return + + msg = "Use of .. or absolute path in a resource path is not allowed." + + # Aggressively disallow Windows absolute paths + if ntpath.isabs(path) and not posixpath.isabs(path): + raise ValueError(msg) + + # for compatibility, warn; in future + # raise ValueError(msg) + warnings.warn( + msg[:-1] + " and will raise exceptions in a future release.", + DeprecationWarning, + stacklevel=4, + ) + + 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 _get_metadata_path(self, name): + return self.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 = self._get_version() + if version is None: + path = self._get_metadata_path_for_display(self.PKG_INFO) + msg = ( + "Missing 'Version:' header and/or {} file at path: {}" + ).format(self.PKG_INFO, path) + raise ValueError(msg, 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_path_for_display(self, name): + """ + Return the path to the given metadata file, if available. + """ + try: + # We need to access _get_metadata_path() on the provider object + # directly rather than through this class's __getattr__() + # since _get_metadata_path() is marked private. + path = self._provider._get_metadata_path(name) + + # Handle exceptions e.g. in case the distribution's metadata + # provider doesn't support _get_metadata_path(). + except Exception: + return '[could not detect]' + + return path + + def _get_metadata(self, name): + if self.has_metadata(name): + for line in self.get_metadata_lines(name): + yield line + + def _get_version(self): + lines = self._get_metadata(self.PKG_INFO) + version = _version_from_file(lines) + + return version + + 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 = self._get_version() + 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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca07b8f36f2fce43a76e7a6eefd8ffd4657cd0ec GIT binary patch literal 99617 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98f834a6424d2ca0cb8128f1bce84763d2487bca GIT binary patch literal 664 zcmYk3&2G~`5XWcMPU<91s5tfwd}vKRfD1xMkO~kgNU5N;kWA{`6n|U0Ziu760eBFu zJPGfxS0tpo0w-p}SI3(F&aBrvKhKQ&{qB!1-(HUxz<0Q2HpLIf)f*BH95V=huNdGi zX91&?WmawnHUjT(o3}n=&=PjiuAcF(V9A~h7Nl4{=DidOn*l=L2uHpYt-=<Nbb=1Y z8F=oNs=$ed+EVfAI3k*zS)}{q56RV2l4ejtf*bgR2(O^HV?)i-u6%^>o*}FcHt2#H zZCGN}R$`}?oP4Bn=Z2h4d|+o#kaM7#c;dA*E0uQgc`A4;mEL<kn@U+q-4aq3rEX8B zXHRCQo~7+-Ucc3jSjDOi%T!xp6@3NSBcz{=U&(kmuZ6#yOMg*jTu9|dsb6Qq#l>pL zC+co^JGyAn;drrrmq)kAE(`zEuj1-3E>u0wvcpL()?BTW+1z=!6a_D(U!|9!6so+E zk)XHDco>yA;T%<scEi8y;dtnnCUr>w84hqCZ=&o|wl!Vcnt^VS#KU8c$pJ<3hDoje zu{6E*y3%|g+axrOM(G|Q9sR+PW;DBNwe{kBq}?U`Y+M#$Tr5gGD1_kZACxpjcTKt` cuDRE_mzVr16ZZ{~GB6I(!(6NDw()@d0-4XCNB{r; literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pkg_resources/py31compat.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pkg_resources/py31compat.py new file mode 100644 index 0000000..a2d3007 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/__init__.py new file mode 100644 index 0000000..e434c25 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/__init__.py @@ -0,0 +1,177 @@ +# 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, print_function + +from collections import deque +from datetime import timedelta +from math import ceil +from sys import stderr +try: + from time import monotonic +except ImportError: + from time import time as monotonic + + +__version__ = '1.5' + +HIDE_CURSOR = '\x1b[?25l' +SHOW_CURSOR = '\x1b[?25h' + + +class Infinite(object): + file = stderr + sma_window = 10 # Simple Moving Average window + check_tty = True + hide_cursor = True + + def __init__(self, message='', **kwargs): + self.index = 0 + self.start_ts = monotonic() + self.avg = 0 + self._avg_update_ts = self.start_ts + self._ts = self.start_ts + self._xput = deque(maxlen=self.sma_window) + for key, val in kwargs.items(): + setattr(self, key, val) + + self._width = 0 + self.message = message + + if self.file and self.is_tty(): + if self.hide_cursor: + print(HIDE_CURSOR, end='', file=self.file) + print(self.message, end='', file=self.file) + self.file.flush() + + def __getitem__(self, key): + if key.startswith('_'): + return None + return getattr(self, key, None) + + @property + def elapsed(self): + return int(monotonic() - self.start_ts) + + @property + def elapsed_td(self): + return timedelta(seconds=self.elapsed) + + def update_avg(self, n, dt): + if n > 0: + xput_len = len(self._xput) + self._xput.append(dt / n) + now = monotonic() + # update when we're still filling _xput, then after every second + if (xput_len < self.sma_window or + now - self._avg_update_ts > 1): + self.avg = sum(self._xput) / len(self._xput) + self._avg_update_ts = now + + def update(self): + pass + + def start(self): + pass + + def clearln(self): + if self.file and self.is_tty(): + print('\r\x1b[K', end='', file=self.file) + + def write(self, s): + if self.file and self.is_tty(): + line = self.message + s.ljust(self._width) + print('\r' + line, end='', file=self.file) + self._width = max(self._width, len(s)) + self.file.flush() + + def writeln(self, line): + if self.file and self.is_tty(): + self.clearln() + print(line, end='', file=self.file) + self.file.flush() + + def finish(self): + if self.file and self.is_tty(): + print(file=self.file) + if self.hide_cursor: + print(SHOW_CURSOR, end='', file=self.file) + + def is_tty(self): + return self.file.isatty() if self.check_tty else True + + def next(self, n=1): + now = monotonic() + dt = now - self._ts + self.update_avg(n, dt) + self._ts = now + self.index = self.index + n + self.update() + + def iter(self, it): + with self: + for x in it: + yield x + self.next() + + def __enter__(self): + self.start() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + 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 + + with self: + for x in it: + yield x + self.next() diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..19fbcb7a25ea657a80b363bb7d38abc25082891c GIT binary patch literal 5563 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 CZCD@x literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20a09c261f871db7a26f2e538dae4c5d535be8a8 GIT binary patch literal 2764 zcmbVNOOG2x5T5sp$M(j%d9Vqug|J}_Bu<n>APB)^A%V*(QV<6V$(nVKz2l6>rf0kl zYb+sc1PM>^P!KmD2gC`93rCLphdu@gX@3BhT;Qvo+4XL+9KzW3RabRSPgQsI*JsOR z_pk5&c<)3}QT|kRJqFr!Nc;_eDNGHOp4w1VYHOj^(3sAQQ12NHLshOQ%w*OLg;~C_ zsW(j6HgjM*z6slcU0^P3*SBEXu#2n&yCiJ~c9~7Vo|5AWun({b?22E&co+6Gn}Ize z?IP2zDb<5ph)k)fqB4wvR-gIJFi3pvh4Ipsn)NtWdB4N`IBwC<?MFkS4vAj?_)0@% z3er&<I@1~kL-@>SSj=qL%xXAUB8>to;FGS<FL``x4)2Yo=NE#A`Ri3yn_uX8&?9Xw z9ck&@Jr)1sEsB922Vz4OA#oRwD5=s_A=)8jQyo)FP1RXttf8f+$`NG@>>8<hNEsVw znJGq&O|&f8YcaKJr!>Y%jg<U_)aqE6%SPKx?M=B)2v}PZO0_8TAWDR}7O-SRID>pm zgx$l+cpYCD?H~+=>-Pr9MpL$}c-U?S>%!>vgGji`9&Zk~PafIMd+jxj6%V7TBaGM& z+oDV_`>YxIQ3szYWiw_LFC%rKV=7@vKd+F(2!qJ~S>cbuxYw%<c(Cdver?s`wRS&b zK96gy>$N02(_UU*W#{4-o9A208`saAZI9M^t<!iqQSF`DAQ+qsqB!xw@Z`CkKVtEE zOin4yRX<{Vj>)rXs3C|`gAHK~2MiyZ!>8jJfTC7ZS98_uH={c0$i;r2%7!gr`<-Sp z@_K%=DcokW*Js0!+NEam{h=3TJsc-Vk-2f2lOH5FKrlt{H~}TQ3mzlW1k6HW8s@0R z<fqBLJta)FRj0vofCoxgLkZ*5p^R;2q6#cgTwL*ZCx|*oXH=eF82G&9M@f~<&vUBH zp$@ov^SeynzPVI&_!DsPCkf^VXt(ywXuo8h!r+sT*ab|I;pE>xkwfTtAQ2tG8)Eu0 zstU1R!y@A_BZWN7A9H<YscPOI?qtRHi|=WC?K~tVnxptQdH#1~ive$iyCVDcmn^bx zZ#{Hm#}UWNdm<yxp2!Mt)M?0bfbBK&^{&x1nYyX+V{EEnMFu;75|A{DGALsuD`M*H zsKxyrcHRrIj6z=vBDw#6>zL~9?N4)kGuL0_`tw|Wmg`S){c)~u?T}pw^AO=JLgHTm z8QJADCkYNzrX@zI!Kaf>^;w0e4mOdUv?bYr*g%D#yspZOqe`mdO*=K1cHQ91<W1p? za1o6iSXN>)Ej95yXA@+)Nt9WDAAOj`Wjc{0Y|vxsq|{SP-43X7TtvH+7I#R~T;jAG zoDLbM#oqb{Pqi#`FqyChD_-o!*)gYdIn}siH+js3j>{lBEz{I7Apt7!YKb3)5_XhL zBispP3NvaCLByu)5>}MaB=IIEW)OC3$T>ETA0?MOkjJPssc^|8L@{qdV(L`DW+gCL z#%xpS5p@=x3Vfr(d#hoG=5$#S`~+U+&jPB2%&|a@DghN<*8e=U=pN;C+_T~LQ-{#w zjTrY%=q2qw?+F()&69X7NLKi1dh0(q@fq~K28pSp9K>vChQ`Ue=Ri<z9TL-$Y##{b z;zFlOyC|Hi!MaZcpOxzmALRN*u0PE6N148}t$)hx-*Wvs(c%SsgTG2}k$}SEb%NIk zE)h`iSB?7_Nv1m4D%q0z^$Lc+3yC#=qjIwM<VROS9kMq+8~Itt&k@eG6_0Hozujl~ z%Pi>IU*-DiT!Y)qY(J?+_+^4C1aAQzBI-9VyaCycn(S(c?#1>n8FJi<obur>5zr~( z1_9+FuK~%p{5YAkp)zYulk6(zoi!59h3vMyNM}l3)+No+N_ypR#i^M1JyJ3L1tow+ A(EtDd literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5a5526e8049a1cf0ce13650721371819ae78d6c GIT binary patch literal 1537 zcmbVMOK;Oa5Z?9LiIXNJhypDjK!}$QZKzt{f>5O%5SOS@IYpI>o81&s+evqwKBD#j zDG!MQLgI1d$}izR>=7iS{s1mLF|%>f7PSX(G~ev(V|Hieo6MBU#a~~)FD*HQ{3M4y z8^&`W>L~yxoJJ(3bxH}hIE$>9)md!UZAu;yZgXdsa7VBnt2<!lcpmJ$u))rO?eYTH z1!L#IF7gquM?@ahU0zxwUU?60As*G0P7*d+T=-F#3K>LdkK%%*-N#8YOkh&G3$nE$ zg;EVXGx#hR%z>ye072@Mle)zzw{}ULaRztTIzQj)B;dAzKJi1%K;}Wr!EN%Kq!iHV z(H;g%;2^DeOgkGAFJ~&1+6fabHsQ6l5>fLTkt1+^f34b<;d+pY>Uton%~r&PRMp06 zHI1g5%bV+bR^9jSHkP+mr)Qeojks|KzLli<q}mSKlVPILAc`huW6|YmQ{ki$e_bTJ zCBb<=>T07O#8i7r=Q?c;7oNlCV*&{6j%G1V^_OZ8w(I*z5DVYeMc<EGyc6NL<oj!# zAnLEkG8{Hx9D)+g<p9ot82>Ic_CF`SU>?O=8_9p9Ugq%~E`Tmb5eLA6WW}Shh|`$) zKA6{H7#BeX*{BRJKFEh0#WSZ6DhMZrei~LUfDA%M`$*^on3%&2;{Zd>m4R=D;dR?^ zdsI7%Y0y~Rr&oU?*?xR}k?EJ2?qzy6)2}l9I@515{dSl=^aCB+C+<BMqy$I{l-;4J zwM{u4Cn<v&dz+3Cpt7}Nf#u+yZEFH%GHP2jiLShyW|2sAuKg@fLTMI<iDqGvYIi_8 zQw5Kitm}M|ZKUCG6}Sd26%vQgA|0pQl8Jv<fr7*ymB=cI)RpHEFo$vi0dp>~it-YG z=lor;%eZu6)y}}`6%d90U@o;Si8Dv)hMAiKQCR<B-SSYk9JITu*+MA#DgW{=(;qYa zA=95S{k{h8y8&+GO@vzrw-G!5&p!6)2b?t{L)`1I9nTH8hIY*>V8=E)X-7iGO6+h= oB*rB%1k;NWS!qI)c;-+!hR(J7px^Zmaj(L@DbWh6IPfd{0gA~wBme*a literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5393e400d5188f8f5117d2300afd0a526089e330 GIT binary patch literal 1452 zcmbVLNoy2A6t3!RdNv(*BO)RqjF7Y;5icSE4<cv?B&R0OOr~lkZF;&pRnwD6h^KfC zE(eb;bMoZH1zeB*hdwF@`3rOMz3wv1NG`F4_g;VXYO21s%~Y$U-!FeGGn0^CWMmoe zJqIEKP>e7dkPdYzB}`*_pmlUtr{oS{1~VTKW^#Q;cMZT6D*!HV1F#9$W<|io3|oLp ztPHrE;R4_as{*cO*k(r-N&V;^yh!RattFw~j2QO<zsp4<kb5+D*muL0AHrr6PySu| zjL*XkCoW~g)mYKhnduriFV|!?yiiIDi?JVuTny>tkS-7D_K-SDO}rkL2BL%929cLR zZIcJ2OF?Tp^fY;hUpk^~Ize_YCj@S#^K~ON{gCl~ss}twt$4K|xlGLs0bJ`^YDgZm zQtH1Uq6W7P*PU4Sy+)Tiy@qgFQNXy6PIJxa2GgyTevi${8{YNi%I4biOlxbS)4T?& z9Xd-+?8lRSD7%dyn4InKEhhUCH#6~iJY<o8%cHj7QaUmZb}HUXtt4jf-~>j72_v*d zw~nZ6Oyy39Ls;Mv1ynYwBB;8R+MX9SI^6TplIL|ImIU}+@x1k<5#%0Gfum`8)rYz@ z6CooZj^hm&@Q6Bw5PFWB0+INdO$};j+1|lrJqw5S%Sy2gnb9_|ypVh=EiL$5#gSm~ zem?)G><4AvEBg)uJOM|<NmR%nV?9DIW1De21KtZD5}U%N0`Y(GE8mZzaGc;1Md+!r zkClCP7=oCVOCtmkj}gS=&f$Tvxljp&Bx-GIKZ)ggemI`R-A_5G-OtK?QTFR$NMgTT zK@KX5h{s4`m(AgUi=h6kGBa^}nccR5XfYe$%7WkL!B{#6-*RRHRrkSLg<s_M)%V=K zR(7Bw8XPK;bHMK^5>=5Pp05{iAX-T`5ik$}T`3VbUs*qAO(U={0s|NLpM#n$wQuG_ TbqiZh;v`jQMXwcW2LAp4!<{lK literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/bar.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/bar.py new file mode 100644 index 0000000..8819efd --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/bar.py @@ -0,0 +1,91 @@ +# -*- 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 + + +class Bar(Progress): + width = 32 + suffix = '%(index)d/%(max)d' + bar_prefix = ' |' + bar_suffix = '| ' + empty_fill = ' ' + fill = '#' + + 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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/counter.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/counter.py new file mode 100644 index 0000000..d955ca4 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/counter.py @@ -0,0 +1,41 @@ +# -*- 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 + + +class Counter(Infinite): + def update(self): + self.write(str(self.index)) + + +class Countdown(Progress): + def update(self): + self.write(str(self.remaining)) + + +class Stack(Progress): + phases = (' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█') + + 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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/spinner.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/spinner.py new file mode 100644 index 0000000..4e100ca --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/progress/spinner.py @@ -0,0 +1,43 @@ +# -*- 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 + + +class Spinner(Infinite): + 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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pyparsing.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pyparsing.py new file mode 100644 index 0000000..9d6a01d --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pyparsing.py @@ -0,0 +1,6493 @@ +#-*- 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.4.0" +__versionTime__ = "07 Apr 2019 18:28 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 + +# version compatibility configuration +__compat__ = SimpleNamespace() +__compat__.__doc__ = """ + A cross-version compatibility configuration for pyparsing features that will be + released in a future version. By setting values in this configuration to True, + those features can be enabled in prior versions for compatibility development + and testing. + + - collect_all_And_tokens - flag to enable fix for Issue #63 that fixes erroneous grouping + of results names when an And expression is nested within an Or or MatchFirst; set to + True to enable bugfix to be released in pyparsing 2.4 +""" +__compat__.collect_all_And_tokens = True + + +#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) + +__all__ = [ '__version__', '__versionTime__', '__author__', '__compat__', +'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[0] + + 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.__iadd__(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 + NL = Literal(r'\n').addParseAction(replaceWith('\n')).ignore(quotedString) + BOM = '\ufeff' + t = NL.transformString(t.lstrip(BOM)) + 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: + excludeChars = set(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 instring[loc] not 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 + elif self.maxSpecified and loc < instrlen and instring[loc] in bodychars: + throwException = True + elif 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, asKeyword=False, excludeChars=None): + super(Char, self).__init__(charset, exact=1, asKeyword=asKeyword, excludeChars=excludeChars) + 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 + if self.asGroupList: + self.parseImpl = self.parseImplAsGroupList + if self.asMatch: + self.parseImpl = self.parseImplAsMatch + + 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() + ret = ParseResults(result.group()) + d = result.groupdict() + if d: + for k, v in d.items(): + ret[k] = v + return loc, ret + + def parseImplAsGroupList(self, instring, loc, doActions=True): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result.groups() + return loc, ret + + def parseImplAsMatch(self, instring, loc, doActions=True): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result + 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): + r""" + 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 instring[loc] not 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): + r"""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 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() + if __compat__.collect_all_And_tokens: + 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) + else: + self.mayReturnEmpty = True + + def streamline(self): + super(MatchFirst, self).streamline() + if __compat__.collect_all_And_tokens: + 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 + + # Avoid infinite recursion by setting a temporary name + self.name = self.__class__.__name__ + ": ..." + + # Use the string representation of main expression. + try: + if self.expr is not None: + retString = _ustr(self.expr) + else: + retString = "None" + finally: + del self.name + 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 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 = True + + def postParse( self, instring, loc, tokenlist ): + return [ tokenlist ] + +class Dict(TokenConverter): + """Converter to return a repetitive expression as a list, but also + as a dictionary. Each element can also be referenced using the first + token in the expression as its key. Useful for tabular report + scraping when the first column can be used as a item key. + + Example:: + + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + # print attributes as plain groups + print(OneOrMore(attr_expr).parseString(text).dump()) + + # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names + result = Dict(OneOrMore(Group(attr_expr))).parseString(text) + print(result.dump()) + + # access named fields as dict entries, or output as dict + print(result['shape']) + print(result.asDict()) + + prints:: + + ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} + + See more examples at :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).addParseAction(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, + suppress_LT=Suppress("<"), + suppress_GT=Suppress(">")): + """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_LT + + tagStr("tag") + + Dict(ZeroOrMore(Group(tagAttrName + Suppress("=") + tagAttrValue ))) + + Optional("/", default=[False])("empty").setParseAction(lambda s,l,t:t[0]=='/') + + suppress_GT) + else: + tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printables, excludeChars=">") + openTag = (suppress_LT + + tagStr("tag") + + Dict(ZeroOrMore(Group(tagAttrName.setParseAction(downcaseTokens) + + Optional(Suppress("=") + tagAttrValue)))) + + Optional("/",default=[False])("empty").setParseAction(lambda s,l,t:t[0]=='/') + + suppress_GT) + closeTag = Combine(_L("</") + tagStr + ">", adjacent=False) + + openTag.setName("<%s>" % resname) + # add start<tagname> results name in parse action now that ungrouped names are not reported at two levels + openTag.addParseAction(lambda t: t.__setitem__("start"+"".join(resname.replace(":"," ").title().split()), t.copy())) + closeTag = closeTag("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) + openTag.tag = resname + closeTag.tag = resname + openTag.tag_body = SkipTo(closeTag()) + 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']]]]]]] + """ + backup_stack = indentStack[:] + + def reset_stack(): + indentStack[:] = backup_stack + + def checkPeerIndent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if curCol != indentStack[-1]: + if curCol > indentStack[-1]: + raise ParseException(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) )) ) + smExpr.setFailAction(lambda a, b, c, d: reset_stack()) + 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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__init__.py new file mode 100644 index 0000000..8ed060f --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5954c4c095b3183de1ff9a7069a4619982d44ea GIT binary patch literal 381 zcmX|7yH3L}6txp4eW;b-GcpuYwTPucEUYYaijb@{c2QJ2wyxduvG6Obd<p;H6{!-x zz=WNFE1jcr?(yT=i|KTH`S^N$M+kif{8tjxV}M-+;)r936fQB2I+2M=%T$q)^gflD z%FDdhL=M!j9I8<{3O;*5MgD`s5e4?6wN~;8KtqvuB6Y=m7TJdE+CkM?SvkR+W=>ca z*YLeEK8tLhi?JuQ1_5z0pPLG-07!!Y5<4Vrf~*e@(6|uhF&qT?L@<du(yyTgnl9W# zy9(%5OD@3DdPkj{Z#Tz|FYP_Mt2d|Je6c+rRDB!jt)**f8Z&EJ>nbT{OC`?S9&K#) nV4Y~W25L?&Jd-lkw2foz#+>|cr8M75@en`4#;GRw3QzDKEn8`M literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8553cbf5108e1252a579ae273774d47745272d61 GIT binary patch literal 944 zcmbVK&59F25bmCzWHx367Y`m?@UR1J#${Io5m^xNmV@po2+izt&obGbAFC&ElT1$8 z2l48Y_zrUwd<a3Xs)Jz^y;wtiRntG!Uw>Vv`}>1$pT4~R!5RC?I_6=1j&ANFykU|_ zev7Wy#+`8Kyknu8;LOe(%+ArxBLu~84VyR;SKhLTD_!Yf^rSC)7=78t{Xx5TQRezJ zKnaPDyT~Z^&|jgO5kk$TykQM*oW^aujn64(!ohzgTpVM<Ydl0>GAzo+VXqy&ofUPK zD_gn^gvg4l7NYIv%9!{{wVuuj)w)Tk+aS%fD&ky)e(M>fQ=ppz@c<$MeT2^p_Aq?c zQ3csNu2nRTAxcXv6__Zwj%t09Uf#^*nRzCjCYOurlhbthF;AYLT@}$qRAtq1R+u{0 z`uHqYOKENl4O$m-Rmc*eYEh#gQBr~$RSR(ONRrhI5Ewt;J^L*WcCw9rT`j@qvqq7) zTm2qjBKedxR>LVOHbuRr-o`_vobmGRYJId?KYqAchtCQ8wwIQW$F;q5M+1^1<Pc!6 zLTrI(wS6H>4MLDUhS)N`yw@dYXaA4i;jYfn>JW(N9~g!{+`%LN_GbU!i`@XKLc+ri z;olV9PE#M@TIvk!oPiK|DQBAUp%5QtvEI(uM*^w^`vfFI2S_5IHz7CFPXQ15fosRc Zp#!9t{poD7HLSS7i|wf|?RH$segcJf&tL!m literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22667c490bf03d8a51140fb20247021590c73827 GIT binary patch literal 10086 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/test.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/test.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac530faf1b63f81881f0d5c80c480298fdb6d216 GIT binary patch literal 1244 zcma)6&ubGw6rP#=kz||HR#Z@nDCi*vvzAnfQi`BnJoI1%HB`cOXA-uZ-HkJo*u>;w zJb4qZ9>kmfgLki<=cpj`UnmH^x2bKZ7bm>8JMWwK=6m1Frdg{6zdn82`t1<%lbjfH z@O}?WKL*DMr;@Y?XWWrAWi3X@@SJdj+hHwF_@V^Q@>7y6xkOZU1NDFs{0RrqR{1%} z*fYXi?!6_gfYVJ<_xGVL+1RJx>(tJ7a+OA=tvYeD*}M~D7zYCbYUDnc{sGRAF)?(? z)Dowhy@lBho011)3PlUd0qhBPxQiIZCv;5IBgD9OahCgN46C_6ro8l#9p<?^E@WoB zY`igKoj`nuzvC6C@`eW)<8vpl5@4Ts)s#==R3QG9*ZBNSa0;0N<U2nDY-W2``NC|? zl)j;yfHaF6N9|+lF4!ive+gUyZM-<U#U^yZpd~h?WBP%;bT`QtlyT9hDAO`BqHXfF z5!%!p%Nn;V-L-U}uvFm=WY|;50M><rNQIqTa-nn>?}kP$ceeKid_}LeZ^zri-Q{Ly z^eT;S!RTh;ldzZcZYG&Fk(4)AQZeFsPh+sK_CRDjS7C2x@>GUMpwSy11ZzBrO`NB_ z^%{19r|Of@jepoS)?^+>Qm;3TGmgZ-tRpeb!K8~~R3{XKpi}z3kfCU=PL&6Eohct4 zmhK&Qt||}#LNd`aLT6z9Uxbb_6kbm2MM_1(I<u}B_Js8Yk?adw=AfxbQeoZgJeL3} zh<Y99N!U`78POFA<}#1W$bWsevAjC5zBVe!x}yvIOzibUYy`hrl)HQN^))rA*KCmJ zLh~$!!l<S75+hP=U1X&efRMtwq85=_(1wlLNK0D>V09j&{_GR8wf1bg!v)pH{R{~| zR4P}XSQ*#S=#*lGp7@`juY)5rpl8A6!MiM=Re1Xw3Frd62ZtvxS8%gl-y~AcC@$d! zrGA#gIb6CcICFq6w326Cbs6WCjp&e2vF`~k#SO+IwB@xl=Y1*G@ia6lP^MMJD0pDw H(t!N|Foim3 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/utils.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/utils.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c2af4465bf4dbf9c7cc29cdc79ceede83bb443d GIT binary patch literal 2145 zcmZ`)&2Ah;5bo;v+1d3^Hi>Zp0)#>qc`)nsABtE-#DW99#EN8JSd2!S?HOnPm+rQ) z*E0t+f#=}L8}J6aLtl}Q{0ccy)#J4t6K2)b-Bn#x-Bn-JZY?ZS{`vi{!(V*H{$@8m z7uP#D)GiXi1PoZKn4twR^tj+Tv>f3G_cd#|!V^Buo+ya`Xa74U%A)d`iAv0RrQB%+ z0`^%rcY)T}-t@)Fp*Y{p!aB{H*Ym;UzIkh2Ib1swtKqYiXU$f+^22KV$3ky*F6;mq z#*bf)Z*f+iBhjn}Da#>)6y}-wIHkKoj=a7j9|^Y4w3Ff<Z^!o}nF(D}kx6H3YwN2> z#>N}Ab?24wj^y}wVyct2RB?1I54nL81H(U<3{d&aurZO{leUf<CvDkC#sd*c)#&sa zda#kaJUtQH>Phrv=jB;{V=I~dJnXFFcQk4oG$!3iy*pC6Js8xthw)UXQ$<WWqLX+e z#<DRv)8pZwajd%owKh333vb;Av&a-(gFywBzy(>s^;K|aL&FB=Ph4oGF%UhT+tmKb z-)A|;K(U@f>6Po+ovkr|eB=rz<Cf#1^wjDi0CEss&V|2JSaU?F;5=ZNqdo2SO2SDU zlILhOb4S$~S2zVHg+o8{GM4#SDGRbP>iDUbveZvYX^@uD6BhyML+a)MrmDPmL2tb% zA+brjpjThe<1U^ODI@9bd~=6|fpLcIiE+9kZG4+VB?;ZeO9tb%Hs$D`JB(Z7QEUQ% zdDFNvWuhV;=yq6<<ivnPBy>A+Y~aXnJvDG<Kp5CH@Z7+@O@2Yhwe*n8<4{XT7%XEx zs@&xjcnr(D%Bx^cTxG_=L!@Fe^BXQO$}DFDTEY5d`3Xh<ftzCl1bo0oSbkQ<`&@2P zRz_=hlJ{M?BV627gol}eIkX`Bo|EF5^oTCAyvU*}HG094#i;TJSO|6(%yv{77-xA0 zZ(~Djp!Eh;-#~p@JzvkxH=664S@V38rs-1c`+99yuZe@&ZnO5hS=(Q$CDXhA;fB5` zAM4IINmQ)mJv40=^cW!@skk#931$3bEV1IuoDFutHG$GHp_GJ<q`VuKEEr!MCrS78 zR_x7UVPaOKAEAPJh=f4^AMyZvJ6!NF6+SF-xr(w59hiO8MRstgFObBng-K{(*AN_g z+yC}FQO1B(<a?;nAp`Wi)s6_ADOOj6)rLo5F9cJHidbM9aaBA>jDHy$!t*trOb|ug zQCCON2J)3P57T>B&|RB}-||e|%p!_nMu@ufD(P7vmvx*B7y4EJ<zwV;<Cyumf9>Zg zdGB^ag?0HjYxL5ITu1&bFUAo{Ke^#$;o1vIuIy7;kXieXU0l#ZdVnnp0gWKXQs^`6 z<W7b#N5E5?a%pYlE<)cGu*4psM0h=(Iw|sU2SefC0Jr=UEz3tpri<s<d2<a>T~LG^ zg-h0me1;_SY~YGF+1}vDSQ&VA`+>fmj@rYxi8`u^gux;r(1n2GfO(i!uU}jo-3v>U zY0`=!Q;DMCSR4;%Js(9s9k&OCL^jZv&5|TINXpd>=N3A)3lSD6^!7g?fWV=jMQB)- z%P24$|KUoV@o>@|#FAiT|1oTHvSnfL5#13M6q$OL4--5sF8MW~O;OK7N4&xVKe!v* F{}-g%(gXki literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90d95c5e60e52d5a6485ee7762c39fd1ba957ead GIT binary patch literal 3573 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/core.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/core.py new file mode 100644 index 0000000..c182734 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/core.py @@ -0,0 +1,13 @@ +class TomlError(RuntimeError): + def __init__(self, message, line, col, filename): + RuntimeError.__init__(self, message, line, col, filename) + self.message = message + self.line = line + self.col = col + self.filename = filename + + def __str__(self): + return '{}({}, {}): {}'.format(self.filename, self.line, self.col, self.message) + + def __repr__(self): + return 'TomlError({!r}, {!r}, {!r}, {!r})'.format(self.message, self.line, self.col, self.filename) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/parser.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/parser.py new file mode 100644 index 0000000..3493aa6 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/test.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/test.py new file mode 100644 index 0000000..ec8abfc --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/utils.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/utils.py new file mode 100644 index 0000000..636a680 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/writer.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/pytoml/writer.py new file mode 100644 index 0000000..73b5089 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__init__.py new file mode 100644 index 0000000..80c4ce1 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2480181e805136804c579846d81f0adf03e93bc7 GIT binary patch literal 3492 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 TY|ofJtq;S@Oc{0?=gj{C-!I&M literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ef8562ee590554d36e3c706c67f71c20193fcc7 GIT binary patch literal 555 zcmZ8e&2AGh5O&i1Y_>$8a;Stjm}4cfPSRGb5UPr}R6;@(<YXaPo3)d*;`JKa8ydd@ zZ-4|xxN+bec!wN8;>?*7vnfG^v1atmH~Pji_F=yt|M>9r)t3fB-_Z?&9G!!^hY&cT zh&O11H))ga&>h~QE#9VW-k}}drClD;i1%oZ$1l;r?mDvKbtRm4VgGXF^HSrB$>b8x zN{cV5BGoPl_j2#eBSOrkKG+J9(#}I?oQy}wP@)G-6#CDE*23rbg^)gkyM;JkTr;*N zHiGzxNwZwwaWV||pO$82<vjOzJRF_kf8^CISmxWikND^Nx1TY9=Lhk+$C#I13C7m9 z8RNobRvIr$4Mdl*$|?Z6j4g$A*DNTel~f$~n6b2i6)oU9f3YZ1`A4N>CbX-Y_ZiE! zvq2g`nl7O53E6tAP54z2W92gSf-F-@W~JhAE6EnbtI=$Fwd6<cgdJzo)narw3vY^S z2sYPbLX0#6shv-i8XOfOaChZua^o<(=A|XucP2O1Nz7^;JuXUKDRI`WzkClutMUK& E4YtFxxBvhE literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d9861253feb270a6824e26aaa68671515c593565 GIT binary patch literal 1313 zcmZ8hPmdcl6t`z4$#&X}Ruv}>$VVd4O#gzkLWrsq=z*$Y7YRj3Q)m3L<L-<-*q&r3 z3LI!Z2v;tg_zoQS26IJ1;w$vjXHSAkpJc~=^ZefP@Aq@=9UrIv{QBn)Unhk8P2RE? z*Pr9CbDRWO5J5#$(K=d0b-ak{WRXxJu8Bm9UeU!!jK$;?S&YTe8JVTq-%|rWwqTu| z=TbQ^idT8-WM$Kz|7U6X%;>cgV443cUB_0fDxB2HGFNiPxB*t+uB}0^L$0c0%Z`1! zuaRy_S(Hpb14=Nh7+g66HDJ^VHhvcxU?o%y7|TAiErxT8dFzI|S^6)<OU~kcEN$L& zcl+zhR#r}`+&a_8ej0IGNLfS}=gp(z$0Hm8AxCz^(U*}q*^!?j^}dS?+mRRXj=rS0 zPjQ_L>s^Eh(d}Pf$u%g(8D^L2g6ZW8DBMTPzy&v=0&AIGG1oQVeXcc#2gg-oz=Cqz zBZLttLkl?V^GJnTU<w1)a7aF+0aa+>YjH$Lz<#qS!9Yl(pun=+baQrIN-SqR=$1V^ zd-UW9YgK5<=?Wpn5@sVU%)`Ois86Mp$~vwJFdi7=k?O~xB=qA@4Lrg_oBh$DnLgI7 z`;C|z82`G<8Y9=-LAK^5TVW}rD=RKDSKV1Huh!ze{Um=-EW67)_g33YUED^yP}zCb z$mUjPpsH@&uVE|fmG#arazt8alN~gfy`#x_)Ac7#=L2Y-bVO<Dsr6lvQA)>ALT^NA zWW2ZVYVqcOuj2?R_!t)l71*hZexcpeD?p$E@TDN@3316~YHm|Jh@SY2d{0DzY8Y+* z_ySO)wN$|53Za%r&VTG_g+j(B;5goJ&qh&l!wWoP=V{>Jv_VJh31{v82B+^Pa+(z- z6qj@MO=}%n!XY4J@JjN^P};F)ohwmaciD4H_<Ugb)OZ=4vZdBlIABJ2<?}C}&PHa8 zD}#R_q@O;t7K~TtV`H>26YsqF-EgDFUV#uk%xHgfXf%*NOvgU_WDh`&&oR8a570Ys zF`3ecrZk~bYHp(U>5PUpW|MxB=Ry~G-j9c89V9r2(RUW83uoRc=lM0E=Fz9M7HtKe PUGug4eUj+CI6Zj-LTi3r literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a3751a361c8f9a5b36f7f3ffc879e2c9d3746e1 GIT binary patch literal 16904 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/api.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/api.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff1cead9e24fc2048c3b9fb8278f745bcbeb0f4b GIT binary patch literal 6496 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 A;Q#;t literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae5a1c6ad5c6a73e689da90d0868632fa286dfce GIT binary patch literal 8347 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 MT&kDqGj;QS0d}n3e*gdg literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20424d75bf4a8a494de3e3f9a6578a51b2825513 GIT binary patch literal 638 zcmY*W!HN_y5KZ^a=nz~l{y^bD9GLBP*%dD$iXaH$LFcpxA=9b!gy~M&B;7l`2NCuc z`~a_hiD$2UR1o|HPo^_1XhDkPk$UxB)!Fee{rUOpyKf00Kgd6khWpcS+`W(lxga7D zX_eIJMVb&i5=Xn#-o+WF*W@}$h?u=4%X#}E&`^u-TXf!K1zPXuhyQ}o^;S8kjc6+b zi@vqmf!`uD7A0DX0t8ClRvw-|gONf>RdA26X|<>@gY_0If^yX8st2PHzJL4_DaO0B zrjC!P6dGRac!?RMFD3M*1s<vopwcD0nbfWTvoc$OG!{6#Qo7xPP|jPmX}vNUB3^SH zxCBMrDQk3%+OHyM!8H_Hu1k!~g9WA4p-#f(sQCU8yqO$_4h|b`gRQEklR_~Xo=nnT zVeDj?4D(n!EEub~(u}=c&WD?f2~#jO+-X#ku@1E`HcmT?%8r{G|7%`j_%m;;(*6sv zi-5=U+vEZ3LhroeHkYOnXkA|Ha$lXw&At=o?h$)fZ2H~lnY_BJiw7Y}ov-uI??h?m sc~za9*LWq|-i=^9laT!H{`0v1tm%iv<HNq6+zuMtjgV%^t#pz60oRStF#rGn literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bfea9b96f320984e78d27dc92a2c0f3e4af907ec GIT binary patch literal 1617 zcmZuxO>f&a7}kd^%d%|e`)kRnHtSlqiJh-uI}F2s_Oe6T0quzxAjlG(Fd;>Sq}@1& z{f1q3-*r3eynnF&!0Uhkx$d~rUP?~qb&<eF4_}h6pND+u<90jv^QYgx`>|nJe^_&m z3;b(n@>kokG7DLmojKHI4svY6UFsqiyB9T7$MwwKw6fZzgS;8918<bGeB@(K`~}>j zO%|YlwNQ(NC}eHaW*yXFUDRa@Xn`%FMYe>N%Ipog%$CtITR|&q6|J&0w8qxadO7CP z4Yr9kXDYVP7UXWykJvWaE@J`RVLNE2<SqI!dw?FW2u186ddME3N4AA`(I?Oz<4@5p zeuAFhr?`ioja>BHu#toI^51ad2V49CnM1n&KP5)>hfeO)wQ1j|yVq5R4%h+ODwQ?q z;hf^5_lmoqxKs(hy+DuW)xTH1iywn}K+tN`KZ7r5AK7RxbKh9K#ha@@;Hxo~O7>IE zibMt9|Mv-kx93DgjAvttqw^%sD3%dn1s5u+mXIN#L`@?iC1i?*SiQqIkG`F%bDl>> z5v&Pjo#TFRYig%w>qdH>hzzS&w+;kuO&Rr?x_&k03hTx=uSigS;)0H)4rjrt*BlFq z^OR>;2WMCnf?pF1lMI>0!)cL7sW;|(G0rDM@SNdX>9v2?%*T6m?L*=s5fbtO8|M{o z0KecQFNb9ThP6?U;gLwrz)rWE7N09s#FR({A@7t!77EONqXfy%zIolNY5zq+X)>f> z@-!(52<y)2SeeLOzx5h6M&RrvNmVZp9oQPtHLze{(LmEc-GFBRE~O=W14{tCx>z<m zFwim(8fXK6m}biPCBYYo=-Fb^#9Xmv#@7vOn81l{#Bs*cIM%I#6#aOD^Nb5&PD;CS z3fnxvLK2?GBp-2Ig9$==M8?JRX!bqUwF}8}?ZGZlGQ3x8>Ea%h_gXg2pfJj8N2S3# zE0A7$FG^Qp#h6$%Q(Gyg6sHPQ$`1^dw!w%Jx-}dVsz@H2PJK94P(x6Cq$;doBH?bB zv(qkts;N;9v_7IdQM#Rv85Sgs)wF<BZJ2=1u$XnjN@>3;pU$i|yKTB=3Po%gouQ#{ z`^=$8?GUcJbISY4F#XvQUl>~k{w@ZEAd^Jl!6Xrb5r+~Ka*$pQ6g?abuP51w{5<|F z9ZoL~k4HD}Sb6}@Sw46>fRo%Oxl~Yp`zH+FWb#^?VA*CzJh=Ni7*uz=Ure?CWp(?% zGRGxf0@R$)@f)5Sx?$7zYWAMHZHKlGEwne>nq9qt9XOtSV4Jb(U2&=rALjl8!kNuH literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58fb4aa01ca2c6f5b9ecf9c610bae60725ae3e1b GIT binary patch literal 18792 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 E7ju32d;kCd literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1dea984f6edfdfd90be8c32927b5049e29b328af GIT binary patch literal 5512 zcmb`L-EP~+6~{@5`mo{;#ZK(RcASaxWv7XhY<5u~ShRNHY?C5M16$h`!U8nS8CkR` zQaeN0mf+osdV#&`RUe?YMIWT^z}o@^`U<`3{|qUGK^G|4l!7S!4~OLM9G;moqo*@7 zwSWBiZ{K`3Z5V$yGFu79TllI!nTElQw!uwa@XcPKT{Mkf8NA4?9}I2@>!R2$L6>+L zx-3f21?UQ|LRYmeLr?J<bWN0Tz5;!TPeV^@U4@?Ev(U4;{S@>ZuS3^GSxjA6?HVkX z`8+K1(8cy8=mmZS`ij0{8u}_<gkIEo26~BKgT5w8VitFpgXKD3hGjXm)L~iStFWx5 zmdmi*;A^m~rIvYEZgK_-6PNMa1?XFR9eQ0q=L+;~eh2yvt|;O;S7Eu!@4<2pmPJ^W zV7bpXVA;^uT!Y@^51=1teI5E|{2}y1v5aS|KtJLQ=!RGktGL4rSepDXERV$sTCDLW zd&cHxqy3r`-wuR|R70G(q91u-plaX$=T@t=x}IXakPm#p+%Sk7FHkJ%3Z_KF!VcR_ zZ*-r1xKpF{PfCbQGoE_YYQ29cWhh;;jJINXpcoE>(KeAM1#Y&BKN=lm3orgqZCgJY zmeDSO*NW@uQ(lf?N3B*@NWo4W#hidSy#w!X5DwG_2rxPTblriJg0s`E2M4-Nz<n<` zWW#VEYYbZ&hlUm|GFERE_QW`cuWDm=UO3Wud{OwWcwRg=Y*Sl`yl_!~DxBl!cuMY^ z8%Kp{L+(Uq#fujOZ848@o5+ev=f*|hsC<sA|7e;9FOYYm=dS}V@*LkAiE%h5j<QoP z>azV5b05xfQmT&^CiYo)a3oy3#ke}Qy^AYp<IPH3?1z0x&PeK&ai!}hCyHcTQiHyb zl3a|dw(a5hwv9MjO8A}Fa^#_k%g3kmt1qWFY1^*vC}rD!G5!@b`_emcBGEi?WU~|c zTu9Y)kDHPIq;qg~!ar9(x4&=?hR08yc1EW?_c6A^pxJ8nz5XL)P~`ajqtAO{#MPN1 zqyE|_BH*EHrVglPCZ+mAIR)Iy_^Mg#jKZ{8HfPPcS;J>^eK*O&N#Gh2x60&V;PixT z$2Hqdav8_dw*BqE@zXOE+vcHb+xjW-OzN#Gd>=M?px$koa)yp6F?9Ga`WcEMTrFA! zZTTqCDWSHgNgcavqU%>*lm(baOWOgXe!}odLOIFV#=A{R(sh!Ymh-e*pxuNfInpe2 zqg8wr9aK$y<2)qs+>0;>kV_Z|bblSKZnF=jPeHp1B9=iToeQn@UWRAGglcJ<^+|mS z&>{ftWPnKL0;=xqy-9Eu@#-Kxg=Ps)-^kFA&P7vcc|8#hqS0S5CXNR*7Qx6F%#E5J z+g>=4+oho|q5(b0v{TRbnM)_wK^S#)yJzTg&-T9`cfm}3Xr$?oK2DEC|Lu}p;qXa& z{ZN$*wRv*;8Y1#=5}~prohw4KACr&%@RNZ`YeXc6I!qyzJL(ZE3U$Ggq8CO~_vDF? zX;jluhbkhf4KkAtT!cLnV+U1AIUPZFkpef*@Bel9`^Ch6OOnpz|E0`p7;TaBi4%-_ zoCRS7iL&AZL&lxRVP2s9#Sk4v5xjAF;ULh(o{}opu(S-+FDK}xB%Kfa>)kgLWDiAr z^kAEvpiFWGBSRKblF|u^ZO=It%o(SDF31%?ZDk-y=Yp)a!tgD^w<|bsP>)9oumA}W z1zuvyg+xR7P6ml|E~J^ao>Iu;J+~`*&ZtQ*oua0+W*ee$*kIi#>N8Xv`c<10(Oz;@ zF4h}hdzE1&osac(pkHgsy1pj_<D%mXe9Ub6L)HOe^4=4Al?!hTIBzm|q;uibQaprj zbaxy_boCRDBlTzos=}V=hNtK_8Z#H(P2jxG;E~RSH<RMM!cZ&Zs6m8XeM~_c2pX0C zKd207tqdyZT&Qy?>U*l-6wY;m1t01;CFg_`nfSlN@)m%8p8+JD3-HQ|?jSf8{AJ*V z9K9zg^1md?@rWrf3#K8*O<FRMHf09`J&s1S9!cSoM!C{q9mwBgTp*p(1uW7;5bcPp z3%9;<u>R2lC8rZKPe|4fdQpe=c?$AvK<#HBN#}xG*o&ladML|kfN4q+=Fce1sJTS1 z`@F8A6HdL<^Kls;QY(F79%!2J@eDNST+p>$D&Gm~%8P-D!XBa+Nlz%|hlifaIy%UC zpzZ>qn}H&o3+n3EffT1+z?}nMJP&!w_iQpTq5MSk#$uT&{CMKm6{zu(iB56{=3o}c zhk5Yt0oTvqlg@=dH|G4EBLj4}(eiUg(Xw7Eodx3-xw_GPfJg$fu&bJuDan!#?JM+{ zx9BQkv|n$t4*iKhi5T`pfPm6WNt{LW|A=^~M}RRc3K(ME^K`37u>&t~<dFFyIE=cv zT-gBl=|`@RC6_DX#j)BE;O0n);n=AyEMUA|Ka@1l<CD{jhe8GS;hA0?MCh5~tdFS; zT4DC9uu5do2@dnk1~&nI{*fzWdAE5}uWQ?D_#dE={s+()NZ<Dko@Uk`dQBV8P=ZYU zRf;RGf1`V(UV2MfT1r~ZNm@neg@T?f>v^Z7d7Y%0R9yQlRmS8(nyyHi6i6z)lF^O| zhoqrb-o`GTY7P5oYZ^5q^-@W>9#_&h>hy}|5ns&z99l$=PtePf<mOK;+vDn&$=?yb jsG@~>jGbjp7wh%9m42q?E6LHkm3&Ci5q`_{(tPRPU<$uU literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/help.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/help.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..acb2cb7406187a0388beda085b5a91f5e153eace GIT binary patch literal 2691 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5be8afe3bfb01cd79c800410bd784e907527ece GIT binary patch literal 985 zcmY*YPiqrF6rb6DNf#q1f)|kyL<qFmmR5yQiee8!r4>^Uie)p|nN7xQGTWJH+Judl z_Uy$k;MJp_!tbzG!EfNDC*N!n+rH)ZcJ?=K-@f;Iv+IpU_~-ktPk$YRexn-(&*&9E zKL*FpA!4|P4>5C?dw~ue<}n}cE(_YIS)2Y06+b@V+UQna%7G5Q+_Eq{=nGATlAUCn z<VubO<C>U0Ckf4IS7gEnAX2F+^20nCsge;r(S{FOVfcDXMMk@jquSUE!%jzWoy(Et zoz7-Rzz!hkf+IaX;))v1NUG$JP%_Wl3d{N;D1iq5n{E3IK;H$&pxp~(&<;As(5AbW z;CY}8^8jstz7I~I0v&}j+(QNa<{W!%^aCjy)pSaywOaao%txkTDt9TPT!}H17LBQj zQkgNXbd(GtldYxQvoYJyFXQJ)cQRO8Pp7BDWEHG8iVmV&<SSyN4b8HZjUk^heWop0 zA%@Q|siMU=qDrV%KDi9Hm`F?_hxxWGSli+PG=0K&N>4HqUj=SuGNGB?Ze2$=ap}L^ z-`{OtSAVtgAw$`?_5Qs@W`tE8)`<(wS^%(u?E>_Ba0Si-fo8bCpFz5FY**@?0nhNc zqn;IT+-CUfX@Pgp(W9AHc!iVV!u^V8e&I7`u%wm?f94!7e?*02r!#%ABXmwp(ub2o zs}n+O%R-K*nh-exvL`?vk_(=2B2&Vsp{=qW$Ix>Y$9pg=x5rIc>r+jQQO%%q2Ygcc zl{n>+y~XyWG8mjv)zhVCsWPn8t9EXPG}mWdR2A~jw*LSea_Tt59v}eR!F9Nloy%U+ nD{FDgWD>`!21KP}wRI!49iFQ4*SD_zs_h0)x{?_OZaw%1LkI{9 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/models.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/models.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a4d1d4ac477f33ce9f985e40b4dc1abf859ca06 GIT binary patch literal 24167 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..953f8429ab17d88ecb400a2d2bf7051862179072 GIT binary patch literal 530 zcmYjNyKdVs6up#eQ&AejS!!g-?jd3WJIG=L88Q}G8X$m>K#;}jm@zHMB<;u^vIzZ; zuKj|3LjQqlfCBx6PNnifE^rSo4({U|4)^xLKR<ro{PF;v;6rp=eeO~}I^e*Ggcz!l z2N!TViwSQd=|k+Hk6ul%RRfYSR9~@;aNntk>pF`mQuOAYzC?N-pvOCXsEHamc89lX z!pV2<0OGKjKzabp%PEF^7{hXO4a@GeyZa3WJAa)9xU_Voq!g2(Z3&*ImS(e5aWvac zr6{9hjX5t=WJ$C={75KVu235tm1#Cl?@&hrUpc#={03SM2D{eR8*S-pi|xHEL!P`b zVUmbNStyevwj+xymD;wX(8kh5!B-Ns^<7~@ZBk|QgD^AeOU!L|m6r;qqH@bz!%tBA z&DjS2DOM`6P7Shks@SxU9F=C-oEdpMom6W+(x=HuHrdRNhtuuDBKzXvE@xNF89WlX wyCvn(Xn|X<E8URK`T7;?%{hB_UT$nKe$jhIoC4i-5VS)Qkgne&pGlAW2eOQv%>V!Z literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..565469e8a63b1c73b4381be736c606b2217af6e6 GIT binary patch literal 19431 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c27ba12f33d2c785e535e77a302df7e5e4551b1 GIT binary patch literal 4783 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cdc0a1f3fbef62a05596e7920461cf6bb7adc678 GIT binary patch literal 4384 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 BDnS4M literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48cc63ada50560b2a891bac6880bbc54c049dbff GIT binary patch literal 22101 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__version__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__version__.py new file mode 100644 index 0000000..f5b5d03 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/__version__.py @@ -0,0 +1,14 @@ +# .-. .-. .-. . . .-. .-. .-. .-. +# |( |- |.| | | |- `-. | `-. +# ' ' `-' `-`.`-' `-' `-' ' `-' + +__title__ = 'requests' +__description__ = 'Python HTTP for Humans.' +__url__ = 'http://python-requests.org' +__version__ = '2.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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/_internal_utils.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/_internal_utils.py new file mode 100644 index 0000000..759d9a5 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/_internal_utils.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +""" +requests._internal_utils +~~~~~~~~~~~~~~ + +Provides utility functions that are consumed internally by Requests +which depend on extremely few external helpers (such as compat) +""" + +from .compat import is_py2, builtin_str, str + + +def to_native_string(string, encoding='ascii'): + """Given a string object, regardless of type, returns a representation of + that string in the native string type, encoding and decoding where + necessary. This assumes ASCII unless told otherwise. + """ + if isinstance(string, builtin_str): + out = string + else: + if is_py2: + out = string.encode(encoding) + else: + out = string.decode(encoding) + + return out + + +def unicode_is_ascii(u_string): + """Determine if unicode string only contains ASCII characters. + + :param str u_string: unicode string to check. Must be unicode + and not Python 2 `str`. + :rtype: bool + """ + assert isinstance(u_string, str) + try: + u_string.encode('ascii') + return True + except UnicodeEncodeError: + return False diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/adapters.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/adapters.py new file mode 100644 index 0000000..c30e7c9 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/api.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/api.py new file mode 100644 index 0000000..abada96 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/auth.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/auth.py new file mode 100644 index 0000000..bdde51c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/certs.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/certs.py new file mode 100644 index 0000000..06a594e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/certs.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +requests.certs +~~~~~~~~~~~~~~ + +This module returns the preferred default CA certificate bundle. There is +only one — the one from the certifi package. + +If you are packaging Requests, e.g., for a Linux distribution or a managed +environment, you can change the definition of where() to return a separately +packaged CA bundle. +""" +from pip._vendor.certifi import where + +if __name__ == '__main__': + print(where()) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/compat.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/compat.py new file mode 100644 index 0000000..6a86893 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/cookies.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/cookies.py new file mode 100644 index 0000000..56fccd9 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/exceptions.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/exceptions.py new file mode 100644 index 0000000..a91e1fd --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/help.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/help.py new file mode 100644 index 0000000..3c3072b --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/hooks.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/hooks.py new file mode 100644 index 0000000..7a51f21 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/hooks.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +""" +requests.hooks +~~~~~~~~~~~~~~ + +This module provides the capabilities for the Requests hooks system. + +Available hooks: + +``response``: + The response generated from a Request. +""" +HOOKS = ['response'] + + +def default_hooks(): + return {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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/models.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/models.py new file mode 100644 index 0000000..0839957 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/packages.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/packages.py new file mode 100644 index 0000000..9582fa7 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/packages.py @@ -0,0 +1,16 @@ +import sys + +# This code exists for backwards compatibility reasons. +# I don't like it either. Just look the other way. :) + +for package in ('urllib3', 'idna', 'chardet'): + vendored_package = "pip._vendor." + package + locals()[package] = __import__(vendored_package) + # This traversal is apparently necessary such that the identities are + # preserved (requests.packages.urllib3.* is urllib3.*) + for mod in list(sys.modules): + if mod == vendored_package or mod.startswith(vendored_package + '.'): + unprefixed_mod = mod[len("pip._vendor."):] + sys.modules['pip._vendor.requests.packages.' + unprefixed_mod] = sys.modules[mod] + +# Kinda cool, though, right? diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/sessions.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/sessions.py new file mode 100644 index 0000000..d73d700 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/status_codes.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/status_codes.py new file mode 100644 index 0000000..813e8c4 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/structures.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/structures.py new file mode 100644 index 0000000..da930e2 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/utils.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/requests/utils.py new file mode 100644 index 0000000..8170a8d --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/retrying.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/retrying.py new file mode 100644 index 0000000..6d1e627 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/retrying.py @@ -0,0 +1,267 @@ +## Copyright 2013-2014 Ray Holder +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. + +import random +from pip._vendor import six +import sys +import time +import traceback + + +# sys.maxint / 2, since Python 3.2 doesn't have a sys.maxint... +MAX_WAIT = 1073741823 + + +def retry(*dargs, **dkw): + """ + Decorator function that instantiates the Retrying object + @param *dargs: positional arguments passed to Retrying object + @param **dkw: keyword arguments passed to the Retrying object + """ + # support both @retry and @retry() as valid syntax + if len(dargs) == 1 and callable(dargs[0]): + def wrap_simple(f): + + @six.wraps(f) + def wrapped_f(*args, **kw): + return Retrying().call(f, *args, **kw) + + return wrapped_f + + return wrap_simple(dargs[0]) + + else: + def wrap(f): + + @six.wraps(f) + def wrapped_f(*args, **kw): + return Retrying(*dargs, **dkw).call(f, *args, **kw) + + return wrapped_f + + return wrap + + +class Retrying(object): + + def __init__(self, + stop=None, wait=None, + stop_max_attempt_number=None, + stop_max_delay=None, + wait_fixed=None, + wait_random_min=None, wait_random_max=None, + wait_incrementing_start=None, wait_incrementing_increment=None, + wait_exponential_multiplier=None, wait_exponential_max=None, + retry_on_exception=None, + retry_on_result=None, + wrap_exception=False, + stop_func=None, + wait_func=None, + wait_jitter_max=None): + + self._stop_max_attempt_number = 5 if stop_max_attempt_number is None else stop_max_attempt_number + self._stop_max_delay = 100 if stop_max_delay is None else stop_max_delay + self._wait_fixed = 1000 if wait_fixed is None else wait_fixed + self._wait_random_min = 0 if wait_random_min is None else wait_random_min + self._wait_random_max = 1000 if wait_random_max is None else wait_random_max + self._wait_incrementing_start = 0 if wait_incrementing_start is None else wait_incrementing_start + self._wait_incrementing_increment = 100 if wait_incrementing_increment is None else wait_incrementing_increment + self._wait_exponential_multiplier = 1 if wait_exponential_multiplier is None else wait_exponential_multiplier + self._wait_exponential_max = MAX_WAIT if wait_exponential_max is None else wait_exponential_max + self._wait_jitter_max = 0 if wait_jitter_max is None else wait_jitter_max + + # TODO add chaining of stop behaviors + # stop behavior + stop_funcs = [] + if stop_max_attempt_number is not None: + stop_funcs.append(self.stop_after_attempt) + + if stop_max_delay is not None: + stop_funcs.append(self.stop_after_delay) + + if stop_func is not None: + self.stop = stop_func + + elif stop is None: + self.stop = lambda attempts, delay: any(f(attempts, delay) for f in stop_funcs) + + else: + self.stop = getattr(self, stop) + + # TODO add chaining of wait behaviors + # wait behavior + wait_funcs = [lambda *args, **kwargs: 0] + if wait_fixed is not None: + wait_funcs.append(self.fixed_sleep) + + if wait_random_min is not None or wait_random_max is not None: + wait_funcs.append(self.random_sleep) + + if wait_incrementing_start is not None or wait_incrementing_increment is not None: + wait_funcs.append(self.incrementing_sleep) + + if wait_exponential_multiplier is not None or wait_exponential_max is not None: + wait_funcs.append(self.exponential_sleep) + + if wait_func is not None: + self.wait = wait_func + + elif wait is None: + self.wait = lambda attempts, delay: max(f(attempts, delay) for f in wait_funcs) + + else: + self.wait = getattr(self, wait) + + # retry on exception filter + if retry_on_exception is None: + self._retry_on_exception = self.always_reject + else: + self._retry_on_exception = retry_on_exception + + # TODO simplify retrying by Exception types + # retry on result filter + if retry_on_result is None: + self._retry_on_result = self.never_reject + else: + self._retry_on_result = retry_on_result + + self._wrap_exception = wrap_exception + + def stop_after_attempt(self, previous_attempt_number, delay_since_first_attempt_ms): + """Stop after the previous attempt >= stop_max_attempt_number.""" + return previous_attempt_number >= self._stop_max_attempt_number + + def stop_after_delay(self, previous_attempt_number, delay_since_first_attempt_ms): + """Stop after the time from the first attempt >= stop_max_delay.""" + return delay_since_first_attempt_ms >= self._stop_max_delay + + def no_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """Don't sleep at all before retrying.""" + return 0 + + def fixed_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """Sleep a fixed amount of time between each retry.""" + return self._wait_fixed + + def random_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """Sleep a random amount of time between wait_random_min and wait_random_max""" + return random.randint(self._wait_random_min, self._wait_random_max) + + def incrementing_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """ + Sleep an incremental amount of time after each attempt, starting at + wait_incrementing_start and incrementing by wait_incrementing_increment + """ + result = self._wait_incrementing_start + (self._wait_incrementing_increment * (previous_attempt_number - 1)) + if result < 0: + result = 0 + return result + + def exponential_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + exp = 2 ** previous_attempt_number + result = self._wait_exponential_multiplier * exp + if result > self._wait_exponential_max: + result = self._wait_exponential_max + if result < 0: + result = 0 + return result + + def never_reject(self, result): + return False + + def always_reject(self, result): + return True + + def should_reject(self, attempt): + reject = False + if attempt.has_exception: + reject |= self._retry_on_exception(attempt.value[1]) + else: + reject |= self._retry_on_result(attempt.value) + + return reject + + def call(self, fn, *args, **kwargs): + start_time = int(round(time.time() * 1000)) + attempt_number = 1 + while True: + try: + attempt = Attempt(fn(*args, **kwargs), attempt_number, False) + except: + tb = sys.exc_info() + attempt = Attempt(tb, attempt_number, True) + + if not self.should_reject(attempt): + return attempt.get(self._wrap_exception) + + delay_since_first_attempt_ms = int(round(time.time() * 1000)) - start_time + if self.stop(attempt_number, delay_since_first_attempt_ms): + if not self._wrap_exception and attempt.has_exception: + # get() on an attempt with an exception should cause it to be raised, but raise just in case + raise attempt.get() + else: + raise RetryError(attempt) + else: + sleep = self.wait(attempt_number, delay_since_first_attempt_ms) + if self._wait_jitter_max: + jitter = random.random() * self._wait_jitter_max + sleep = sleep + max(0, jitter) + time.sleep(sleep / 1000.0) + + attempt_number += 1 + + +class Attempt(object): + """ + An Attempt encapsulates a call to a target function that may end as a + normal return value from the function or an Exception depending on what + occurred during the execution. + """ + + def __init__(self, value, attempt_number, has_exception): + self.value = value + self.attempt_number = attempt_number + self.has_exception = has_exception + + def get(self, wrap_exception=False): + """ + Return the return value of this Attempt instance or raise an Exception. + If wrap_exception is true, this Attempt is wrapped inside of a + RetryError before being raised. + """ + if self.has_exception: + if wrap_exception: + raise RetryError(self) + else: + six.reraise(self.value[0], self.value[1], self.value[2]) + else: + return self.value + + def __repr__(self): + if self.has_exception: + return "Attempts: {0}, Error:\n{1}".format(self.attempt_number, "".join(traceback.format_tb(self.value[2]))) + else: + return "Attempts: {0}, Value: {1}".format(self.attempt_number, self.value) + + +class RetryError(Exception): + """ + A RetryError encapsulates the last Attempt instance right before giving up. + """ + + def __init__(self, last_attempt): + self.last_attempt = last_attempt + + def __str__(self): + return "RetryError[{0}]".format(self.last_attempt) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/six.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/six.py new file mode 100644 index 0000000..89b2188 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__init__.py new file mode 100644 index 0000000..148a9c3 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79017ce3c39e9899b3022a7990ec7f58d55fb838 GIT binary patch literal 2206 zcma)7>u(!H5Wj~X=kp`)h9o?$kF+r~HlaZvRH2qaX{9!b8dsnL>9qE)?Q?eTuDg3q zY^9%q_{RT$_{Lwt|8QTCkoqt1iP=574K0<p)s1K7c4lX1elxyRue*Q!`p1vIxrXtl zap7qIe+OQ%ZyE+Rd;^=<q9(I^%T&BgZQsTPT%-k7^oy+Imsr^^!?yx1QHNFhissAI zWmUhbd56|m-LJET-(U;=g4R{&B3ts8H1E=7w&Jg7zDifwn!l#`8ok8U{dLXP={s!0 z-vD04u<38YZ-Z{KEq@Di3;w%!(SHvw`S0WF{s&}p<dMtg=I9F9IycTu(*VuYzKK1& z@ssIa`(caNqiuYdR7ThF6@2v<8+ItoHPGC6L$mXSrukA+8GQ(TxA7ME{RrDfM)St> zb2sIbhTU7<uGblIg7B_Ded6`vC?Y)>#*vrAF%6@Eha&88vYQGJTJ8%~h^Cn>pst8% zDoGHsB<Awq1r)<*+S&4hPUrC6OE-t$C0kLtqt}(M&I<ZGW&uP5j$LxvBZ-PYfV4rP zUW`e=QYym)aT)Yu&M=Y)j;bo>k5PmMglDxw9-mI;QX^5)MZYx_!xJJBa7@5+jiF-_ z4B_U4tCO4ok-;z)68Lf_WF$@%TYN$!p8!)mNGW{)$)JQ!ckV`*lZkf-ALFsN18NXk zi5BmOA)3Y~t%%5GW<P$|nU?lipX|5xcmYzxi;7ef0bm=vrpTfq3qZ0ZgmEAw1jPdy z58!6Jr1Xn86sSu{aDsRQl@Q!fHmVnRU6Cq~o~nU*?Adz{e#Lzt(ioZ2Iyax2z}e@< zbL-3+6@V{d^Bk6GoSCE28SKzp`AkC+bPl$_4jSvs0^r!wpIr~02ZSbsdr%ASSsM0^ z>BNJ$HCntQ32<VwOnEZ)<dAszRa)LtLHa3GhT0D%-E=U}z|t}#JLQqkCc`|}9_mXt zYUVzaExmENy}g430F{xZ@V0j-850_znZ$??0E(uV-n@%3!5;GRl<GKCm~-b4ULM*P z-nM8~va*t3LskJeJkt5koFGu1gCMK_>uy<15P2Wqh$KXqRbH_!L_14B=D?;$D!Qzw zZwt6B>S(i4esWfx1@pVXFGH#Re%4NSI7X7R$B4K4F;xg{_m10=?)AH;W4tdu3qI|2 zC&zoY`qLBE`xu@<)b6yCFxd?wArYm!`;1JnI2B5%-(XB49P{?9@!LTVMxhLXRx;r$ zaPGdsio%moaZSfuG+kIVGb<r_f+nH^Jy1eP0#33rCVd1Q`4VpmcM5YFZwkx`Z`cGB zsgax`=l0u>lOtP$hf;4om*zOn>z$RtK@@Xx(6lmV{s{^I!-tZ7NTC1_pVNb^4Prjg ziOk6rh=#8M`5s<j0Wk{A#{XzVofO@C+Wf!zt$8ym2LX<IfDJbY`YE6naKhCo{05M$ z@oLDad3xbk-PHy!t6dJ<fFv+`^dVVQZDsjfyD%wKhi49-jW9hp{8}nQ+T!F{O2AqT z0^iXpNTVJOvmL5YV4&$4<GV8>7;O3ESpz%1q};<TP%4KphZ|LcfQCH+<1!b<07Dqd zAi$*oVsOz*%5YtgEoEK&`kSwwew!z5M=2JLNH67~oP3v0t!(Wm?T+9N<}Q^7&{K2u z`a?Jcc9KJiBn$^O|FCp)@bGac)PK)hRaJw0Cghb-UGrMSGv_voaZ1UT3YOvkNWrR^ oj<s5<0jO8uovngn)~tdF%Qnont%AL5H&(3jvbAhMb6CsvKd&lcI{*Lx literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24c01f5922eaae0c95396d67d138a2e971c9879d GIT binary patch literal 10693 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..709abdeab6764a512e745b4007fc502d7754c299 GIT binary patch literal 10146 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 NFE4iUWx|cD_W$GXg**TN literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa0fcbb93a1df296396ba141373da5c482979a1a GIT binary patch literal 23668 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8692e4d0f01548a07b4fae609713fa67e55e251 GIT binary patch literal 10405 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da9935e23d7e129d7873031df658f0130dd283cb GIT binary patch literal 5875 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d723b96eeb547cadadad40a627730c11c67acbba GIT binary patch literal 2765 zcmbtWTW=dh6y6!HH=B)}q;4n_K^UqQVHDe~QZ6!~AX<>}&=hDzh1KG$cgD#&dvRuF zlh|^2NrZUfH}J}T;GO@luSiJ!3w`38S?AIKQW3M7vu9?{%$zxw@9b)|>izl4?@x|r zE$a{KTq^<p8Fcj%5N>f2SuyDlf;^3Ahnjb(Q!;P6W5c@?m1C#lfQ-${(M;@iT*Euj zZ0vPB!_P!>aivosmM9IX+&v<E_NvvH=N_LswmJ*E!mIFJ<nw$1-j{fdFY-&rq*LSc zp;f>9479Q8Bwz4*DvdHNx?wy_rQU$Kna@XBsPzZWNFh^F;Q>sO9+1j6VmA{?e;JC1 zkIR|vH$HlXcMNbtY`6#~?m}1BfoN+$G#!*UIfCcV()OS%*~A(+oZ@(5fkLJ6hR2{i z$RrbS&zI6yDonPbQA2@dkzi5`BR>$aNHpuGlEq;xbecx08EmJi65U>!CES;zrrGG( zA{?EUeHDaZeI|E%VPg1vW?LLYVSkj<ROK_7^b?-OvW(KDufAK&9WH{D3%IL$vg5Co ztiku^yRD%N_k1l{d%kS-(})YHTER|BN4NUDgFSv*eb{|J=#6%6t@g+Jac~pbR?>RZ z8ivD0m?-T>QR8+j##|jJoHV_=CqM_;%48IUz13DfjKnZix;Y%>3l}c80D34Fh-EJl zhj>IT0Uw~zv7zB@=;#f#0Yrm&H94a43c6rofx$`QYP;YL-kXqn*3)Z;6y&HbgIs$; zzXc!eUf1P;Goe3Q#pp3aF1U$~e>B!z*Fu6FSh^=9>tigarf0r9%!U|8ibbK)EbX&* zcUIV5o#_mms2EtA@i5S8#jq%(K*}s_2N5{Ez4^n`5Y6ev=R<CDddvp+)C(a(z@|wc zavL`-yf_<za?oRy+sMiputPrAmucKBw5XSIr`S6uVO}<@@o+&dqkIjQcFm`5+8YQ^ z`6?Q99*E_7q(WWlf&E=7--MY{54;fmEAZvi1IwIndTgEe;U4(nA>=yFO{`*6xBUie zV64$>GA@Qv1Yl?0ZnIm>4+;yf|EujEZ42ge9_lbn(DW~5P!{_;;26CfD%Q`E02dnt zQbY!!MU$<Am4(k&Sf&JPqfmSE@8;QDVf))*unn22GnuHD_bHni_&<hFk?5zE$JocN zu)hvuVm+-rp@-y<PRNAzi?{~7g*YY~#?=rAw0ScpJ2~0A5CG3-*S16=4u<kh8#kmt zY-_xHc5l^Oi_*Z4)Sc$3=>JnjF2f=6EhG#Hg3eh;%C}*-27Rha-IlMQz!fBjU-DHT zbt3WZ7uM!;=k#vCcjW-FDjr#)@)~df-VYnj<7RiEtKWcV>&QY2a<b#fCBPEvkQ_`j zMFaut7#@};fGpbPAae!gj-a;b@&uqA@TN3yj$n>hz|9=m+MU>X7EtDU?M-aJqGD!l zP=UGe=_>d_ti;28Q3_UL`6wZ`yZqRU;5_@>c^)qpqeD1(P(89H<v!Lq$N%~ypT0;C z)|qeM2Vxv51?I@+W`P8on-JYla3B!`i?c|FLtknDc^NmjuYGoZ{r(qNcw%2q<FpMD zemsT0wh4Cz?H(Y}+5W}u3<}m6Ad1n-%jIVM#gk6z(b-w+eU_w}si6o$I0;e|)KB1& zMOkAfE7*P*MXV<n#xx=~FK&CP^far_kat>wE|edDU%cYR*l9FwsH$f|vFeRo95x!j z{gdrJKGoxs8>&7pF-uL|GSHcq_YtloMqcg|d_FIsCISF&1MWbP1$+k|n0U`iVWRVr z(sBy-S{&%E9t}nAZVA2TN13QQMG{=XE$v>)NAe9k^Bo*lf;7?a7h%?1%#*9agh}@_ z0=npOJp5Bws~8Y#&LJ*w=sc;>8oaRvRLCOr=sc~_3YC~&fH3vTx!3LXGXO);?Mh5A zIR_+nFc1SJt2m%xYV47_LqFK@w}dj+>QqjKP5ApVwkfV;ikTCo=}tD3_<MC`NR!Cs p^mDf|7-A}#yB4QBi^Lr)QR+1y6}SgHpmT-5L+4Ab=PtRmzW}^8%P{}| literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0df218e68d1065187ecd1707d50029f3dc2914f4 GIT binary patch literal 12972 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66d46a2b6183f70620aa1823e641edce4f2b17e1 GIT binary patch literal 5587 zcmb_gO>Y~=8QxufnwFKsPT~e>n@J9(7|>Kxy9gj8X$)J5-A1xuD=44_SPnTuX{6m9 zW_BrxEY(AuQ-Su{OAkF2=&$Ipf1szm6#)w5FXYtco&6vs%l$x0XjjACnRniKKc4q_ zdHdS6)<6FE*DnrkI?mV5%BPC)$GGB;a1)Mj11EI%UDpwws03bE*{|4fHK>NQ{Tjx# z19!jvsUzy5_7%R##<R+PQ#77Bo#r=?;dI>eB|eCCFiE7Z!m&2VH*WU)4H*r!kbXD` z5;f)~@kiQ(f+rk{u1rjjy-(Ml$S)@{PIhE+s6{*^vBjrUco$Ekv+oLL-xKbBg%lQ5 zQ9G>eSH*SF5Y4aL{hGKTTH-23b@8fL6W1_mh}XorcnPDXcwM|KUcu;!sN(=PO&vn{ z-ztvNV))$C(TR){w2~}Trz&F5mkk3R$1-NqL(Oo$K!!3(7-w4{)ZOai7<w$DKBKQ% zbXhzZ9$IlcW?OdgR{vL+6{x}O-cU!8941OfW37YUgT1}S*foFj7?1jlN5U?DZY`|{ zdBhK->Cx1kY~1g)?EJ?@pC|!E2l9}gC}>XFhx}MY2W+UrP)978jWI!w7;Vf<X7*h3 zxZGLDp%pYeRKr8NhL#kwM@j~QS=W)|M6*dOa~+<Jv2>({JP2mpOs(8Zy?nW!#{>-0 zXDYTj#xfElDxYFa9ZP06f>uV_^JNPKgIkhA$v%Jb8QUORGuZjl?Y%C0uzmM_m)+m~ zY<q9JlPmOs-3MCC{<rPlB@yqET}YY2Hj|jnQN}xi1E$mIEeiWvWxQwZEp;a^J%02Q z2YCEB-R|z)d+-AFOO<o4@@U53Ua{hyE>j7csvuy2*2iozCjGK-9FL728^sg3^d4!( z5zUYRFESnB%8tYb`b4s1s>|?zr?GD)Y~|3or5{ErQ9Mv{X&7>yBORoPxAGvcPuQX4 z!ak&IqtAov0R@qYhQUNg=$^o((7%X=E}KMwj1jij)D$u(EZBiUzS_f)FnKx-)KDeC ztY@F4^(+?B3c@3;Qh20|N00X&KH7b{JM?mdq5pK<!xgXNws6OF<t!W@_y~}2cL7$7 zT=R~XR%02A%vDVMvtzE|-?!sUSoH*E-8|uDbEE@0<L2;qGYQ@s4NgzQo%ntK$HT$w z_`Tbs`7|8<5TAo+b8mC3#<x@yCphk{JE5G5_%x=6_VRHyq0MFv9h<p5dgEEz^nC?$ z`+kR%wkL7tH=mqC(OxlUZ`i;r`ZRIT<e%Y+*KkWv0G_$O2BzYm-tK(oUXFG0G|6-F zyikO8oUEWAJfaNK(}?v;AS{ru2fN+a)ycyGGo{!zMw?F4(B5f11I)C71Ey6<Cu`O8 z<s2c(EK0AJLw}$rk>F;QddE|1{p?15OB)bGP~4^CS))|uub<bymrohiFo!-=0BCGY z@&tp0d*nQG&fJB!s0sH2d|x<6?s47R!G90mypgx4EULo$17`f*`<?p~v2s+o{Eeu< zuvPwd6vQ%2caTFUAGte`b_5w0i;2wwN-};~*6L9yt>4dJvfpO|9!o$$29N!IW?no; zVv9UUDNXhc0lWC)C<-g}&Q>pg1<-(0QwD{C6bK}T%XtXHCxi{CKocI6`^ym^B<Zn- z2^;bVwa0EpARTI~i&Zk=RPN#~3aAPsixUDTs!&usa%>{K^qA%m6bRrH6BJbhIU0!` z=XIsTqUoWG7|JGa0nv~ZT@->+t=yiukyndOx3KkvceW&SO9237i3H3{pr>Fbu*8WB ziq&}_q4<*S^hvK467dc|QO_J>gL=19O>2|!Seo?4iZXuYqd2`@EL~Q|^u~o}q+q9R zbH}`bNHy2#_6FSujnY=Gl7C5N<f49rc`+?>t~R}<*K*g~y4&>V{#>TyOUg_k5Fs*V zGvz)8$N~4bY1R?_&KdGyQC03)eNjJh7qw@u>ntkB8IZID`SQ%Y>Adfpc`KPxr_AY8 z=YJ{<_}?YQO5iV<K`DzO7xw6t(T*e-O#(|d@{^UZ6euL*a}1)(WHMZOch?&ETlXiO zYG&^GWDF)N4WWkt&2~DC7y8D0AMev9P}T6~-DAFsw?D;Y%a2oUx^=JVw!EtQvNwPG z$$3=Im0t;>65c5aN)P=8UoLt`Iq*;uei?|$q5({MH*rOk3c#XfJ|;gc!190Vec_#5 zIcr7hNrgNo>YhX27grWdQTf0TjYUhj7<)iR+~07HstZVg$D0^6?8rH)<%rm{es1!= z0BTG3{J&jIx$&R-`XbxPU0rJTa{`xs|6(2baL-I6@N`4S5l2hY=@L3D`NtB&E!7_Z z?Z&{s-bFcO7i8%ip)=uJHmlTu0(i`4f#xEkMD$>_7y!IcqZ3Qdd+ZTjo2iO3c1Cb? zP8+Iw*#^r!ixN|A*@k!!C=1t{r?)O4u5BtA%Uv^WN1N>w9o~{zTBcBx0}Iz=3<7;J z49Wp<PL;G{lp7xFh!28UsY=X8;GVX#AU=y~l99heg;bWb?y&~|<r8Tv-wpYU4It*Y zsH#gr>L9|NWr4_S`RMK>Ib11;PXW!SV$=cUWrzm|fU>fde3lB}v7CYE1rsV|2C`#z zclUm|A-$yoCKGguJ$Bcg)_%!q?gqV#z>d3&8sRS6dAPG}o!DX7G}tQdc*wHk_Hqh| z$jT%Kw0%M~>XZ|`+RAx0t)NfdI(^7~St^#jV5~jTy1m8P18&;Oa<_a7c0wv*$_7oP zaW6Sd+FjPpoo^e+{8hVii41rmC}m)u6&b|OHrnNc4%$L4HaeF{p<Y$2h?!e40~JA) zOw54WXYE4D^Qsib%Ko=ih~|0oXe<vd)jL8IhQ;a6op$*qGwlV-oh>uLVh4PWyro#@ z*8g3G)(g$~@(FFkHpsanWxy@YMHn8JZnH7bS#>-cOo*aUM-PskfyaRONvJ|KTz3Bm z)q&B|7|qB^sDqFrvxw!X5kfrgYk+FhPsPZCKuP?FL7KJiWyyYP51we}jhF2$OYM-~ z=n~D;s06Tpy@#CINTjTg@U%dvWE4uwaAIg@ko7ub1&z;BsFaue;(#bGP!XpDY>>th zi^QzxPV+KIn2+xJywFlwmY)SLUABiTmeeDo&m^&6$_09r?FH;ndgLMpFgH+I=bscT z;y@?N!a??1#sENt9HZYz;<m-OHtCI+C3>u*V3w0v93_&}BQ*<S%-{aE06bq?^$FOZ zWqw!4LAJLtRR1$d@-~euFS+_+Uh*nUdW~+xP|Q1YqvNG(d9M4Eg%=tv^F7S?1+JJD zIX|#`1#G41dSEV9_qw+Z{<7w+gTu_<`Pcl#l3KLb)!p5_U9_Otm3?bbpG%42`)SMf zLoFr&jn{ntOSB;Qn}+WTJ@kF^CUh|`(Tz@R-l7{ZE359x5vXT3)G*p#|5_MWO5A+2 z>aBULisQCwt?#s6aiG-|+IKWbCI<T&YAMqup%7IvYwG>C#(a1TP>Fl7I_-r>hL~zC w2tW@3gxn)~m_kRi_)xvB2S@n%&+dGgN@??h?3f?XPpC09>}#OsYn6KCp92?b`~Uy| literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f6c7e49c5b893f459a72790e869eb860369fb82 GIT binary patch literal 18787 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ĆXrjh*j6T@^O*SNW-?nZp-$d!`ixPr8JHy3|3t$i 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/_collections.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/_collections.py new file mode 100644 index 0000000..34f2381 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/connection.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/connection.py new file mode 100644 index 0000000..02b3665 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/connectionpool.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/connectionpool.py new file mode 100644 index 0000000..f7a8f19 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c6f24a3c2d85b3ffaaea89874bcc242db80b690 GIT binary patch literal 204 zcmXr!<>h*|;CKuJ5IhDEFu(|8H~?`m3y?@*2xib^^jpbL1QJFNzbf?$iZaU*OH%dA z5{vZH@^eyBi;DG=v-L}I4AYV-%2G^<&ErjzlPa?fjnk^ibCV5#AU#h%M86=jKsPh5 zxFj(rN7p1bwJN2!q8KCy#_?sTc`5lt`lUrVIhjeu`pNluB}JJ@`tk9Zd6^~g@p=W7 Uw>WHa^HWN5Qtd!aDh6T(07k(&1ONa4 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb6a3abc974f8c1681590ebe57acefd832671221 GIT binary patch literal 1100 zcmZ`&!EVz)5Z$#M$8}Sn6)JF`@->InR4sx7LIiND9%`yI6e&Wo63;eu<9Myzt!Z-& zAHtO{;lvO4iiE^3aAMX8Z4l{NJ2N}G-g)z8c4uY9{rTnF$L|IqKgis`HF<?oK1Tth zOMrrr(k=xPtk0xtKn-lvCe*<}ZNU<_sB5qc4b(Om$E3M3e(iS766uXNT%^p)1uqg{ zxMsafdWw6%6pNLo&Y0KAb1%pSNya>u6^Y>4h-GTa{e=if7;E`=P&D4)lxrvynUMUR zqLnlz1mn`MX_jk=j8Y!=(x{i`th%^dMIVBIIoJAsu4q(@<X0kUczGp$PyAdYMNcum z=n4Onr@(~t<Dsw8?bH5c0lV^9^fc~Y4Yzkr$Dc;=6C8ug@A!F=Zzh>ky)@n29kDUU zOR1gJj0%<k7ygAv)1<%S$2?Oa>H9b6q8Srg`Bm9Kpx2o=I(r)hp*DV^j@Dv|?%<B5 zh&MDvjTt>g^@p%<^Cr)!rEe|o&j*WSFM~e6)K^K}8H5TA;GcjdI;xsHL<6WI=X7ZE zbuhFA<|8t+u`*UzuC|Vjf^h#J45Ie?uyb%2j2mxR!BU><g8Sv&<Dh*Kw4>v9dz}xh zcF;6RgUhl$<6;qBp;75(kUAqmU0Qh-1N893HNcH|fP6z?163SZp;*Fm<F$Rx2iUqd z-RTP#H=3qcMkN|r+(x6&q&&bmE0s&{(8{+M*tDC^>A9g_+r$8Ks9%v4cJ2LE5S<+E zm6j40Y(92r4wza<i3asp$DUP8ubcI<9!0?8D4N38eN)x4;;X`TYc{3xV)~9>>a?WJ O+%g=~u^r2)Irblql<P<U literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25f9d9f87e9b5e5569764c62c0fd0688f43f42ae GIT binary patch literal 8319 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2fac24690bd9dec8d53d5ce3a59a465211e6afc GIT binary patch literal 3246 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2202ac144a7b2065959c4cdee26a561004dd64df GIT binary patch literal 14535 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 Q=C4gY$?8SQHzyzbKVMY7k^lez literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ec29c234d65a7d7f9ee8088284050aad21e3ddd GIT binary patch literal 17899 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%0Dbvo2&P#ZncW?^Md?grp7>c@e5%}#N32)A=F5RHj z59NNdT8I8$3I(DPb1gKOUh=vId6enExZ?>_3YB%(L~;_feD}>#tgXwzbG>9cs<n4* zCN!Lp2Gi-<3@s_K-FT`2<RJfUm(?Z_1U6M^;cTq<$boUcdbD~Ja&?6oHvjl!m`Cs) zAc9oVYyg3XanK`%Vt_ayDM^V_5~n53bhMgQ%bu`&PTnDNPIN$X8a49pOkJGG%l-&5 zR7#;kLu7YN5t&?&fgQv1OgKHr^{kwc_|<l*DwufE-jPifWbNoY2~00OerF7Fetj$4 zoI~86wQ-)}T(+-4dV5otx(2o#_?Ic@?dgHFp6ynuP*>nzmw;q#j~i5ohWJC^lO%|U z)tAFJLpv7o;!8hazWzCg3_=;@UqpklVqCR3teX%Dz)BNK$#sR{P3s=A3JWio1NlpY zA8;6EL*-t&xgyF<+|rN=HCtK&I@LTPH;`3WzAHYx(oPjPNV62H0oPHc8meL()$o`E zr>L|PbQ2#YJAjS7@;2-mX*q7BRNjJuBxzfaxFP?sxea1S<%3q$0eS<Yw8=)iLkRQM zA<YG#VE_l>c8J!o8vmAv*LW?AsM|SszXA+TfQ@iRg$&i}Zh6KCxho|(_@a&w<l+vV z6o;x@g$e`B4{B3Oy-7adxv!b&6t#sSL|yxtA^sSw6SE10T?#?=8D%>41mExzC;F7; zC%z5FKuQvfk?KV0Cy8UjPj?L2O(B!K($6I8uJ4uh_himOG;l?wx(A5G1JH9+>Oz15 z1T|<3cL@Y}Q*Fk?q@6WOb9VOL!s6Tq4>s)irPccjYwH3q)!i~w=`xlmgi_H76m7x# zdK$RXYKG#5i&Fsr2lbjrq|<V}=1UQ{R)SvJ+~&%HS7lJ#ve#iIdR+M!lPfC^h2r5w z2xc_3Qh2xu__!@tC2%$Di89#UEdzVnE;WIO`VB#tI2``Ls8neX-73<a6dJAXLv;ue zV7p)>oUgt9!P3UUx;2F|pzT7Fn5Yw$_S7P(s~n=4M94Uqh}J<G8aklXVfHE55JYxV zXob9!MQtrJ0bO&<XkQxQo4&%alF9BS5QJ&qI)S|Kpr)-0^VAHohPv%1sHUA5UleJd z){;;qjfaprU)R<&_(JsKB$Z91rrMwR8P<`MELbh)o3%WYP@QV1U!eL3nUwOBKT<0~ zt%P(!-BH-2$^H^Z8|$Q;;k0oovB;a~q@>-<V7nYsC#C+qKUte%pXdo74ph$nBq>Rz ze5Cp3YSRekw_rhcGPMhx>~021q$wjxF=ZOsKqNKO?SC1w$$V%89`3kJ!kIf|pqQX( zmm3et^(vGi*g3PMhb~2>a3HbJL&y=BD&CuMTYx$}AE+qXA|6-j)h74}Nd+tvEbCM~ z;gPQjvjb>pHJz|p+|)jK8Qd9d3SSYOzIV4zECq(zY+qi4pCOd$l@_4KupA6d;M~oM zyV0KEII3IK3gs)1{_56IX-n!{FNt)5EOekWyx`1S42+f+B%z4x1nH_LcwZ7Yb2CWN z%94!`<Z&=;a4>7`mLd!kj0x1TceLudN^(M$7nL@(d4#bD`v(b#3V@vJ4;CmCt!KIo zVav=lD*%<}dn5I%=e{(11+E2aqFZE5_R$7BGuBu)Z2_d;$D9>6Pmr5mTyrUrT+zI( zOS|22Vcib^{kj#9$#tyhp}bYqssQ5-Qf$$k$%VT(9nvx=2*qLGHXXpD`WBRBOd|wh zgOp^d4>1HQDj4p0E9dQ3aPEM6hPOYE1CfJv#5*pHMDHCmp=DrhCJHb?CtzG=4a3N$ zDH3RgiaAP?RKAKv0VPbl7m_SlKnX){Umg-2LmgEpHu#rE7)KEC@ndw)GY4=Tz$=90 zNdh`s3TbJcI)28_;>5}MIRH%9ioW>;P8&Z@;L9<lwPW+~g^uYLcGK!Z*p-R%fOwet z={pah=0JFuZvh_aiXF5%B4?Qi!4bFF(bYfoi#Xrl)bxI{qu0hDM07d%#-o#Oq66)* ze;i1kJb|i&7N?{P#ZKHJQqM^$E$KM5V-z&+r!m+xfl|{fg;}3>QUk50AzYUI3n$tq z)N(H(T=Jhn*^98AGeRL+^v_5iTJ7onULJ2D_40}K#hQ%nS(d?UKtJ?T65#9`{&Te} z4#eu`dh?p3UzPOVLD}a!MhB3eu6;*8Ty2_Ny07+8@jLpbtE4Fu#7z4)Vwp16wOjXG z1-+*csy)EjA@!P$w*!#BcQmVgxa0P5AVc_3)5Ae~6t_eT5|B+~goKs_{6av7cxvNV zrB?{~5R*_kmB^Sr(N+D~&wlnzMYX1#+V{6^ys^=qjE7L-=^o-}FNBA$NEnD9-<^-3 zbehjrahH-u+!*Us#|^*NeH3g^7Kj+KM#4jRX=M=rvKLGbLOwAFb$-Z%?Pi3c3*MCh zG!GsWKww7I5sMx|M-F}rE<*eQvkLJIyd5GqfDD9<9i$<TA!)l>0;T0W5VzV~E;n4Y zjtQxUoYjS}F-RT11taW3Xk|Ej-mf;#$|*m#Cc`@G5GW|SBCwowh2$AXx=T%GrMWIH z-?@E%M{%dCB}QLkL?u<dhsYX_rqmP3YK`dyq~Gr{O9(VvWhFue*2NGd?6p4+v$pO6 zyi--=!<ZAzc@!K0>1jhv_nVx&%NDi}1^Gs`34er4*~&M{kGmg1zRzC;85=sU;H|OF z_1^70xW)E%6vaGcZjdHZ!I?f}!R2CJ`z~ecCn&0oQj#W#P(Vd5KuI5il!c<6AP{IG z2XZ!%O;B}5NRL6H@*m*AL>eguU_q%ZFkt}_H~fcuy?uUA?#8{xN<KybNfilP9;(>p zV(DQ6>$E>e;~>owx!Ib5;KAq6q!jMwXn)4((6H3>_S9gfVcmfq6DTJl{wsK4kI<@; z>Ou$jJKl{qV4~Vg*VT)N4GPnK<6QPHl-hSuTis{0is<yw1>?5kR-g(*xNf!O{gh)B z%~mX;wBCMpaKum4h_MF>j(G6IsUT@}%Ku}?Vyd@zH=xuSKpGN)V<tPvkd%oKYMa7X zAWrNEaSPF6b)Dl+33V+Z$bgO2SCJN&Axwrkj=GD4A=*<vsvP|9{t0pQ+Y^HmVxi?& zN9QEyIg%Cl1H5nr6hIL8hcIw>i!S-mq<HXlj47IVoForo_|Wi%gP0on7ngC6WNM<B z1BNk>Z{mp1PvB+3F`$JSeJ3dZt)V`Hwm*WkHq;ONVr>*Q0FRj~l0Swr<68y}>+hoN z39flF>rX<Dr{0ZvAY%m1w2PcjpR}F|xj;l2wLe9^3i9HQi17GqMX-3=7ikho_Y6eJ z8YwH5(j!)+cn^h(!?&x91eCmiH*3I=vD{j2LBBl`<_qnta0SDaOE*L5I|`6N^exAh z1d$Iz%P8xg#P;z@=teWr0R6Mjp2o2MP3-l{X){GVYYcHVIlQY$3~{u?Y|4$uAS*1p zI)cbTR@4<?vj|QIr#C34)ceT4&hfAnZ0QSw`~)i{!mb9kbu38Is6?h3=<amk@jQy& zJiDi!V=A6p5;bD>-N6U<pfIKEK`<rUhd#_ojDW}lycQ=!D#VZkV<!3-GePeJ*wN~M zafLB0vTDSbS$~Ag4E95AKl>5-?qk2AY;D!SSo*k&2FF99{ULh^b3S5`GkJ_!@Juq4 zv3FVW8;p3K4D-tz(r%M#^bl(imt09qLHo`ohIc<lJ3u`O0AURx@i4cI$FtbFFx5|V zxPEVgZrJ{iW!TQ=HA*qr@X-C>qcJ{BlYXFv5hA6K!!k7vDWE!FKU@PSVc&hQGXLKC zlC{u3qrmiAxC;QB0f0V-Ff_3s!@)x5o9E<08J)x-H?6nN4YQz>8{j|EPv%9YBL9IG za8;A{E$}5P*;{*=1CF@l(2|LlQkLwD110P2?E6mZu(`xBk{huAPoS>dLIVR#bO-o1 zq5*>CH1(Ol)!3mmLtTp)7m|@@9+Z0yJ*D31GIX4tLV8*qMABDqkf==f4o^8s<iqkw zwgjWehH+FY)J9IQfYE8Iho^1#d?jye%oO|1RuPU|3RPi5B`s9kxXYogxs~^#3qJQ? z=mMcibM94mmsJBQu^TFQS6S`sV_LG_CqXZxphh<){uKt|P_HqK_T(Td2spYJb2#N4 zwM*fIe}NZ3Pz4`+F5nP&fpC+f9m79xoCLt6<A}onN63j#6V7i~mJ!@zcy~z{l)-fa z?1FSB?QKLU;x$BRTu<<Jd=tQv4rmGx5<xAmEh!*1CCG8sFW@2s-*N&^<vLl^lq0f} zP(MWOSXa`hAIq08z()X_MDDb2gUrz_QMoD>UU7^7POs$b<L)L<o6TwyH?9N$^5ky7 z%y?jaNc2FU4>|VKFM%e?W+Y212j(Mwa{pLQb@7RJUB3?(nWv+>2b~ON&iQinGbql< z<uF(RA=1M8NCR!`9o?gwkKAO9&M)!<Ej<voyfqdl+=bn;>MQjN92L24#taqsd^kbg zOlT;|ek)7RgT6z!*Pz+=j@Sqe5eL1M1Ol@Kha1X8-u%!hIe6>^c^o%;;8?c#h|KsJ zy3nQwVNjih+70L<0zQl+kLE;@&_@E!M0`PYM=lTSg3-P>$fSKOpDq%Jns&G3>!JY5 zmV}h$mV_*#wtI$1N{7C+?{UZorzqiJfzx|_5f!ilsDx{Zh=n+Mn#JyD`UFIGG)5>N z&fd>KN_>C6%MnpdP((htbEORJ41ICt0vuvCjWQdT)NDJvT#5IBZGQ@%ca)Q{ZKqYS zZMA|n1G%vY=Nv9c2Spglbks%er%<ZXt`!SV?emS6iaKP}W<;%9RGrZ4%@a)hGNaEK zadPUfGWu(b{yL)`zsQ?h(po^qb2{cpIuaMlP882&N3w6@R|d&!I-54H(SFO0<2{+3 zG~do96zjzLcmf}!kq9h`zb@fJHh?Y;5k|z^N&Gs+K{8~C4KRZ&K(rXtiMmLC66AA( zOlV0wVTES9p3Fbw@`NW?QCEKx4FtN1$3?zlCQ0q_78_Lss0lKfEeN^q8J*;}#my6` z0=g=qSY*hk-@tp23-xaZryyBY+dw0B5BcmPrBIQb|HF7ViKNbLAOCR}?;v=;gXna} zd+c^kySS<b*LzBw@M$;YWSp$LXWcAva`9IxbjZV1pL27_DbPL7FK5Il!g-FLGB{&+ z=ACh80?&f;v@_+LgPVN>4)|&3ytwKwJC~fN@HXn;64}hN>O6+n{>K7XEtSgfD#c#) zN*yRc?DHO$=wM=AmxTutNI$Ox*9n}%Jt$4_=C*=2QZDO@&kz`oQ&vtXs#kjS2+CIk zQ$2bVx#!s!F*JCeaA8<l8tOL$$KulyOVG1$sUK1=yclAQG$IUf7URML-cRwZi^`Ji zDihch+Tu(OcZ6XC38=&iA4FOJuwZBRVJ`gY16{IqORyvle)b6O9)ax!e7XyG7yA9` zxIf$jV*s`FKKhWEuKzUK9n3HflF|P;d5~PJ0f*_i*4xhxku4(hliqdCnL&0l`BuPC zqy6m|!W?P|>(k_Qe)0cQ;UMjzQ}8~z74Z*ty*9I@MO=$$;8OPWxHZoWz1O(N(STOX z8$o?%4X#_r<$3skh{N=d&<&aV8Rtn+dX8bTe@&W@F|>61g`v@R=`dJhfSvw7pvH1Y zjnKia9L#i>H-3P$f7heKz)2cUkW!o{DdYeTHTB#0K7+)Wh`;|s+-A0Y`3%}dMF)t= z<q#G-&AgX>zhpAMhsysk?l^J!WI}}m$WVa>lqkXc)smP@6vL{F2%hMLwGDf1;p-nP ztu5SxyNjR8E6WRK%sU_MW}ffve~E`+w6B~o_rBt%&z}bqtbAxKu;Yu4-o!yEa*C^v zSl(E~naGi<zsHCJ?*bpEE%Waq|4)0vI-N4ItHVY9vR!n64)W+qLnOo?jr<+&zr`Jx z?VD%J`>eXBkBAC28IN{d$a?>P6Fn7j2`1!M7~O$U*Y$oHk4SINoH3#&YyEi(QZsNV zbIQjJbn$<4Y{qi?)uHy|D;M2gzD17b@E$_<_5|#7l3i}o2ctvRKGd&pwh_aBz+$4F zNhJ3K^CV|<vEhGluH2~_RCo9$&*HqkD$5o2%|AX-zfV^qVw%H!bI5tlvZL?eiYOQm zcLT%u-a2i*@&m4T!dL=$=7Hnk)?3x}FcVHl{T)ORdV)*VWpRt+8M?_UWm+@C6Fn!Z z6m1&#isb%)XCyFX@`wg22DVJ1eSK(9T`_)Y_0wlRjpo9ucYum8Uzs(i5prNceGmES z?;^6!ch6(;TK|C@VqJmQa5B3L{3`O2r9%Z*TAkquj>-t7A^Gi4o>P<6l+(KX;+IXV zS8Z{lB9$;a!f`QjL|{~Wv8JzKF%up<v3MrEOMFJKI8Xo}N(5j8IlxoE7(98mP{8n$ zEKtLAND5Q^6|^cke`tn?^yK2I-(tkywe+Z^zK>5_{t<^&l6NfwaId(nJop-e^G?f- z{W!eoRSBJc!4%mEPJYi;<?U@;TX$Pqp8AxHzs_iQOB}+J8aYMANJPqeEzP^<FjJs_ zn{*_dEtvbNL(DG2SA>vU+`tc!#?-H}!(U_c>x{n5NGvw$UT~25N9qSi15^Yg8NNFn zNb2_)QEsU}VDv|f{t=@eG5TkWdUJ^Pw&>e`%spK~i7YPAXLE&YF<UT;sY0@t%obpK zWz3wJf?B3a>7T#}{4)s0AEN^H+TX%sd8Q(xr0Kb}&mX$N#^gp<UoaAk<R!cXnU*)p z4X8e5`U#_}jN~xPAszk%8atUocs${D3c}me)<s~RL~!CC`^^H%U`a0oWypmgE^_IK zlDJ(6)Z)Oc3qm7zUqb(Bft6_Y1^FfUp>7DfJhd18AlIAi{*2C>?V5aIp+Tv(VH9AB z^82G_*$mH7`I(ZU2^vg3#P|g{x>uFolE5@kCFUd_fG1U*#lMNjnuZ(So?BSAZ@>DQ z{qFqx_WJ#~J8!&VJ<as_`*Zkz`(=A|<-y0d?!5deb5XEY>(=czy0w`85^F8Y-@CuS zczw=(xU_NqwB}#v6<qt0VrREE)bUyE4Hdh}ZaKPp>+5HZEiUwBBZ~_Sv~*T?11${| zI(v>>lKH#y-6c6|jzh(s?~(SDHHg}?uJlR`46d&+E1u(7CAj2qp#ehlHN!&uX{*rv ztd@Eu&T8gMc#8y$=Ecs=qSH{Zv+2}V@Ju@Omx)O*FuT4IXVYn@(CKvQD|7~(`b#`Z zS`Unbi_y2WpDe)YQ2`G1$pUPlkHSwD=o<iA5b5#67`nXoWNu$|wLvj88vj%mu*kvf zJJ!f9rnMU35Vvq=r~mV|`b}2K?3BH-?<*8Wt#0Alig(fm)9xsqmuiw3gH7F1yqT}g zF`|wnzg?A|a?0<q)IC<oqj|cXc{fPan8N!l;x3e=T_gqR@Fy0b=0Jc<POsAr!65rq z2$;T2f$sefk=zO4Vc!1_8t+u%LdpQPQ3Omq0dHXv-sbEC5B(&t%m253+4MxBU`)UZ fITZA<L^h9quV-Ha4xAYKrpA9JJUmG=olg88_uE6c literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03478f909215db378be3a40a482741b4507d857d GIT binary patch literal 4910 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py new file mode 100644 index 0000000..f3e0094 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a49c24891f4f2777840a5f2888409709389dd3f GIT binary patch literal 221 zcmYL@O$x#=5Jn@o5TOTgp<}7yM#K}i(WMaDB$Z&AgqgJd9Kln#^(5ZGt>7VCnF`{A z_ZYs_WJ%J0UGG~KdA9k{iN`WZ-5AN%Y|vTV7`F32?+bX;O&%09IYQ}-R7fE95KLMY z$3{+Q#;2k<?bED0A1X19>?~}+Yd_SMLT=1(QmM0~BemmK-Y6>_LXF1gA_L)UKwSVQ gC2CXwb4%V~0M515f%B0+J$m!X$=awz`y)l!2dkk$7XSbN literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b620a9920d252f2e1351f1fd791ed1bc17909e0 GIT binary patch literal 10436 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d41d8cb8617658a5254b67a203b81b3e20bd067c GIT binary patch literal 7497 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py new file mode 100644 index 0000000..bcf41c0 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py @@ -0,0 +1,593 @@ +""" +This module uses ctypes to bind a whole bunch of functions and constants from +SecureTransport. The goal here is to provide the low-level API to +SecureTransport. These are essentially the C-level functions and constants, and +they're pretty gross to work with. + +This code is a bastardised version of the code found in Will Bond's oscrypto +library. An enormous debt is owed to him for blazing this trail for us. For +that reason, this code should be considered to be covered both by urllib3's +license and by oscrypto's: + + Copyright (c) 2015-2016 Will Bond <will@wbond.net> + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +""" +from __future__ import absolute_import + +import platform +from ctypes.util import find_library +from ctypes import ( + c_void_p, c_int32, c_char_p, c_size_t, c_byte, c_uint32, c_ulong, c_long, + c_bool +) +from ctypes import CDLL, POINTER, CFUNCTYPE + + +security_path = find_library('Security') +if not security_path: + raise ImportError('The library Security could not be found') + + +core_foundation_path = find_library('CoreFoundation') +if not core_foundation_path: + raise ImportError('The library CoreFoundation could not be found') + + +version = platform.mac_ver()[0] +version_info = tuple(map(int, version.split('.'))) +if version_info < (10, 8): + raise OSError( + 'Only OS X 10.8 and newer are supported, not %s.%s' % ( + version_info[0], version_info[1] + ) + ) + +Security = CDLL(security_path, use_errno=True) +CoreFoundation = CDLL(core_foundation_path, use_errno=True) + +Boolean = c_bool +CFIndex = c_long +CFStringEncoding = c_uint32 +CFData = c_void_p +CFString = c_void_p +CFArray = c_void_p +CFMutableArray = c_void_p +CFDictionary = c_void_p +CFError = c_void_p +CFType = c_void_p +CFTypeID = c_ulong + +CFTypeRef = POINTER(CFType) +CFAllocatorRef = c_void_p + +OSStatus = c_int32 + +CFDataRef = POINTER(CFData) +CFStringRef = POINTER(CFString) +CFArrayRef = POINTER(CFArray) +CFMutableArrayRef = POINTER(CFMutableArray) +CFDictionaryRef = POINTER(CFDictionary) +CFArrayCallBacks = c_void_p +CFDictionaryKeyCallBacks = c_void_p +CFDictionaryValueCallBacks = c_void_p + +SecCertificateRef = POINTER(c_void_p) +SecExternalFormat = c_uint32 +SecExternalItemType = c_uint32 +SecIdentityRef = POINTER(c_void_p) +SecItemImportExportFlags = c_uint32 +SecItemImportExportKeyParameters = c_void_p +SecKeychainRef = POINTER(c_void_p) +SSLProtocol = c_uint32 +SSLCipherSuite = c_uint32 +SSLContextRef = POINTER(c_void_p) +SecTrustRef = POINTER(c_void_p) +SSLConnectionRef = c_uint32 +SecTrustResultType = c_uint32 +SecTrustOptionFlags = c_uint32 +SSLProtocolSide = c_uint32 +SSLConnectionType = c_uint32 +SSLSessionOption = c_uint32 + + +try: + Security.SecItemImport.argtypes = [ + CFDataRef, + CFStringRef, + POINTER(SecExternalFormat), + POINTER(SecExternalItemType), + SecItemImportExportFlags, + POINTER(SecItemImportExportKeyParameters), + SecKeychainRef, + POINTER(CFArrayRef), + ] + Security.SecItemImport.restype = OSStatus + + Security.SecCertificateGetTypeID.argtypes = [] + Security.SecCertificateGetTypeID.restype = CFTypeID + + Security.SecIdentityGetTypeID.argtypes = [] + Security.SecIdentityGetTypeID.restype = CFTypeID + + Security.SecKeyGetTypeID.argtypes = [] + Security.SecKeyGetTypeID.restype = CFTypeID + + Security.SecCertificateCreateWithData.argtypes = [ + CFAllocatorRef, + CFDataRef + ] + Security.SecCertificateCreateWithData.restype = SecCertificateRef + + Security.SecCertificateCopyData.argtypes = [ + SecCertificateRef + ] + Security.SecCertificateCopyData.restype = CFDataRef + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SecIdentityCreateWithCertificate.argtypes = [ + CFTypeRef, + SecCertificateRef, + POINTER(SecIdentityRef) + ] + Security.SecIdentityCreateWithCertificate.restype = OSStatus + + Security.SecKeychainCreate.argtypes = [ + c_char_p, + c_uint32, + c_void_p, + Boolean, + c_void_p, + POINTER(SecKeychainRef) + ] + Security.SecKeychainCreate.restype = OSStatus + + Security.SecKeychainDelete.argtypes = [ + SecKeychainRef + ] + Security.SecKeychainDelete.restype = OSStatus + + Security.SecPKCS12Import.argtypes = [ + CFDataRef, + CFDictionaryRef, + POINTER(CFArrayRef) + ] + Security.SecPKCS12Import.restype = OSStatus + + SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t)) + SSLWriteFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t)) + + Security.SSLSetIOFuncs.argtypes = [ + SSLContextRef, + SSLReadFunc, + SSLWriteFunc + ] + Security.SSLSetIOFuncs.restype = OSStatus + + Security.SSLSetPeerID.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerID.restype = OSStatus + + Security.SSLSetCertificate.argtypes = [ + SSLContextRef, + CFArrayRef + ] + Security.SSLSetCertificate.restype = OSStatus + + Security.SSLSetCertificateAuthorities.argtypes = [ + SSLContextRef, + CFTypeRef, + Boolean + ] + Security.SSLSetCertificateAuthorities.restype = OSStatus + + Security.SSLSetConnection.argtypes = [ + SSLContextRef, + SSLConnectionRef + ] + Security.SSLSetConnection.restype = OSStatus + + Security.SSLSetPeerDomainName.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerDomainName.restype = OSStatus + + Security.SSLHandshake.argtypes = [ + SSLContextRef + ] + Security.SSLHandshake.restype = OSStatus + + Security.SSLRead.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLRead.restype = OSStatus + + Security.SSLWrite.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLWrite.restype = OSStatus + + Security.SSLClose.argtypes = [ + SSLContextRef + ] + Security.SSLClose.restype = OSStatus + + Security.SSLGetNumberSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberSupportedCiphers.restype = OSStatus + + Security.SSLGetSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetSupportedCiphers.restype = OSStatus + + Security.SSLSetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + c_size_t + ] + Security.SSLSetEnabledCiphers.restype = OSStatus + + Security.SSLGetNumberEnabledCiphers.argtype = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberEnabledCiphers.restype = OSStatus + + Security.SSLGetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetEnabledCiphers.restype = OSStatus + + Security.SSLGetNegotiatedCipher.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite) + ] + Security.SSLGetNegotiatedCipher.restype = OSStatus + + Security.SSLGetNegotiatedProtocolVersion.argtypes = [ + SSLContextRef, + POINTER(SSLProtocol) + ] + Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus + + Security.SSLCopyPeerTrust.argtypes = [ + SSLContextRef, + POINTER(SecTrustRef) + ] + Security.SSLCopyPeerTrust.restype = OSStatus + + Security.SecTrustSetAnchorCertificates.argtypes = [ + SecTrustRef, + CFArrayRef + ] + Security.SecTrustSetAnchorCertificates.restype = OSStatus + + Security.SecTrustSetAnchorCertificatesOnly.argstypes = [ + SecTrustRef, + Boolean + ] + Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus + + Security.SecTrustEvaluate.argtypes = [ + SecTrustRef, + POINTER(SecTrustResultType) + ] + Security.SecTrustEvaluate.restype = OSStatus + + Security.SecTrustGetCertificateCount.argtypes = [ + SecTrustRef + ] + Security.SecTrustGetCertificateCount.restype = CFIndex + + Security.SecTrustGetCertificateAtIndex.argtypes = [ + SecTrustRef, + CFIndex + ] + Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef + + Security.SSLCreateContext.argtypes = [ + CFAllocatorRef, + SSLProtocolSide, + SSLConnectionType + ] + Security.SSLCreateContext.restype = SSLContextRef + + Security.SSLSetSessionOption.argtypes = [ + SSLContextRef, + SSLSessionOption, + Boolean + ] + Security.SSLSetSessionOption.restype = OSStatus + + Security.SSLSetProtocolVersionMin.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMin.restype = OSStatus + + Security.SSLSetProtocolVersionMax.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMax.restype = OSStatus + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SSLReadFunc = SSLReadFunc + Security.SSLWriteFunc = SSLWriteFunc + Security.SSLContextRef = SSLContextRef + Security.SSLProtocol = SSLProtocol + Security.SSLCipherSuite = SSLCipherSuite + Security.SecIdentityRef = SecIdentityRef + Security.SecKeychainRef = SecKeychainRef + Security.SecTrustRef = SecTrustRef + Security.SecTrustResultType = SecTrustResultType + Security.SecExternalFormat = SecExternalFormat + Security.OSStatus = OSStatus + + Security.kSecImportExportPassphrase = CFStringRef.in_dll( + Security, 'kSecImportExportPassphrase' + ) + Security.kSecImportItemIdentity = CFStringRef.in_dll( + Security, 'kSecImportItemIdentity' + ) + + # CoreFoundation time! + CoreFoundation.CFRetain.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRetain.restype = CFTypeRef + + CoreFoundation.CFRelease.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRelease.restype = None + + CoreFoundation.CFGetTypeID.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFGetTypeID.restype = CFTypeID + + CoreFoundation.CFStringCreateWithCString.argtypes = [ + CFAllocatorRef, + c_char_p, + CFStringEncoding + ] + CoreFoundation.CFStringCreateWithCString.restype = CFStringRef + + CoreFoundation.CFStringGetCStringPtr.argtypes = [ + CFStringRef, + CFStringEncoding + ] + CoreFoundation.CFStringGetCStringPtr.restype = c_char_p + + CoreFoundation.CFStringGetCString.argtypes = [ + CFStringRef, + c_char_p, + CFIndex, + CFStringEncoding + ] + CoreFoundation.CFStringGetCString.restype = c_bool + + CoreFoundation.CFDataCreate.argtypes = [ + CFAllocatorRef, + c_char_p, + CFIndex + ] + CoreFoundation.CFDataCreate.restype = CFDataRef + + CoreFoundation.CFDataGetLength.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetLength.restype = CFIndex + + CoreFoundation.CFDataGetBytePtr.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetBytePtr.restype = c_void_p + + CoreFoundation.CFDictionaryCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + POINTER(CFTypeRef), + CFIndex, + CFDictionaryKeyCallBacks, + CFDictionaryValueCallBacks + ] + CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef + + CoreFoundation.CFDictionaryGetValue.argtypes = [ + CFDictionaryRef, + CFTypeRef + ] + CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef + + CoreFoundation.CFArrayCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + CFIndex, + CFArrayCallBacks, + ] + CoreFoundation.CFArrayCreate.restype = CFArrayRef + + CoreFoundation.CFArrayCreateMutable.argtypes = [ + CFAllocatorRef, + CFIndex, + CFArrayCallBacks + ] + CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef + + CoreFoundation.CFArrayAppendValue.argtypes = [ + CFMutableArrayRef, + c_void_p + ] + CoreFoundation.CFArrayAppendValue.restype = None + + CoreFoundation.CFArrayGetCount.argtypes = [ + CFArrayRef + ] + CoreFoundation.CFArrayGetCount.restype = CFIndex + + CoreFoundation.CFArrayGetValueAtIndex.argtypes = [ + CFArrayRef, + CFIndex + ] + CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p + + CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( + CoreFoundation, 'kCFAllocatorDefault' + ) + CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll(CoreFoundation, 'kCFTypeArrayCallBacks') + CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryKeyCallBacks' + ) + CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryValueCallBacks' + ) + + CoreFoundation.CFTypeRef = CFTypeRef + CoreFoundation.CFArrayRef = CFArrayRef + CoreFoundation.CFStringRef = CFStringRef + CoreFoundation.CFDictionaryRef = CFDictionaryRef + +except (AttributeError): + raise ImportError('Error initializing ctypes') + + +class CFConst(object): + """ + A class object that acts as essentially a namespace for CoreFoundation + constants. + """ + kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) + + +class SecurityConst(object): + """ + A class object that acts as essentially a namespace for Security constants. + """ + kSSLSessionOptionBreakOnServerAuth = 0 + + kSSLProtocol2 = 1 + kSSLProtocol3 = 2 + kTLSProtocol1 = 4 + kTLSProtocol11 = 7 + kTLSProtocol12 = 8 + + kSSLClientSide = 1 + kSSLStreamType = 0 + + kSecFormatPEMSequence = 10 + + kSecTrustResultInvalid = 0 + kSecTrustResultProceed = 1 + # This gap is present on purpose: this was kSecTrustResultConfirm, which + # is deprecated. + kSecTrustResultDeny = 3 + kSecTrustResultUnspecified = 4 + kSecTrustResultRecoverableTrustFailure = 5 + kSecTrustResultFatalTrustFailure = 6 + kSecTrustResultOtherError = 7 + + errSSLProtocol = -9800 + errSSLWouldBlock = -9803 + errSSLClosedGraceful = -9805 + errSSLClosedNoNotify = -9816 + errSSLClosedAbort = -9806 + + errSSLXCertChainInvalid = -9807 + errSSLCrypto = -9809 + errSSLInternal = -9810 + errSSLCertExpired = -9814 + errSSLCertNotYetValid = -9815 + errSSLUnknownRootCert = -9812 + errSSLNoRootCert = -9813 + errSSLHostNameMismatch = -9843 + errSSLPeerHandshakeFail = -9824 + errSSLPeerUserCancelled = -9839 + errSSLWeakPeerEphemeralDHKey = -9850 + errSSLServerAuthCompleted = -9841 + errSSLRecordOverflow = -9847 + + errSecVerifyFailed = -67808 + errSecNoTrustSettings = -25263 + errSecItemNotFound = -25300 + errSecInvalidTrustSettings = -25262 + + # Cipher suites. We only pick the ones our default cipher string allows. + TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C + TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030 + TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B + TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F + TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3 + TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F + TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2 + TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024 + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028 + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014 + TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B + TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A + TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039 + TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032 + TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D + TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C + TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D + TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C + TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035 + TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F + TLS_AES_128_GCM_SHA256 = 0x1301 + TLS_AES_256_GCM_SHA384 = 0x1302 + TLS_CHACHA20_POLY1305_SHA256 = 0x1303 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py new file mode 100644 index 0000000..b13cd9e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/appengine.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/appengine.py new file mode 100644 index 0000000..9b42952 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py new file mode 100644 index 0000000..8ea127c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py new file mode 100644 index 0000000..363667c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/securetransport.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/securetransport.py new file mode 100644 index 0000000..77cb59e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/socks.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/socks.py new file mode 100644 index 0000000..811e312 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/exceptions.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/exceptions.py new file mode 100644 index 0000000..7bbaa98 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/exceptions.py @@ -0,0 +1,246 @@ +from __future__ import absolute_import +from .packages.six.moves.http_client import ( + IncompleteRead as httplib_IncompleteRead +) +# Base Exceptions + + +class HTTPError(Exception): + "Base exception used by this module." + pass + + +class HTTPWarning(Warning): + "Base warning used by this module." + pass + + +class PoolError(HTTPError): + "Base exception for errors caused within a pool." + def __init__(self, pool, message): + self.pool = pool + HTTPError.__init__(self, "%s: %s" % (pool, message)) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, None) + + +class RequestError(PoolError): + "Base exception for PoolErrors that have associated URLs." + def __init__(self, pool, url, message): + self.url = url + PoolError.__init__(self, pool, message) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, self.url, None) + + +class SSLError(HTTPError): + "Raised when SSL certificate fails in an HTTPS connection." + pass + + +class ProxyError(HTTPError): + "Raised when the connection to a proxy fails." + pass + + +class DecodeError(HTTPError): + "Raised when automatic decoding based on Content-Type fails." + pass + + +class ProtocolError(HTTPError): + "Raised when something unexpected happens mid-request/response." + pass + + +#: Renamed to ProtocolError but aliased for backwards compatibility. +ConnectionError = ProtocolError + + +# Leaf Exceptions + +class MaxRetryError(RequestError): + """Raised when the maximum number of retries is exceeded. + + :param pool: The connection pool + :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` + :param string url: The requested Url + :param exceptions.Exception reason: The underlying error + + """ + + def __init__(self, pool, url, reason=None): + self.reason = reason + + message = "Max retries exceeded with url: %s (Caused by %r)" % ( + url, reason) + + RequestError.__init__(self, pool, url, message) + + +class HostChangedError(RequestError): + "Raised when an existing pool gets a request for a foreign host." + + def __init__(self, pool, url, retries=3): + message = "Tried to open a foreign host with url: %s" % url + RequestError.__init__(self, pool, url, message) + self.retries = retries + + +class TimeoutStateError(HTTPError): + """ Raised when passing an invalid state to a timeout """ + pass + + +class TimeoutError(HTTPError): + """ Raised when a socket timeout error occurs. + + Catching this error will catch both :exc:`ReadTimeoutErrors + <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`. + """ + pass + + +class ReadTimeoutError(TimeoutError, RequestError): + "Raised when a socket timeout occurs while receiving data from a server" + pass + + +# This timeout error does not have a URL attached and needs to inherit from the +# base HTTPError +class ConnectTimeoutError(TimeoutError): + "Raised when a socket timeout occurs while connecting to a server" + pass + + +class NewConnectionError(ConnectTimeoutError, PoolError): + "Raised when we fail to establish a new connection. Usually ECONNREFUSED." + pass + + +class EmptyPoolError(PoolError): + "Raised when a pool runs out of connections and no more are allowed." + pass + + +class ClosedPoolError(PoolError): + "Raised when a request enters a pool after the pool has been closed." + pass + + +class LocationValueError(ValueError, HTTPError): + "Raised when there is something wrong with a given URL input." + pass + + +class LocationParseError(LocationValueError): + "Raised when get_host or similar fails to parse the URL input." + + def __init__(self, location): + message = "Failed to parse: %s" % location + HTTPError.__init__(self, message) + + self.location = location + + +class ResponseError(HTTPError): + "Used as a container for an error reason supplied in a MaxRetryError." + GENERIC_ERROR = 'too many error responses' + SPECIFIC_ERROR = 'too many {status_code} error responses' + + +class SecurityWarning(HTTPWarning): + "Warned when 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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/fields.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/fields.py new file mode 100644 index 0000000..37fe64a --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/fields.py @@ -0,0 +1,178 @@ +from __future__ import absolute_import +import email.utils +import mimetypes + +from .packages import six + + +def guess_content_type(filename, default='application/octet-stream'): + """ + Guess the "Content-Type" of a file. + + :param filename: + The filename to guess the "Content-Type" of using :mod:`mimetypes`. + :param default: + If no "Content-Type" can be guessed, default to `default`. + """ + if filename: + return mimetypes.guess_type(filename)[0] or default + return default + + +def format_header_param(name, value): + """ + Helper function to format and quote a single header parameter. + + Particularly useful for header parameters which might contain + non-ASCII values, like file names. This follows RFC 2231, as + suggested by RFC 2388 Section 4.4. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + if not any(ch in value for ch in '"\\\r\n'): + result = '%s="%s"' % (name, value) + try: + result.encode('ascii') + except (UnicodeEncodeError, UnicodeDecodeError): + pass + else: + return result + if not six.PY3 and isinstance(value, six.text_type): # Python 2: + value = value.encode('utf-8') + value = email.utils.encode_rfc2231(value, 'utf-8') + value = '%s*=%s' % (name, value) + return value + + +class RequestField(object): + """ + A data container for request body parameters. + + :param name: + The name of this request field. + :param data: + The data/value body. + :param filename: + An optional filename of the request field. + :param headers: + An optional dict-like object of headers to initially use for the field. + """ + def __init__(self, name, data, filename=None, headers=None): + self._name = name + self._filename = filename + self.data = data + self.headers = {} + if headers: + self.headers = dict(headers) + + @classmethod + def from_tuples(cls, fieldname, value): + """ + A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. + + Supports constructing :class:`~urllib3.fields.RequestField` from + parameter of key/value strings AND key/filetuple. A filetuple is a + (filename, data, MIME type) tuple where the MIME type is optional. + For example:: + + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + + Field names and filenames must be unicode. + """ + if isinstance(value, tuple): + if len(value) == 3: + filename, data, content_type = value + else: + filename, data = value + content_type = guess_content_type(filename) + else: + filename = None + content_type = None + data = value + + request_param = cls(fieldname, data, filename=filename) + request_param.make_multipart(content_type=content_type) + + return request_param + + def _render_part(self, name, value): + """ + Overridable helper function to format a single header parameter. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + return format_header_param(name, value) + + def _render_parts(self, header_parts): + """ + Helper function to format and quote a single header. + + Useful for single headers that are composed of multiple items. E.g., + 'Content-Disposition' fields. + + :param header_parts: + A sequence of (k, v) 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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/filepost.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/filepost.py new file mode 100644 index 0000000..78f1e19 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/__init__.py new file mode 100644 index 0000000..170e974 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/__init__.py @@ -0,0 +1,5 @@ +from __future__ import absolute_import + +from . import ssl_match_hostname + +__all__ = ('ssl_match_hostname', ) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42c91c704e8e04cf8ae9b296d60476fd3670ab4d GIT binary patch literal 330 zcmX|6L2AP=5R~ks2_d1-7xd~wss^X@Qc7RYOM5bfMYiNbSh9p9yNO@ZYhTho_*w|$ z3q4hKp#!r!%r3i3x>_wxA75_@A@m*ik0_|8KzAJqLkvr#aE38r5sPJ{;w%pOBAc-3 z3rc3^u!R!bU((!Z*?0~@8EyR;|M^$WNl?@md)RB|YpS@Ngwb<?$DU041wh&O#&Q5V zeDBdX>1O~`N`Oyf=fNJ!Pe+UuE%ltV)RIz5#;qeoMZDaU`JrW7cMo?(eylcW*}bdc zHegqiS7L-&i`w~cbG=o(WA5Mvb0oC9X4;a*N-6S`7+O?x#~lF>weSEp=Gf04lxB_O Nk3%*$q*zAF=ojd|T-^Ww literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3fc96aa364501007d461f843c71627ad0915108 GIT binary patch literal 24502 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 Zm&*<1wy@?Su~Y)z#7Tl~!o3Om{{o<30E_?t literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..141d6fa6624033bb0bf16cc5a64ce0b97eb2a199 GIT binary patch literal 215 zcmYL@F$%&k7==@C5TOTgsK2EZ7ZFe3qN5PfCM}_98}g^M?d(BZJ&AX46+DEKsUSZ1 zJ|1s+k?+r5*ZYaMJV*WFxw3QM#EFvwnS1*iG2{H#`vTg?mRSKUGmzDa3xkjrU{#nU zUCU!!(^Z=EMHpqnxlETXc?Cz%QU|g^%ajV@QVbkB9LF!T6&0@yG)5_zM4(w(uv{P{ cuISoW1WIKkEu{<HKc<_q=8Y2D@f|wI2L?_)RR910 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45ed14cb4eb3b39b5ac91897e905b5a9acb1fed4 GIT binary patch literal 1309 zcmZuwPix~w6rYh~NtXYRZcDG7U1+Fb*V-jn0?SgmZW9QU?6S@_U<!()86}Ek$;^!H z*o=Fq_ta0&OQF|75Bn{;pJ9$I6!Han=%sy<V-skfn5XxC^XC1X*=x1DKY#x1+jljD z{y=vKbo2!*u?vi%0iu{186IHxo0%~(2PQ_;p*3p1#RH2PebjLmKY39Y561<UqB{zQ zEJ-uwefJ;oyxzu)$V*0E&E;j0lRa{NE{b@_<o59SIT<n7q$DXgnFvN^sk|g%4kyz5 z0#1k0n}xX)L>46GER>9d<Us<#ACR>(QbboQmR;`#N<k+btlfSU<@lw>Jhn>|s0FL6 z`b$`12O}hr!mF}ggPND-5JLz|Erk>OF<Rm80ativFKvp;|9D^7O|*2BBYMgfJ!yc2 zSy{NWwyZ0M4^*Av0|c_o6OfHkmZn0gzA~1cLKeERsC|G86j;ij&d}vQP;Y5~><$tC zQP!^PTg~9_lq-IPjOt}B%IhPD@E$zB2P;Q;@EI#}*~oVR*MPYdVgT|H<oA1-AE5OO zs$Bk;YV;9co@yvlS*o_OmQ96KGiazL%(t<4<`JOH@JNyT@5B;bjJ7lFKJ8YAxCwpL zc&2f**iG|kn5C4A3d+c*oP1W~*_`l)WcH9mB+Rm6#%M>Q8yEvR;U!<(pXAXbNf>98 z2nmxO2{M`pNg_s~G!Oaw<{zL=Q=5WG?R^tw6L!dX!FBtE5RA*T$Sa*2;BU|lHa9fj zED_pB3;p3&het2oe0>`9-W(krz7G1wgG1f!-G+UA_9{%l+g4{GWq0&5o=VVLr|eoD zzdYmNcnqpl7TIZOORy~A_sTBR*M-0Z)-KEAf|ioa%3OtZayHA-oM~qU{>mK(id~zm z>jWU2m0q<8g0|P*v?U?#FNl8vA^v{rk9j(U*Wgb>?k7bCnF>E1`Z9ZxMAuWgFAjpI zaWo%3*-I9)QT!O_BKJ@IaXNmK=0d_09_^3Vf{JTVg4GJ9ET;wcCp^p2XwM(RI}R_H z@VD>Y-*mM*p6d@b@V3`&NKW*Cq1ruc;HKf?Hf~}UTkw_K#U3DQ$-e!U=nm|)!Ma&l z?qD19`{1Qht1i|FP^YGyAfQDY1iT4b+Frl^YTT7^)tWnulveI@XyqhhpSz%ml0i75 HX(IeDD8zt0 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py new file mode 100644 index 0000000..740db37 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +""" +backports.makefile +~~~~~~~~~~~~~~~~~~ + +Backports the Python 3 ``socket.makefile`` method for use with anything that +wants to create a "fake" socket object. +""" +import io + +from socket import SocketIO + + +def backport_makefile(self, mode="r", buffering=None, encoding=None, + errors=None, newline=None): + """ + Backport of ``socket.makefile`` from Python 3.5. + """ + if not set(mode) <= {"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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/six.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/six.py new file mode 100644 index 0000000..190c023 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/six.py @@ -0,0 +1,868 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py new file mode 100644 index 0000000..d6594eb --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py @@ -0,0 +1,19 @@ +import sys + +try: + # Our match_hostname function is the same as 3.5's, so we only want to + # import the match_hostname function if it's at least that good. + if sys.version_info < (3, 5): + raise ImportError("Fallback to vendored code") + + from ssl import CertificateError, match_hostname +except ImportError: + try: + # Backport of the function from a pypi module + from backports.ssl_match_hostname import CertificateError, match_hostname + except ImportError: + # Our vendored copy + from ._implementation import CertificateError, match_hostname + +# Not needed, but documenting what we provide. +__all__ = ('CertificateError', 'match_hostname') diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6c3c419b7f6ef451c07f307a820fcc74e85be7d GIT binary patch literal 591 zcmZWlO^XyU5Ur$pc4uclRG5n}hdGEahuyf$iWd<<6uj(3L2ZQ4(@F2fPC8AJZMO$c z3f}w=UcLD*{11H<g!v1etn3KmVnRKNs+X5nHQ(PK{rdXj?RN_B6aG23Fn^5UKO+bb zL_-GMT?y}q*r~uxBo*l=@{wR~pc9j3sTpJg0<WMxO+nIX<USCHw;Nw^wytsR{N=Q3 zj@Uw#?G57%)bus1QH-*oATMCHyFxE;x=IjN1BB)6XSvpkyr`zZPFq<E>!g?#R>&Fc zZ$6POs8SVqkWZbnu0Jq&D9-u0^`Xv<ToKf8X@saYqYk$KF3MxRsqgfO?|i@4O6QfW zxvERs?>;w;bzv=>c&|4PvPrZQyZ#6p{Q9ri4X#Y1rIB^W1M2nLoZ}dre*?D{4Mh0; zg*8sKXq~mWW2Myse`iI-f<7)6m#sMQ5BU9J(N)Lua{1mA_wbz6>?LbdbEs+`Q1kG_ z$ffX?J{GTnueZc5oYrbFXAL^d&!lJn8)Y0PRe|%Prt60fjTIMKK8ic@V}v24$%qW; Lm>duqkxr67lLMir literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6680193e9e38a0c84a6dc2e6ebb1312be7de5a7c GIT binary patch literal 3318 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 H{MP>fG>w5J literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py new file mode 100644 index 0000000..970cf65 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/poolmanager.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/poolmanager.py new file mode 100644 index 0000000..fe5491c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/request.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/request.py new file mode 100644 index 0000000..8f2f44b --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/response.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/response.py new file mode 100644 index 0000000..c112690 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__init__.py new file mode 100644 index 0000000..2f2770b --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__init__.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import +# For backwards compatibility, provide imports that used to be here. +from .connection import is_connection_dropped +from .request import make_headers +from .response import is_fp_closed +from .ssl_ import ( + SSLContext, + HAS_SNI, + IS_PYOPENSSL, + IS_SECURETRANSPORT, + assert_fingerprint, + resolve_cert_reqs, + resolve_ssl_version, + ssl_wrap_socket, +) +from .timeout import ( + current_time, + Timeout, +) + +from .retry import Retry +from .url import ( + get_host, + parse_url, + split_first, + Url, +) +from .wait import ( + wait_for_read, + wait_for_write +) + +__all__ = ( + 'HAS_SNI', + 'IS_PYOPENSSL', + 'IS_SECURETRANSPORT', + 'SSLContext', + 'Retry', + 'Timeout', + 'Url', + 'assert_fingerprint', + 'current_time', + 'is_connection_dropped', + 'is_fp_closed', + 'get_host', + 'parse_url', + 'make_headers', + 'resolve_cert_reqs', + 'resolve_ssl_version', + 'split_first', + 'ssl_wrap_socket', + 'wait_for_read', + 'wait_for_write' +) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc89d1a7ab5659773d6cbc73ed53b4f99151a9b4 GIT binary patch literal 1134 zcmchW&2G~`5XbF&IdPmOO_P4nQs6`m#Z)bV142|)B`Tq`YT5%Uq?KcDTC2OZ*<B}X zpN0b$o`iSUD-u#)ffF;XpcN-h*z!*^v;O$+f5zLbmiy!Lw~xJwWqr5q9X*KO!lk|d zA}g}FC2V5bR#b}0yd=t`T*MV#5mizx;wrBRhd4!C<8{#>4dD`3G)Yr<#1k#j5_4ou zv`JfZNT;~Z;q#(Px?+JW6nUNZM4$AFxWO025?K<<WLd0`6|qWIi@M7nh&8e%*2y~L zkI2JlV`L2;-+)qUV4HR@Rw>Ulqp`?Rsc-DtdOub)Op}C#I!+TB$u!GY1P^#3xM1|0 z1rd`9bGUJm(U7MK*6YR{jo$C2iDsADIPZ2xbTm9L-oc0-eK<VYAHu5XLN?mpJ3Zb% zIo=(Pjt-AcOgB)9Nlhnla>isP<3yWz$w1qb(GXW8`=rdm?~+oSPC)^PGi^*}GRUY( z!waSdCF6y;lq}Iy$ATH>1eoR;<W`TFmREy{sh=@T&r_vMBMYQrG?&~oRmNi!A)#JA zl^kBxngv)&B`63YGxsN*$yhU42ft(k;UXNwJfef>Bbtad0tUyDHAEM&fT$uoL<@nl zB<B!|h$X;q(EA^s8EhDr(n+p!$taa2__A^DW}pyn9B4z%lrChOI<zB86X+an%2cos zw-)?mOJTv?CUJkp!QMbuZmmJPOjTlc3ja(Q8gkF3!WXpDRImeg?ih#CfOAT}TJj03 z7x+2#VTPuGX8tsg{v_o%u6}soYrZuZUrwVP^^(2_$5$6y+mq{=2%p1omiQ-r7H6Ar zqBOj7b4Rf2NL?x{78lH15~b1yZ9E=t`?-#}PidUMh|p)*m8riLX_RyJ2LB`V3gDGI T8_%b1r|Q|uwNA~l|K<DzKsp;6 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ad4f3f219545559210b598d8a94fdf6790d1206 GIT binary patch literal 3171 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e38a2683c0c0a16881989b6706cdaaf365037fd GIT binary patch literal 1045 zcmZuw&2H2%5Vqqan{KzIKwlz<ZdzKz1))kHaX}RbE<{LH8hfj3ou9RnrCsf9`ygC- z65hdAB%~g>a$?5YMFBd}jGg(C`Q{rt$2&X2A78$G`bi1-PI~6U{uJE2f*^>Xiljt% zf+<>hsYh||D^~icPl@!VfgZcJ!gTPOh(LrlM1<0xhAWmvg1#s5;1(*8vs({hOf56T z6)eH5lby^F+8Be)DY!X=AW2FENj*V@cSBMp{RtIJ_%}2S)--7-1|kA%Ahv*JXt&-J zllq-2i(F{9qQ3+;yAWD3r7N-|+!F*oqGvI)+j*^&%-f=_j17c@&NPl8_N;HDnpn!e z5<P^>FOxL7m}jj_=9x|=wGvXBB)?2rbu>A@nu`<jj6coKuP={|CyUQzeh79^B_EQe zXby_Xw3$)|C#75na|OkU#yOwMO4K^(v{J?SaniMgO5A|P&9x19Q5EerN^rX9;=v!K zV~6GU>cx(ibV;UUh35cT>76be0c4qym6Np&NMJ)gGsQyUs5WGKJu(O0&$fqbz%`{y zx}tDT?&j+`P8()T10rK@&FvShEdM3<dDFEId(^u<YJhUMtj=&ncgN~vI^xyel&q;6 zkc?XYXS$H>J^&k$eI|g;;>bpvS6L}Jw?od$T67BcBhF`Crq+laVeK6ZI5CaA>&F<d zsb0X@>Hq@f4R#dKh>cjpTsGd)A>?e-Wcg)wA&tg=A$_!Y9K$~|F6%h}crh(|`|*hl p+*MEac~^BticO0y>#FwnT|4f8qvvZWFK~Va^AR1<kr#Rq`wbe1<pcl# literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b55f2348607b87260f4a65dcc4daf651cf9d386f GIT binary patch literal 3226 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ebdc6dfb3a7ea48986640fb53306d88506b9bb5 GIT binary patch literal 1974 zcmZXV-EJc_6vyqENiv<L-K8rew4lX8fE0-)yXqoPgb>wIsR&Ujwyc&4?bI22l4(32 zYkSh9q&FLGc?WK}<1KiHxkW<iD{#fJCuy_nME)4tb8MgU`=9J>Z3X}Q{@2g<1BCuY zYmWo{ub?PXF~qPyDL%y*F^9RrN!?S=_C3)^o2O0aH(2vmblPGq=0oeV4HiJV!8V_w zPWu|HpboC?(1FTDsd<>BMK1NV*$2iqM_LzQBodx!c-=YVlyP}XrAo5lft0z7urUFT zY2StN1d58Gn)!2djuz-C@{q>kK)#1z5k^0u%z2JxO_+6V=01OIE`T|g;jw=+|9pL3 zd(2tjSD0bAgL|n10?(5XkH(5zjJO_gNhld66P}Sc5qwu9V@~qHIgd0+6p2KxIO_)X zyM93>P0eiIz8hO7BmU-xIwz6YqidHPU3PxV=s<7+<BV%A(<I|J+sDP)Mx93GC#v4H z+TPb%CIj%b^<ULojyrKt1<$A`>v8b53upQR$u{`%-$}2K$%Ja&n^4({a{*ycy=dIi z;!!-9PS|7hS@>x*n2jIp#g`Xp^bnq5);sAHNwJ$`N>d?rAE*41si`u9wuIm!mdjo# zg-8Z_y;3KlC%G!}O!00ptJ;YQV?%)PSj&X=K2*qeTpw@arsFuxx^)BF%59jvVWI&q z9u&*O1UeecfrWEt;iv~1B7E-Y#vCoM`Mts#m@phK+^f3p**=V1xpPOp04iDwq+ZOO z1-kOUmZyEa5rZ|D^I#2D@!XYC2Xj1kS>rbc7;%A-COrl`ZQS;i;!>}1A_N&(suda0 z2`2*%)TlCwxKeQ`#EbwS78gUt!Bk5c!S_6i@-l<4b4Iukf+DfZQv&c2a9}Ak$z%H| zC}p+761nd)uzHb8z%|dv@l21P*?XPG<(c}VmYgz}O}I?rS<PQx&kDY>+b3s6s1U;L z;mOJIcW`t%<Yz03k|v5PvJ7&UPa|IF1VY?>Q_r^|_~!Qb%L`HovVdEIbc`=9Kj6~> zBn2K=?Y`Xk6Ee&-`Q_nNw`wsS!y0u|Z4S8(3px`yWgSP}0UWBWGON8CGOB53vkDT( zEC6d3@v617T5Yafs@gb#i!Y@U=Q5?b@{BL47TBktEz4{Q0Z72Kt{Q`x=Bjd)meTMD zVr(s)YtJC>!k~Q1oTjxrot0c&ZJF`6sf8x2KZ85i^!G7L)oQrg#!cLI+E6^~fijxT zHufAJ%LlOLMhzyXx=^edK7@|Rk3c$}V{I6IXAT){3^{R*&)o$m!So@&{b{}Zzx-Bn z_Oj&4f<_H=R<%H}sv)N2@L>PzUCHgLI%bD7V**$(pT8^<i(pLli{c;~LjGD216PEc z80A@3^H9@f-$_3b;E(=m#Qm_`{LCKp+T618%<dhpYK1AJ<ebSJGwLQ8#H1_=E;~-; zuTEVxmy1lcTXX$A$Umz!q0VgxzJ(>qhYD>pae%?iCKN}VpbEk;E_Eq+7)s;q)187w zV~~RCs$|+t^9fhdBqVtcsw%iuf<?n7FB>y!aSa1|D$9cZMVhlx@Gs5(or1q-WWwHd J{rCNk{sU{xDLw!I literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6d61835a64c998b7026b7df1ed14fcaad125aa3 GIT binary patch literal 12660 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 C6b48D literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78ca08d00de86ef9a434b05a0484463369a9cfc3 GIT binary patch literal 9564 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 S?3>w1T&#a0e^#XDKl^W)5jf%i literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..530db2b5d79608c197f493da1ad6ae04ba594362 GIT binary patch literal 8775 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 YBb>Joi#$ybyH;I8KwPWUYp1LK0aWP|5&!@I literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cffb3738e566b89214f90713a993dbfdec9820ff GIT binary patch literal 5194 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6ac53e760e8b3517295d71084d697f551eb4f7a GIT binary patch literal 3155 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/connection.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/connection.py new file mode 100644 index 0000000..5ad70b2 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/queue.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/queue.py new file mode 100644 index 0000000..d3d379a --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/request.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/request.py new file mode 100644 index 0000000..3ddfcd5 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/request.py @@ -0,0 +1,118 @@ +from __future__ import absolute_import +from base64 import b64encode + +from ..packages.six import b, integer_types +from ..exceptions import UnrewindableBodyError + +ACCEPT_ENCODING = 'gzip,deflate' +_FAILEDTELL = object() + + +def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, + basic_auth=None, proxy_basic_auth=None, disable_cache=None): + """ + Shortcuts for generating request headers. + + :param keep_alive: + If ``True``, adds 'connection: keep-alive' header. + + :param accept_encoding: + Can be a boolean, list, or string. + ``True`` translates to 'gzip,deflate'. + List will get joined by comma. + String will be used as provided. + + :param user_agent: + String representing the user-agent you want, such as + "python-urllib3/0.6" + + :param basic_auth: + Colon-separated username:password string for 'authorization: basic ...' + auth header. + + :param proxy_basic_auth: + Colon-separated username:password string for 'proxy-authorization: basic ...' + auth header. + + :param disable_cache: + If ``True``, adds 'cache-control: no-cache' header. + + Example:: + + >>> make_headers(keep_alive=True, user_agent="Batman/1.0") + {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} + >>> make_headers(accept_encoding=True) + {'accept-encoding': 'gzip,deflate'} + """ + headers = {} + if accept_encoding: + if isinstance(accept_encoding, str): + pass + elif isinstance(accept_encoding, list): + accept_encoding = ','.join(accept_encoding) + else: + accept_encoding = ACCEPT_ENCODING + headers['accept-encoding'] = accept_encoding + + if user_agent: + headers['user-agent'] = user_agent + + if keep_alive: + headers['connection'] = 'keep-alive' + + if basic_auth: + headers['authorization'] = 'Basic ' + \ + b64encode(b(basic_auth)).decode('utf-8') + + if proxy_basic_auth: + headers['proxy-authorization'] = 'Basic ' + \ + b64encode(b(proxy_basic_auth)).decode('utf-8') + + if disable_cache: + headers['cache-control'] = 'no-cache' + + return headers + + +def set_file_position(body, pos): + """ + If a position is provided, move file to that point. + Otherwise, we'll attempt to record a position for future use. + """ + if pos is not None: + rewind_body(body, pos) + elif getattr(body, 'tell', None) is not None: + try: + pos = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body. + pos = _FAILEDTELL + + return pos + + +def rewind_body(body, body_pos): + """ + Attempt to rewind body to a certain position. + Primarily used for request redirects and retries. + + :param body: + File-like object that supports seek. + + :param int pos: + Position to seek to in file. + """ + body_seek = getattr(body, 'seek', None) + if body_seek is not None and isinstance(body_pos, integer_types): + try: + body_seek(body_pos) + except (IOError, OSError): + raise UnrewindableBodyError("An error occurred when rewinding request " + "body for redirect/retry.") + elif body_pos is _FAILEDTELL: + raise UnrewindableBodyError("Unable to record file position for rewinding " + "request body during a redirect/retry.") + else: + raise ValueError("body_pos must be of type integer, " + "instead it was %s." % type(body_pos)) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/response.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/response.py new file mode 100644 index 0000000..3d54864 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/retry.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/retry.py new file mode 100644 index 0000000..e7d0abd --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/ssl_.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/ssl_.py new file mode 100644 index 0000000..dfc553f --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/timeout.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/timeout.py new file mode 100644 index 0000000..cec817e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/timeout.py @@ -0,0 +1,242 @@ +from __future__ import absolute_import +# The default socket timeout, used by httplib to indicate that no timeout was +# specified by the user +from socket import _GLOBAL_DEFAULT_TIMEOUT +import time + +from ..exceptions import TimeoutStateError + +# A sentinel value to indicate that no timeout was specified by the user in +# urllib3 +_Default = object() + + +# Use time.monotonic if available. +current_time = getattr(time, "monotonic", time.time) + + +class Timeout(object): + """ Timeout configuration. + + Timeouts can be defined as a default for a pool:: + + timeout = Timeout(connect=2.0, read=7.0) + http = PoolManager(timeout=timeout) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) + + Timeouts can be disabled by setting all the parameters to ``None``:: + + no_timeout = Timeout(connect=None, read=None) + response = http.request('GET', 'http://example.com/, timeout=no_timeout) + + + :param total: + This combines the connect and read timeouts into one; the read timeout + will be set to the time leftover from the connect attempt. In the + event that both a connect timeout and a total are specified, or a read + timeout and a total are specified, the shorter timeout will be applied. + + Defaults to None. + + :type total: integer, float, or None + + :param connect: + The maximum amount of time to wait for a connection attempt to a server + to succeed. Omitting the parameter will default the connect timeout to + the system default, probably `the global default timeout in socket.py + <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. + None will set an infinite timeout for connection attempts. + + :type connect: integer, float, or None + + :param read: + The maximum amount of time to wait between consecutive + read operations for a response from the server. Omitting + the parameter will default the read timeout to the system + default, probably `the global default timeout in socket.py + <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. + None will set an infinite timeout. + + :type read: integer, float, or None + + .. note:: + + Many factors can affect the total amount of time for urllib3 to return + an HTTP response. + + For example, Python's DNS resolver does not obey the timeout specified + on the socket. Other factors that can affect total request time include + high CPU load, high swap, the program running at a low priority level, + or other behaviors. + + In addition, the read and total timeouts only measure the time between + read operations on the socket connecting the client and the server, + not the total amount of time for the request to return a complete + response. For most requests, the timeout is raised because the server + has not sent the first byte in the specified time. This is not always + the case; if a server streams one byte every fifteen seconds, a timeout + of 20 seconds will not trigger, even though the request will take + several minutes to complete. + + If your goal is to cut off any request after a set amount of wall clock + time, consider having a second "watcher" thread to cut off a slow + request. + """ + + #: A sentinel object representing the default timeout value + DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT + + def __init__(self, total=None, connect=_Default, read=_Default): + self._connect = self._validate_timeout(connect, 'connect') + self._read = self._validate_timeout(read, 'read') + self.total = self._validate_timeout(total, 'total') + self._start_connect = None + + def __str__(self): + return '%s(connect=%r, read=%r, total=%r)' % ( + type(self).__name__, self._connect, self._read, self.total) + + @classmethod + def _validate_timeout(cls, value, name): + """ Check that a timeout attribute is valid. + + :param value: The timeout value to validate + :param name: The name of the timeout attribute to validate. This is + used to specify in error messages. + :return: The validated and casted version of the given value. + :raises ValueError: If it is a numeric value less than or equal to + zero, or the type is not an integer, float, or None. + """ + if value is _Default: + return cls.DEFAULT_TIMEOUT + + if value is None or value is cls.DEFAULT_TIMEOUT: + return value + + if isinstance(value, bool): + raise ValueError("Timeout cannot be a boolean value. It must " + "be an int, float or None.") + try: + float(value) + except (TypeError, ValueError): + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + try: + if value <= 0: + raise ValueError("Attempted to set %s timeout to %s, but the " + "timeout cannot be set to a value less " + "than or equal to 0." % (name, value)) + except TypeError: # Python 3 + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + return value + + @classmethod + def from_float(cls, timeout): + """ Create a new Timeout from a legacy timeout value. + + The timeout value used by httplib.py sets the same timeout on the + connect(), and recv() socket requests. This creates a :class:`Timeout` + object that sets the individual timeouts to the ``timeout`` value + passed to this function. + + :param timeout: The legacy timeout value. + :type timeout: integer, float, sentinel default object, or None + :return: Timeout object + :rtype: :class:`Timeout` + """ + return Timeout(read=timeout, connect=timeout) + + def clone(self): + """ Create a copy of the timeout object + + Timeout properties are stored per-pool but each request needs a fresh + Timeout object to ensure each one has its own start/stop configured. + + :return: a copy of the timeout object + :rtype: :class:`Timeout` + """ + # We can't use copy.deepcopy because that will also create a new object + # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to + # detect the user default. + return Timeout(connect=self._connect, read=self._read, + total=self.total) + + def start_connect(self): + """ Start the timeout clock, used during a connect() attempt + + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to start a timer that has been started already. + """ + if self._start_connect is not None: + raise TimeoutStateError("Timeout timer has already been started.") + self._start_connect = current_time() + return self._start_connect + + def get_connect_duration(self): + """ Gets the time elapsed since the call to :meth:`start_connect`. + + :return: Elapsed time. + :rtype: float + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to get duration for a timer that hasn't been started. + """ + if self._start_connect is None: + raise TimeoutStateError("Can't get connect duration for timer " + "that has not started.") + return current_time() - self._start_connect + + @property + def connect_timeout(self): + """ Get the value to use when setting a connection timeout. + + This will be a positive float or integer, the value None + (never timeout), or the default system timeout. + + :return: Connect timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + """ + if self.total is None: + return self._connect + + if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: + return self.total + + return min(self._connect, self.total) + + @property + def read_timeout(self): + """ Get the value for the read timeout. + + This assumes some time has elapsed in the connection timeout and + computes the read timeout appropriately. + + If self.total is set, the read timeout is dependent on the amount of + time taken by the connect timeout. If the connection time has not been + established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be + raised. + + :return: Value to use for the read timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` + has not yet been called on this object. + """ + if (self.total is not None and + self.total is not self.DEFAULT_TIMEOUT and + self._read is not None and + self._read is not self.DEFAULT_TIMEOUT): + # In case the connect timeout has not yet been established. + if self._start_connect is None: + return self._read + return max(0, min(self.total - self.get_connect_duration(), + self._read)) + elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: + return max(0, self.total - self.get_connect_duration()) + else: + return self._read diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/url.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/url.py new file mode 100644 index 0000000..6b6f996 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/url.py @@ -0,0 +1,230 @@ +from __future__ import absolute_import +from collections import namedtuple + +from ..exceptions import LocationParseError + + +url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'] + +# We only want to normalize urls with an HTTP(S) scheme. +# urllib3 infers URLs without a scheme (None) to be http. +NORMALIZABLE_SCHEMES = ('http', 'https', None) + + +class Url(namedtuple('Url', url_attrs)): + """ + Datastructure for representing an HTTP URL. Used as a return value for + :func:`parse_url`. Both the scheme and host are normalized as they are + both case-insensitive according to RFC 3986. + """ + __slots__ = () + + def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, + query=None, fragment=None): + if path and not path.startswith('/'): + path = '/' + path + if scheme: + scheme = scheme.lower() + if host and scheme in NORMALIZABLE_SCHEMES: + host = host.lower() + return super(Url, cls).__new__(cls, scheme, auth, host, port, path, + query, fragment) + + @property + def hostname(self): + """For backwards-compatibility with urlparse. We're nice like that.""" + return self.host + + @property + def request_uri(self): + """Absolute path including the query string.""" + uri = self.path or '/' + + if self.query is not None: + uri += '?' + self.query + + return uri + + @property + def netloc(self): + """Network location including host and port""" + if self.port: + return '%s:%d' % (self.host, self.port) + return self.host + + @property + def url(self): + """ + Convert self into a url + + This function should more or less round-trip with :func:`.parse_url`. The + returned url may not be exactly the same as the url inputted to + :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls + with a blank port will have : removed). + + Example: :: + + >>> U = parse_url('http://google.com/mail/') + >>> U.url + 'http://google.com/mail/' + >>> Url('http', 'username:password', 'host.com', 80, + ... '/path', 'query', 'fragment').url + 'http://username:password@host.com:80/path?query#fragment' + """ + scheme, auth, host, port, path, query, fragment = self + url = '' + + # We use "is not None" we want things to happen with empty strings (or 0 port) + if scheme is not None: + url += scheme + '://' + if auth is not None: + url += auth + '@' + if host is not None: + url += host + if port is not None: + url += ':' + str(port) + if path is not None: + url += path + if query is not None: + url += '?' + query + if fragment is not None: + url += '#' + fragment + + return url + + def __str__(self): + return self.url + + +def split_first(s, delims): + """ + Given a string and an iterable of delimiters, split on the first found + delimiter. Return two split parts and the matched delimiter. + + If not found, then the first part is the full input string. + + Example:: + + >>> split_first('foo/bar?baz', '?/=') + ('foo', 'bar?baz', '/') + >>> split_first('foo/bar?baz', '123') + ('foo/bar?baz', '', None) + + Scales linearly with number of delims. Not ideal for large number of delims. + """ + min_idx = None + min_delim = None + for d in delims: + idx = s.find(d) + if idx < 0: + continue + + if min_idx is None or idx < min_idx: + min_idx = idx + min_delim = d + + if min_idx is None or min_idx < 0: + return s, '', None + + return s[:min_idx], s[min_idx + 1:], min_delim + + +def parse_url(url): + """ + Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is + performed to parse incomplete urls. Fields not provided will be None. + + Partly backwards-compatible with :mod:`urlparse`. + + Example:: + + >>> parse_url('http://google.com/mail/') + Url(scheme='http', host='google.com', port=None, path='/mail/', ...) + >>> parse_url('google.com:80') + Url(scheme=None, host='google.com', port=80, path=None, ...) + >>> parse_url('/foo?bar') + Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) + """ + + # While this code has overlap with stdlib's urlparse, it is much + # simplified for our needs and less annoying. + # Additionally, this implementations does silly things to be optimal + # on CPython. + + if not url: + # Empty + return Url() + + scheme = None + auth = None + host = None + port = None + path = None + fragment = None + query = None + + # Scheme + if '://' in url: + scheme, url = url.split('://', 1) + + # Find the earliest Authority Terminator + # (http://tools.ietf.org/html/rfc3986#section-3.2) + url, path_, delim = split_first(url, ['/', '?', '#']) + + if delim: + # Reassemble the path + path = delim + path_ + + # Auth + if '@' in url: + # Last '@' denotes end of auth part + auth, url = url.rsplit('@', 1) + + # IPv6 + if url and url[0] == '[': + host, url = url.split(']', 1) + host += ']' + + # Port + if ':' in url: + _host, port = url.split(':', 1) + + if not host: + host = _host + + if port: + # If given, ports must be integers. No whitespace, no plus or + # minus prefixes, no non-integer digits such as ^2 (superscript). + if not port.isdigit(): + raise LocationParseError(url) + try: + port = int(port) + except ValueError: + raise LocationParseError(url) + else: + # Blank ports are cool, too. (rfc3986#section-3.2.3) + port = None + + elif not host and url: + host = url + + if not path: + return Url(scheme, auth, host, port, path, query, fragment) + + # Fragment + if '#' in path: + path, fragment = path.split('#', 1) + + # Query + if '?' in path: + path, query = path.split('?', 1) + + return Url(scheme, auth, host, port, path, query, fragment) + + +def get_host(url): + """ + Deprecated. Use :func:`parse_url` instead. + """ + p = parse_url(url) + return p.scheme or 'http', p.hostname, p.port diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/wait.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/urllib3/util/wait.py new file mode 100644 index 0000000..4db71ba --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/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/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/__init__.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/__init__.py new file mode 100644 index 0000000..d21d697 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/__init__.py @@ -0,0 +1,342 @@ +# coding: utf-8 +""" + + webencodings + ~~~~~~~~~~~~ + + This is a Python implementation of the `WHATWG Encoding standard + <http://encoding.spec.whatwg.org/>`. See README for details. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +from __future__ import unicode_literals + +import codecs + +from .labels import LABELS + + +VERSION = '0.5.1' + + +# Some names in Encoding are not valid Python aliases. Remap these. +PYTHON_NAMES = { + 'iso-8859-8-i': 'iso-8859-8', + 'x-mac-cyrillic': 'mac-cyrillic', + 'macintosh': 'mac-roman', + 'windows-874': 'cp874'} + +CACHE = {} + + +def ascii_lower(string): + r"""Transform (only) ASCII letters to lower case: A-Z is mapped to a-z. + + :param string: An Unicode string. + :returns: A new Unicode string. + + This is used for `ASCII case-insensitive + <http://encoding.spec.whatwg.org/#ascii-case-insensitive>`_ + matching of encoding labels. + The same matching is also used, among other things, + for `CSS keywords <http://dev.w3.org/csswg/css-values/#keywords>`_. + + This is different from the :meth:`~py:str.lower` method of Unicode strings + which also affect non-ASCII characters, + sometimes mapping them into the ASCII range: + + >>> keyword = u'Bac\N{KELVIN SIGN}ground' + >>> assert keyword.lower() == u'background' + >>> assert ascii_lower(keyword) != keyword.lower() + >>> assert ascii_lower(keyword) == u'bac\N{KELVIN SIGN}ground' + + """ + # This turns out to be faster than unicode.translate() + return string.encode('utf8').lower().decode('utf8') + + +def lookup(label): + """ + Look for an encoding by its label. + This is the spec’s `get an encoding + <http://encoding.spec.whatwg.org/#concept-encoding-get>`_ algorithm. + Supported labels are listed there. + + :param label: A string. + :returns: + An :class:`Encoding` object, or :obj:`None` for an unknown label. + + """ + # Only strip ASCII whitespace: U+0009, U+000A, U+000C, U+000D, and U+0020. + label = ascii_lower(label.strip('\t\n\f\r ')) + name = LABELS.get(label) + if name is None: + return None + encoding = CACHE.get(name) + if encoding is None: + if name == 'x-user-defined': + from .x_user_defined import codec_info + else: + python_name = PYTHON_NAMES.get(name, name) + # Any python_name value that gets to here should be valid. + codec_info = codecs.lookup(python_name) + encoding = Encoding(name, codec_info) + CACHE[name] = encoding + return encoding + + +def _get_encoding(encoding_or_label): + """ + Accept either an encoding object or label. + + :param encoding: An :class:`Encoding` object or a label string. + :returns: An :class:`Encoding` object. + :raises: :exc:`~exceptions.LookupError` for an unknown label. + + """ + if hasattr(encoding_or_label, 'codec_info'): + return encoding_or_label + + encoding = lookup(encoding_or_label) + if encoding is None: + raise LookupError('Unknown encoding label: %r' % encoding_or_label) + return encoding + + +class Encoding(object): + """Reresents a character encoding such as UTF-8, + that can be used for decoding or encoding. + + .. attribute:: name + + Canonical name of the encoding + + .. attribute:: codec_info + + The actual implementation of the encoding, + a stdlib :class:`~codecs.CodecInfo` object. + See :func:`codecs.register`. + + """ + def __init__(self, name, codec_info): + self.name = name + self.codec_info = codec_info + + def __repr__(self): + return '<Encoding %s>' % self.name + + +#: The UTF-8 encoding. Should be used for new content and formats. +UTF8 = lookup('utf-8') + +_UTF16LE = lookup('utf-16le') +_UTF16BE = lookup('utf-16be') + + +def decode(input, fallback_encoding, errors='replace'): + """ + Decode a single string. + + :param input: A byte string + :param fallback_encoding: + An :class:`Encoding` object or a label string. + The encoding to use if :obj:`input` does note have a BOM. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :return: + A ``(output, encoding)`` tuple of an Unicode string + and an :obj:`Encoding`. + + """ + # Fail early if `encoding` is an invalid label. + fallback_encoding = _get_encoding(fallback_encoding) + bom_encoding, input = _detect_bom(input) + encoding = bom_encoding or fallback_encoding + return encoding.codec_info.decode(input, errors)[0], encoding + + +def _detect_bom(input): + """Return (bom_encoding, input), with any BOM removed from the input.""" + if input.startswith(b'\xFF\xFE'): + return _UTF16LE, input[2:] + if input.startswith(b'\xFE\xFF'): + return _UTF16BE, input[2:] + if input.startswith(b'\xEF\xBB\xBF'): + return UTF8, input[3:] + return None, input + + +def encode(input, encoding=UTF8, errors='strict'): + """ + Encode a single string. + + :param input: An Unicode string. + :param encoding: An :class:`Encoding` object or a label string. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :return: A byte string. + + """ + return _get_encoding(encoding).codec_info.encode(input, errors)[0] + + +def iter_decode(input, fallback_encoding, errors='replace'): + """ + "Pull"-based decoder. + + :param input: + An iterable of byte strings. + + The input is first consumed just enough to determine the encoding + based on the precense of a BOM, + then consumed on demand when the return value is. + :param fallback_encoding: + An :class:`Encoding` object or a label string. + The encoding to use if :obj:`input` does note have a BOM. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :returns: + An ``(output, encoding)`` tuple. + :obj:`output` is an iterable of Unicode strings, + :obj:`encoding` is the :obj:`Encoding` that is being used. + + """ + + decoder = IncrementalDecoder(fallback_encoding, errors) + generator = _iter_decode_generator(input, decoder) + encoding = next(generator) + return generator, encoding + + +def _iter_decode_generator(input, decoder): + """Return a generator that first yields the :obj:`Encoding`, + then yields output chukns as Unicode strings. + + """ + decode = decoder.decode + input = iter(input) + for chunck in input: + output = decode(chunck) + if output: + assert decoder.encoding is not None + yield decoder.encoding + yield output + break + else: + # Input exhausted without determining the encoding + output = decode(b'', final=True) + assert decoder.encoding is not None + yield decoder.encoding + if output: + yield output + return + + for chunck in input: + output = decode(chunck) + if output: + yield output + output = decode(b'', final=True) + if output: + yield output + + +def iter_encode(input, encoding=UTF8, errors='strict'): + """ + “Pull”-based encoder. + + :param input: An iterable of Unicode strings. + :param encoding: An :class:`Encoding` object or a label string. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :returns: An iterable of byte strings. + + """ + # Fail early if `encoding` is an invalid label. + encode = IncrementalEncoder(encoding, errors).encode + return _iter_encode_generator(input, encode) + + +def _iter_encode_generator(input, encode): + for chunck in input: + output = encode(chunck) + if output: + yield output + output = encode('', final=True) + if output: + yield output + + +class IncrementalDecoder(object): + """ + “Push”-based decoder. + + :param fallback_encoding: + An :class:`Encoding` object or a label string. + The encoding to use if :obj:`input` does note have a BOM. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + + """ + def __init__(self, fallback_encoding, errors='replace'): + # Fail early if `encoding` is an invalid label. + self._fallback_encoding = _get_encoding(fallback_encoding) + self._errors = errors + self._buffer = b'' + self._decoder = None + #: The actual :class:`Encoding` that is being used, + #: or :obj:`None` if that is not determined yet. + #: (Ie. if there is not enough input yet to determine + #: if there is a BOM.) + self.encoding = None # Not known yet. + + def decode(self, input, final=False): + """Decode one chunk of the input. + + :param input: A byte string. + :param final: + Indicate that no more input is available. + Must be :obj:`True` if this is the last call. + :returns: An Unicode string. + + """ + decoder = self._decoder + if decoder is not None: + return decoder(input, final) + + input = self._buffer + input + encoding, input = _detect_bom(input) + if encoding is None: + if len(input) < 3 and not final: # Not enough data yet. + self._buffer = input + return '' + else: # No BOM + encoding = self._fallback_encoding + decoder = encoding.codec_info.incrementaldecoder(self._errors).decode + self._decoder = decoder + self.encoding = encoding + return decoder(input, final) + + +class IncrementalEncoder(object): + """ + “Push”-based encoder. + + :param encoding: An :class:`Encoding` object or a label string. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + + .. method:: encode(input, final=False) + + :param input: An Unicode string. + :param final: + Indicate that no more input is available. + Must be :obj:`True` if this is the last call. + :returns: A byte string. + + """ + def __init__(self, encoding=UTF8, errors='strict'): + encoding = _get_encoding(encoding) + self.encode = encoding.codec_info.incrementalencoder(errors).encode diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9a4430bd22a91455463b7a284cdf4f1b44a4ff8 GIT binary patch literal 9682 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 Nl-c}3xw3HMe*xc)D{lY* literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e48a673e5c913c94560ec94282ab4505060cb092 GIT binary patch literal 4094 zcmeHKOK&4Z5O$ozcAVEfc*DZL!a`stp0~#lLa@soke0oK(+X)co^IP6k7ulDJ8|Z~ zFX6xyi8BZO0RLc-`ijJl;6!!zc%~=Wh%*xYl(?$9x~saYx~gpN?|1+D>G$vN-fuMi zY$%^Ufc_Hx=x-a125LNSpbdd0lGsF7v4yT;8(l>U)zL;bqk~?K9rQAE5yx%~dx&FS z-~d%PM7K)ZMt2I_MHOB_9IpzzhW-t&BaSz2z?+EUErGWY$2$V|&^`3-HN1y3^nQsC z5XXJMhc$eJuHylEfIdc_0FKb7KfZXrfj&EJ96ii`?RGWzT;L&2q7;#2OpoJmh+`_o zf4KgU3%(8K+Iod17if!ATTC#?v?QG2V<~qMrSr>-j3<i|?eUt_EW@<4;iYy;W@)0G zhI5h#btf^2a6<8k_UQEMhZ@CLd-~1eC(llwXrnaK5MG2Nrm%Isy<CiRpS8$v=6hb= zB{bE2-yP_dLfZ=MD7354>e{|C?&o{up1w}<-I6m6m9bUEQ5jcdyu39{iLYnH_mb_* z!iXe`luq*93zDGpg6e+X$@kWbX}Ly?Gi#hx<Lnw&-^H!Xc{Q$I<NW+!rGs611U`$w z8EkVroU-<KX!?e2<lRZGkB7Qtn-<#|lChh&@G{cR=JKePVOhYi9XcVSMQ}!_oS$aO zJTM*ZJkuNEH5Fs7cu8@lBRnDrMn^C5+slMNNMhXt2zRf&z6G4mHo@_1JDT&aPDEuS zWRQ>=Y!_IX#^Hh_YCIG)$#l~&^BoY8A;UTaDFuQekPczApij(!-)GI(VlBC=szMF3 zf)*+Ul?uC5AqC{Nc3!Elxe6at*o6vPRiQ?2L30%lisdPsQiT+dDjY?HvsU30DjasF zx~S6Soi(MrhT_F=osLuKbW5F5K<acAovzf`3bSxXqP!E*S*rI9zc?JfX%DLmVYe!q z)~j$d3*oftEkGE9d*qw<bX?<zw47UO^($*3ObS2CM=!1Q6l*={=flc^afb0U?-U03 ztb^lp5ezJ!ZHp<^5?{V@S49>P+PzA9ztk=Tr1rj|y)U)z(Pa|gWgz#Lq0H~e$LiHg z@G!#{tR=q{_4UMstE;g6${09EaTU^XX^gKJ;}?!QCv+Lciidon+%;rI){fILiAovq zK0Gz|LEhl5;uqq|vx^628f+cBKsIBqh|1bp`CO#DUCCd`x_o~r<5V(^`hW(iK{8n7 z0=HTq6Slkx(*=uai#*njD9_;;+k`K+#p!icXCk`?RdxrrmHC}*0+}@-G3C25y=Lhw zO!78LWy)7-iz)6(nr2p}nR$CbsP0)%d)D;<iUn&$^J`_o$U7@tju-Rw!eN&4W_}PR zlmsjL*wM{_2SFXuh>&8LC9<nIQ18){CD$A%5hraH{xy_@WR@`|1&WJRV$75Q-;7~b z5jJ4jlIp^ST3xbAlOX|%qt)x3UCu-H6!SIbtM$GxTx2rkK@3V`rGPYcpcp&g#ttAV z+``y;S#?Si)?TU4yX8Er7beyVu~*K+I}r2r(%diS`^7vw^mQme4EW{zwIZG$%BWjT zvydbtOdygcP-H3Qb#puv<y_`G*O#nsKw^^<Q2YZfk#`G1_l<0m2Qz=Y-0Prwdj);L zG~43CN|TUniviv#=#wdpXx@$zowINTDjEog)s-B%8&PN`=2JA9EzZJu$PFy}3lNi? zMiGp>)wtSrbR#Mn59m8sXGVi*n4FPZHX}L=W-YLWZBZbrS7e)Kd26NfLH@u&$uwj8 z@X~4IdWOmCe%Zuy*J;cd@CTn^c*F-&8bkpXg%<>}b$-Cw#YU_HgpjLr4`3ge-}!NF z?vh%vU%I(ldUn)g?I1vD6a=jG^s7fto}T{P$Raqe`1kjsH_ym<xWK*hFzb!d7~zce zqG@jto1@|C967WfxY6)(YTBdxVip<j87IB(dUG<@NkSK49P7>u=ZLN-9~6JVIflkH n>#08<dh*x6@%)l?KA)v%8RIW@!4Ucjv}Rka=Enc{Z`{B?VIgbn literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8390ccf00a1bec07dbab7fa0295820500af5081 GIT binary patch literal 1916 zcmcIlPj4GV6rY)0uQ%H?M4?m-&0*RS2}`Y=v;`z9M6^i`l|l}<Dj{mMT6@OMI_urd z%;b-a%>h>ej(h{Id<`yqhq)pl@fC97z1=#bqT<G^=FR^%zxUp6-afj1J^1sN-(N0Q z2>F9tDc7L?1ytPyA;<v{RIr2|(BUHVoP-UW1Ba5YNy=R!-J?KlP=a5vS}9k*At~D@ z!WEU*<iHc2s6tznzVMHjYRfrU6?0QMrErS1NG%xs76cs1nQY6nlZiO(>H6R(iP|#J z#maZ@D&?WCWKX7%ij3suP`<6B)W8RsI7wu^+~4eE`B25ZL(}A2vo3$Qw*HW}hrAUJ zvXr-?JWh*?n@QY}sg_Otw6%SoYbp8ev#p)I)(-DxiVJC?IMJZ`FYp)Ht5I7$QAw7A z9TaDvV9TIxLDe@vjN$8(DLG<#(a`Vdn1B=LUX9sGlATFq7oKP>m5H--N2yGKQcoKN zUip<M4-{OSHgXl8g2|23NHw}yBBaud&QZf8>)rPGsd%hE3qR?!hezv=x}&o}XAMd( zZ9H$}asD7qwTY7C!Q+7(34N|{vZ&#yOhu*|SL4u_#i5=L?R-=K3k#TNigrN|x=57| z?WM^M3~&Y8l1a2jC%`1(ye5Y9sbOO>rF~~g`mS)13)?WBFjEl~;k_nfhT|#yiHvFA z`+;<+sKUHIo2NKm6@I~?xxPP!y~w1!=zVba-Me?+L8$+xQ+eRaDCaW@@;B@;84@d2 zJdFnbGl>e|_xS$)KHtuGni(!dZ0-d2`18Y9^KP6-4sCQ|vO#3x4n%Rtf&LQdFOa`i zq7?+YPoD1Vw)p4#+u$-Z7#56G3q!LDq6chzwLPI@D#$X~Ca*r7urU*~=zlzM3^8=< zU@-bjuqibV9N{cu_=<6t{p=pE94{Wb5CGTC&D^K0S31zr6YHYyYL0c4%vHe^SVd0f zaD>&@tlt3(dYKwpf2IIl115li@ujE&+>2l%iM8ougM9M=+JFzjV~ozz(aOvf^^GJ0 z=jcu7%r@Ifq&snZ=?LUz!B153Aqa58(n~f$76QAb^aZ@!V<z4_PHLS*rZq>s2V2z= zig^@x{S|a`8;IdNSDO!ELF2o3$>{bwfX(*31qdyCga_|~06-s=fCK;%^hbC)2<#TQ z0Ws)0H_01_m_(h?0;bSa-CWfm?*|u@Lpo9)fTDk)#xymE&O@;1AMENTY<-NE7pSSF z6H97y*6r&o#ncoDt#ApW7zyhM3AtKY2Q*nvo*PIW){An;eF6?;F?h>5kPU4mkCf3W zfV0JQ0P7a^(OT=ze6tKAjgBQt9`o3WvqW7Q6rWlxc81{~iqkM0)enuyn~lbdDs`R9 zPW|jKGH1Pdrh1nPx{ly$fvtw2$U0%DZlfj-P$hA@wC38gL7pj7q*}XBuGE!0K9N9B ud@7f>BZ<Qh%z<2Nu0+1zKxxcI`LEf;|7c;1%Y4cpK`ziG$FKNzeEK&*!Sa{@ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07aaae45430988705aa96817ad46b9f7e5029cfe GIT binary patch literal 5072 zcma)AU5Ff66|SnTuKt~$OeT};Y&N!=xYC-Q$z+o_h8Q+Kvut4K6(=#$tTsJ;YbKSc z{_$3IGHH62CA0XmYE}>ye8~j#VMi8R7V*I#3yC29pfA2y4?ZXa8e~UU4B|uLcTU}| z?wLfii@LY&ch0##=bn4cx&7kMQ2N20U%&RFXEg0^+Q84i_e*%aZ=n!cNfWv-T)k$L z3|$j3VY;!JSu$(!QoLrBtXiU!s3l9uTB?+)rAz5rrj)5=OIh&7h4rRZ8WIVSL_I80 zB8_@PWJDJAs2CE%sCS7GF^YOj>=I+BcZ=O(9QC-^BPLMq5qlT3{J!=F>2wai>-M5u zuQr5JU-qVa+w(n!Uw`5kvY*K<Ry?PgBhH-Ha(p|t)R4J3)x}iEb+X!M-jL4n75`-J zT<<e?^vKN7+~SSgf>UeMa|@NGQ|GZxx=z)ud-loP*@g3mbDnMI<}aL^D=y4&-@^7Q zj_aZ8E;Oj+^<cDBcQ9qU>|%UbalNiigj8U;jmAo=8CdgY&d$v*1eUOgFR*xtc90?d zvI4_~qKsXrSEXIE>wd*O&q6X7#CU<W49rUxU!JYfp3=|6o5A}kUhf!+8^ayFV{~G- zbX~iw)yGY(qphUn^SVZl&=$0>Xg(~UqfKb*`c0jXyisiLI`4>Fz2WC%#qsRir@SdF zbNGzs+0u6!^*JdUGH(Vcd$npe2?>%*t$LNe%!*w00&C?u)tj0e!#w`&O*f@;t>W9$ z*D7*)so@G+dehaFY2Te$T3o#*j(MLeAFnRnSebcoseQdxJ%ZnIefr{b(`go*x(7YD zg=00lExc89<}~>&U$g6?A*TneW}2;Ls(B+As_=x%ya;ccl#)iF>4rXx$1)^gRf2jy z(&Rb39t@l{v#wv&g}!2VW4>`yhpvnWIi!$Sgq%=_86mGcfs_;yk9b^#SP}BNLK5rP zk(H!(OSO}#eOt9tERn|S-d9K_LhdOf8zFyE$WVklP{^?A_n~T!gzfL^UXl>DiqT>_ z-tw0Uv+ejLRb70!FdLWvfl--jCv!t-`bq^xYqphuBGD?$-n-LIURo%eSvYs$LOXli z!Jb|B3NuHKA8n@{uThwtJ^uN^43101cj_}G9G8n1iZks5w+l1e5wKsqU!2LuBw2Z2 z)+;qz4&jpxY@pap<O~@>*{v+vuJ;@O?*Ix-AKUhf>Z3*v8Pz2`W#1TR?iOA)hH)6f z>H}XpuYL6|Ynl&(=xFPPFnj~GzGPqn4*4;dhbag#*kDc&vN|u4kUGDn`*EQ!>m7X@ zM{wPE%~&(mV!qXZIW23D7c6i231RfP6zvqzzJBVm<|k>qHM3)qQDT#5<l96I5n+kM z_b@M@KjZ#V%pdQ>uVQB4Cqw=N^E0CO3AK0(>$0}`f}i%atC@9-gqcsQSy&~RX0~I2 z?;-O&yv)ucpDKO~9ch6k$>Yfwif$IgMYxOjl2fm^*sq8r_k)xll5yfC<?>dBn@IYW zNfd$UI-W06)TYxa$)N=?&-MfBTE%VIp4<l{p9tc-y@4g|rd<KG(ej%uKhVoTB6O)T zNQCZGvdB&w8DSfNUr}~)1l=k-N$Zoal(asskLo!+iSG$6Ct)x0)8O0YG-y3+Cl~SI z!#;di0Q7C@VJn8P+HaZ5<V1S3__me>N=!+?66l)`pIP*1kgdBP-ro!oP92JH#6QVd z-QUb7*^LF6c@8%0n?vnJI^Cho0Y#8=mV9EySR1PAP$Rr1+D?uACHc&(E<cO*w&l}# zWY(W6pNWYZB8FoEljFlNsr-r_Vmqj_ifW2DC>D6&8(Hp4J&GUOLFxHSQzSr1LI%E) zWxk<gQcM}_?T(_PBMQ7F%ltx7vJnM7k|{l(In0z1jMJ0(NXd*w6eR<%nN~DpJZj!b z3bYp#4Ox()_2te+v^`JIz82A_&w-hs&vrB(^+~jTpYKF8>T^5o1ER5kO%y+-WBP{N zi?S6%@z<O0d7**HJ!r~2iXdL`s*cm59lyVRZ?kWd9zl;DYu$E|JpRmyMVq0=kGfh9 zazp6R<8C;@M?Zc;@n~HhilmXxK>F+)10)*)^K)%0{K}g<T?bj{Q%yPy0--OM2a}gW zq2XvBz{`&j*87e9Ivy_N6nM7TH)(_IyNM6VmO}f6GaU1gGcjU9w{akco<L4Shy|Vm zcwUK+q(Vv&k^(~U+$Dr}CR1e9^TzNVb$LJ3-n6Yy-I2P&rfc_<j(y<lu$wm|`-A@x zGDC;Ch?RQb$?pY7I6iWak!HwTs6*DwEwo54Z)$4@Z*XaJUQMiH($^52a93E?BWy}x zmcmFUXBC!ISPIye6_ys6W%v{HNT{pOtQZ<VZz^<H$&Y~Z9fge!jPnzP;be;4%W%wU z2ku4qxENFT9`q3?JT4}1--(O8kg_7FfAyr)2v{*r<FG>aDfAge4=HrAKO69#ROqwY z&@U=9F81@N&xr&5Q6bfg=%0XYVj_oCe3D0bizsY2&lk5{3&@BU@Ol(HeQZ)k?`0tZ zDK6z9ochaWL5Hn`q4;XUsUy#iJ9UbzyOt0v7c143GFu6*X!0PqgH*rG@uVMA_6%Hb z%6_Aazz!*w=0OgF;!2zI_3{AY)G4=7#VzXe)BxC*=99qFl#}Q}PE$eNiM`Pk+jSeI zI9F`>S8R{g4wQ!^0w1G>Izdl!W+Z@E%Y65_+~l&t%$2PVf62`)?in$eyV|-NcJ<SH zcX=f8hRVNnHRgZJe2==^(8Aeu+rz7c7VcFAVIyI(1t+^#wl+2~<Gjwv5vt>~$Q{ZZ z4I_5{3b{f`Aor!|$=Dc@7kVb}P;H<N-~EgcZom^7y8HqpswCF?MTze}fWSPE(r}v6 zOCk4h++bY9V7Z9*D!Dv5Krtf<dB*tx3jSq4N)%hBq?9Cy&JjHvi~faBboflr$wPei zsq*lkivHeH>F}qZlSlpiHhKpAXEFW|(}zL-JJad@J5me{i$Y;&XJlP$XaB#uWm}+a zEXA;qJ2yEr)h=yuOwLg6obUcu-#oC@p@aS=WIVD5P2b0%ET@N$rOVSmqwOT;A0=on zp&|4&<ezJB$EZ!*OW+GA@#;`=)=RuTL(1@D9YS!UfqG6w>amL6DEc{iIGdS#_0I=? zH}adi{vY4{ZHsPLA-J{i!-HEJ-x=B3`1aQAyZ+Y3+grEa-P(AIExuAI8I{UTg*+M6 zDYoQ|UIs6EIlb6<3U>1;SS`~T!e1$ThJFB96~0V8d?s~y252!q5hTiG(WsWoLAqRC zYWXc`m&=m$6mB+YYv78)L6f}U&Lo=C4*COuFOGaG;M|xK2#%F}uy{Lo?17p0J!JA! gtsz>jeVV%SCQz70);Me?Q_0<UQppLt`;*!K0PcLVlK=n! literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..539157d4f64f771d2e32f26d2200902a1248b201 GIT binary patch literal 2669 zcmbtW>30-G5TDtdJ+m7^L=?|a@raTv2ww4uhC@8!5ziGJH!~fWFgv^U%!VYQput;I zyzs0-K?QF)ytqF42l)IlUwzN_{8ZolWc4hY1jP5`(fg{Vy1J*T=T}GX;$kuX=eA#0 z{nnvre`qsCj^#e4U?($2D{GGKBs{&EC?|9!C%t4jxk7UcC$&j)QX)BGOeV_)Ytl}J zH5t~VSd(H+*2%FZ$C@;2(yYllZLDb%2J14DMmfW}f>UH&G1g^Sm*usb(=LojZ6qJ_ zHjxr(krf$d*5*vP;B=IWyr*3hC-w3yCpoBf&7Sx@pEr4|6GOtcYmV!$4tmC{Mj)i+ zh+)?kPQ3oqe~+etn|#x));&=bepm_Jns3&I&2Wt{$GVlV?jy#`mY1I9YrS@@J}%wW zYr<Z$za^TNFI;rFIW%q#x>YtbSgE^ye2QMrwS^yuUi0R`r3=hJ2=n%p{mTXhmzl#g zX*wdTxL&}f|KcEMU3%2f@Lm2YVR>#SWW@^xY_-xFNf!E;0+X50$~p%w;bfeIliZ}2 zlN<;YF1>6xX$C77rTW>H9i@X%x^`%**VRx@gQ=e>XlE8`Bl>!MeIiUuDwOqsu4I%} z=dgpQ-Ck3X)k@upkq}XP3lS@<40(cg8iDYJqm=8{8)1|dQr2X!OOtJE`0w?lx^zb? zp(u@3WNEnOIYI^{du=K777Y)LjXFz$tE?;Rq4Bkg77tIXtJ({BtoBRymg;W3+x3I6 z;(6Ums$#+k#sZ~`$r=^DQ<J5cX;3;k4SMS1d>EA@;xzT031*r;QHUYwX)c@)A~MAW zrr}_4*mTq$KRFFsaL6ogld8OAUNHqjlNDHs(#`kIVELFMH5UfDbg5#~dZePPW%-q= zu&gL=S=E};@RVGztj8M_uel<N$_bbFOn0$k<x{G7pUM;{!`VbW8Eb5wObxZAk13eT zY$~%-Q<-IOTBM`SmA);TCF3oNp_R*zkKr6Pb0n*@kwloBOgj2Jjg2G*q|R$yMhvG+ zv)sffqqNCs^r943bHzIbzxYef<*hC7=KcFfM}o^pE@wBhm4{BnPEjmIYC0y<AgL3d z!xS6N>Qc>55~8JXikvJ&sz93%&0=XLL{bIySb$U(%x5|tKt~SLGnHz`0q8%oNM*(a zEyE0unjZy_iff<RpptGXhjbP6s4y5xQK>#4RbS)wa%@<R7ZFvqmneIxblIVrpQyuo zM1?!f|8#gdJ6JHop_)&$AAKQoWg<fr-E_%Co$hp1H2aD?O4meNMg?xei~$oLsWn>{ zBht{+H|mL`kxFN>xqMrp*gmUccIPQ`PMv$&>GRGw^Q^PaIoCYz{0rt^c+tg|bX|Jc zg6^IYUpkAITyf=9S6|b6?RD4RaAV(1H}@}HwtU4cD{sB+_B#gdyzB0J2JgM^{s$g> zsQmD%M;^5vs|?wEt*u_;j;!^ney#qv48q3fy0P(zC)Pjt)CPi$1Wyw@Loi9OiQrj+ z=LnuBc!A(Wf|m$hCU}KlGr_9_uMxaXu!Z0af;S1?B6yqN9fGX{?-IO6@IJu@1RoN7 zL;wUxu#Mnjf=>vx6YL=Pl;AUh&k1%C>>~Jr;7fw92)-uxhTvO*?+Csp*iEp9U@yTw zf*%NeB>0KoXM$e{_7fZ+I7o1a;4tAv!lwzJA)F-KMEES>bA-<mzCidQ;Y)-s6TU*Y znebJ@*9c!H+(P&U;hThS5x!0M4&he9cM0Dke4p?G!Vd{QA_PJt+(!5@;U|RK33m{F zO86P!=Y%^6cM*O;_$A?2gkKYWL-;M>cZA;)?k3zrxR-Dr;SYpA68=Q^GvP0U`w0&a z9wa<Oc(|)0%2<|Dvzx7cxDhraw|c2kquDK!N>Ys}F21-Rq)O5#7vE|teg0Q5brnQ; zbwSydtF)?hM8(!sKGbkMN2-oHqkBxX!YF%P^P0Iq6>@M9Gb2$*WK*5F&Qxb=jxi@~ T=m|Z|zeN1Y=8O&61}*gukAn~n literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/labels.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/labels.py new file mode 100644 index 0000000..29cbf91 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/labels.py @@ -0,0 +1,231 @@ +""" + + webencodings.labels + ~~~~~~~~~~~~~~~~~~~ + + Map encoding labels to their name. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +# XXX Do not edit! +# This file is automatically generated by mklabels.py + +LABELS = { + 'unicode-1-1-utf-8': 'utf-8', + 'utf-8': 'utf-8', + 'utf8': 'utf-8', + '866': 'ibm866', + 'cp866': 'ibm866', + 'csibm866': 'ibm866', + 'ibm866': 'ibm866', + 'csisolatin2': 'iso-8859-2', + 'iso-8859-2': 'iso-8859-2', + 'iso-ir-101': 'iso-8859-2', + 'iso8859-2': 'iso-8859-2', + 'iso88592': 'iso-8859-2', + 'iso_8859-2': 'iso-8859-2', + 'iso_8859-2:1987': 'iso-8859-2', + 'l2': 'iso-8859-2', + 'latin2': 'iso-8859-2', + 'csisolatin3': 'iso-8859-3', + 'iso-8859-3': 'iso-8859-3', + 'iso-ir-109': 'iso-8859-3', + 'iso8859-3': 'iso-8859-3', + 'iso88593': 'iso-8859-3', + 'iso_8859-3': 'iso-8859-3', + 'iso_8859-3:1988': 'iso-8859-3', + 'l3': 'iso-8859-3', + 'latin3': 'iso-8859-3', + 'csisolatin4': 'iso-8859-4', + 'iso-8859-4': 'iso-8859-4', + 'iso-ir-110': 'iso-8859-4', + 'iso8859-4': 'iso-8859-4', + 'iso88594': 'iso-8859-4', + 'iso_8859-4': 'iso-8859-4', + 'iso_8859-4:1988': 'iso-8859-4', + 'l4': 'iso-8859-4', + 'latin4': 'iso-8859-4', + 'csisolatincyrillic': 'iso-8859-5', + 'cyrillic': 'iso-8859-5', + 'iso-8859-5': 'iso-8859-5', + 'iso-ir-144': 'iso-8859-5', + 'iso8859-5': 'iso-8859-5', + 'iso88595': 'iso-8859-5', + 'iso_8859-5': 'iso-8859-5', + 'iso_8859-5:1988': 'iso-8859-5', + 'arabic': 'iso-8859-6', + 'asmo-708': 'iso-8859-6', + 'csiso88596e': 'iso-8859-6', + 'csiso88596i': 'iso-8859-6', + 'csisolatinarabic': 'iso-8859-6', + 'ecma-114': 'iso-8859-6', + 'iso-8859-6': 'iso-8859-6', + 'iso-8859-6-e': 'iso-8859-6', + 'iso-8859-6-i': 'iso-8859-6', + 'iso-ir-127': 'iso-8859-6', + 'iso8859-6': 'iso-8859-6', + 'iso88596': 'iso-8859-6', + 'iso_8859-6': 'iso-8859-6', + 'iso_8859-6:1987': 'iso-8859-6', + 'csisolatingreek': 'iso-8859-7', + 'ecma-118': 'iso-8859-7', + 'elot_928': 'iso-8859-7', + 'greek': 'iso-8859-7', + 'greek8': 'iso-8859-7', + 'iso-8859-7': 'iso-8859-7', + 'iso-ir-126': 'iso-8859-7', + 'iso8859-7': 'iso-8859-7', + 'iso88597': 'iso-8859-7', + 'iso_8859-7': 'iso-8859-7', + 'iso_8859-7:1987': 'iso-8859-7', + 'sun_eu_greek': 'iso-8859-7', + 'csiso88598e': 'iso-8859-8', + 'csisolatinhebrew': 'iso-8859-8', + 'hebrew': 'iso-8859-8', + 'iso-8859-8': 'iso-8859-8', + 'iso-8859-8-e': 'iso-8859-8', + 'iso-ir-138': 'iso-8859-8', + 'iso8859-8': 'iso-8859-8', + 'iso88598': 'iso-8859-8', + 'iso_8859-8': 'iso-8859-8', + 'iso_8859-8:1988': 'iso-8859-8', + 'visual': 'iso-8859-8', + 'csiso88598i': 'iso-8859-8-i', + 'iso-8859-8-i': 'iso-8859-8-i', + 'logical': 'iso-8859-8-i', + 'csisolatin6': 'iso-8859-10', + 'iso-8859-10': 'iso-8859-10', + 'iso-ir-157': 'iso-8859-10', + 'iso8859-10': 'iso-8859-10', + 'iso885910': 'iso-8859-10', + 'l6': 'iso-8859-10', + 'latin6': 'iso-8859-10', + 'iso-8859-13': 'iso-8859-13', + 'iso8859-13': 'iso-8859-13', + 'iso885913': 'iso-8859-13', + 'iso-8859-14': 'iso-8859-14', + 'iso8859-14': 'iso-8859-14', + 'iso885914': 'iso-8859-14', + 'csisolatin9': 'iso-8859-15', + 'iso-8859-15': 'iso-8859-15', + 'iso8859-15': 'iso-8859-15', + 'iso885915': 'iso-8859-15', + 'iso_8859-15': 'iso-8859-15', + 'l9': 'iso-8859-15', + 'iso-8859-16': 'iso-8859-16', + 'cskoi8r': 'koi8-r', + 'koi': 'koi8-r', + 'koi8': 'koi8-r', + 'koi8-r': 'koi8-r', + 'koi8_r': 'koi8-r', + 'koi8-u': 'koi8-u', + 'csmacintosh': 'macintosh', + 'mac': 'macintosh', + 'macintosh': 'macintosh', + 'x-mac-roman': 'macintosh', + 'dos-874': 'windows-874', + 'iso-8859-11': 'windows-874', + 'iso8859-11': 'windows-874', + 'iso885911': 'windows-874', + 'tis-620': 'windows-874', + 'windows-874': 'windows-874', + 'cp1250': 'windows-1250', + 'windows-1250': 'windows-1250', + 'x-cp1250': 'windows-1250', + 'cp1251': 'windows-1251', + 'windows-1251': 'windows-1251', + 'x-cp1251': 'windows-1251', + 'ansi_x3.4-1968': 'windows-1252', + 'ascii': 'windows-1252', + 'cp1252': 'windows-1252', + 'cp819': 'windows-1252', + 'csisolatin1': 'windows-1252', + 'ibm819': 'windows-1252', + 'iso-8859-1': 'windows-1252', + 'iso-ir-100': 'windows-1252', + 'iso8859-1': 'windows-1252', + 'iso88591': 'windows-1252', + 'iso_8859-1': 'windows-1252', + 'iso_8859-1:1987': 'windows-1252', + 'l1': 'windows-1252', + 'latin1': 'windows-1252', + 'us-ascii': 'windows-1252', + 'windows-1252': 'windows-1252', + 'x-cp1252': 'windows-1252', + 'cp1253': 'windows-1253', + 'windows-1253': 'windows-1253', + 'x-cp1253': 'windows-1253', + 'cp1254': 'windows-1254', + 'csisolatin5': 'windows-1254', + 'iso-8859-9': 'windows-1254', + 'iso-ir-148': 'windows-1254', + 'iso8859-9': 'windows-1254', + 'iso88599': 'windows-1254', + 'iso_8859-9': 'windows-1254', + 'iso_8859-9:1989': 'windows-1254', + 'l5': 'windows-1254', + 'latin5': 'windows-1254', + 'windows-1254': 'windows-1254', + 'x-cp1254': 'windows-1254', + 'cp1255': 'windows-1255', + 'windows-1255': 'windows-1255', + 'x-cp1255': 'windows-1255', + 'cp1256': 'windows-1256', + 'windows-1256': 'windows-1256', + 'x-cp1256': 'windows-1256', + 'cp1257': 'windows-1257', + 'windows-1257': 'windows-1257', + 'x-cp1257': 'windows-1257', + 'cp1258': 'windows-1258', + 'windows-1258': 'windows-1258', + 'x-cp1258': 'windows-1258', + 'x-mac-cyrillic': 'x-mac-cyrillic', + 'x-mac-ukrainian': 'x-mac-cyrillic', + 'chinese': 'gbk', + 'csgb2312': 'gbk', + 'csiso58gb231280': 'gbk', + 'gb2312': 'gbk', + 'gb_2312': 'gbk', + 'gb_2312-80': 'gbk', + 'gbk': 'gbk', + 'iso-ir-58': 'gbk', + 'x-gbk': 'gbk', + 'gb18030': 'gb18030', + 'hz-gb-2312': 'hz-gb-2312', + 'big5': 'big5', + 'big5-hkscs': 'big5', + 'cn-big5': 'big5', + 'csbig5': 'big5', + 'x-x-big5': 'big5', + 'cseucpkdfmtjapanese': 'euc-jp', + 'euc-jp': 'euc-jp', + 'x-euc-jp': 'euc-jp', + 'csiso2022jp': 'iso-2022-jp', + 'iso-2022-jp': 'iso-2022-jp', + 'csshiftjis': 'shift_jis', + 'ms_kanji': 'shift_jis', + 'shift-jis': 'shift_jis', + 'shift_jis': 'shift_jis', + 'sjis': 'shift_jis', + 'windows-31j': 'shift_jis', + 'x-sjis': 'shift_jis', + 'cseuckr': 'euc-kr', + 'csksc56011987': 'euc-kr', + 'euc-kr': 'euc-kr', + 'iso-ir-149': 'euc-kr', + 'korean': 'euc-kr', + 'ks_c_5601-1987': 'euc-kr', + 'ks_c_5601-1989': 'euc-kr', + 'ksc5601': 'euc-kr', + 'ksc_5601': 'euc-kr', + 'windows-949': 'euc-kr', + 'csiso2022kr': 'iso-2022-kr', + 'iso-2022-kr': 'iso-2022-kr', + 'utf-16be': 'utf-16be', + 'utf-16': 'utf-16le', + 'utf-16le': 'utf-16le', + 'x-user-defined': 'x-user-defined', +} diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/mklabels.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/mklabels.py new file mode 100644 index 0000000..295dc92 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/mklabels.py @@ -0,0 +1,59 @@ +""" + + webencodings.mklabels + ~~~~~~~~~~~~~~~~~~~~~ + + Regenarate the webencodings.labels module. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +import json +try: + from urllib import urlopen +except ImportError: + from urllib.request import urlopen + + +def assert_lower(string): + assert string == string.lower() + return string + + +def generate(url): + parts = ['''\ +""" + + webencodings.labels + ~~~~~~~~~~~~~~~~~~~ + + Map encoding labels to their name. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +# XXX Do not edit! +# This file is automatically generated by mklabels.py + +LABELS = { +'''] + labels = [ + (repr(assert_lower(label)).lstrip('u'), + repr(encoding['name']).lstrip('u')) + for category in json.loads(urlopen(url).read().decode('ascii')) + for encoding in category['encodings'] + for label in encoding['labels']] + max_len = max(len(label) for label, name in labels) + parts.extend( + ' %s:%s %s,\n' % (label, ' ' * (max_len - len(label)), name) + for label, name in labels) + parts.append('}') + return ''.join(parts) + + +if __name__ == '__main__': + print(generate('http://encoding.spec.whatwg.org/encodings.json')) diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/tests.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/tests.py new file mode 100644 index 0000000..e12c10d --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/tests.py @@ -0,0 +1,153 @@ +# coding: utf-8 +""" + + webencodings.tests + ~~~~~~~~~~~~~~~~~~ + + A basic test suite for Encoding. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +from __future__ import unicode_literals + +from . import (lookup, LABELS, decode, encode, iter_decode, iter_encode, + IncrementalDecoder, IncrementalEncoder, UTF8) + + +def assert_raises(exception, function, *args, **kwargs): + try: + function(*args, **kwargs) + except exception: + return + else: # pragma: no cover + raise AssertionError('Did not raise %s.' % exception) + + +def test_labels(): + assert lookup('utf-8').name == 'utf-8' + assert lookup('Utf-8').name == 'utf-8' + assert lookup('UTF-8').name == 'utf-8' + assert lookup('utf8').name == 'utf-8' + assert lookup('utf8').name == 'utf-8' + assert lookup('utf8 ').name == 'utf-8' + assert lookup(' \r\nutf8\t').name == 'utf-8' + assert lookup('u8') is None # Python label. + assert lookup('utf-8 ') is None # Non-ASCII white space. + + assert lookup('US-ASCII').name == 'windows-1252' + assert lookup('iso-8859-1').name == 'windows-1252' + assert lookup('latin1').name == 'windows-1252' + assert lookup('LATIN1').name == 'windows-1252' + assert lookup('latin-1') is None + assert lookup('LATİN1') is None # ASCII-only case insensitivity. + + +def test_all_labels(): + for label in LABELS: + assert decode(b'', label) == ('', lookup(label)) + assert encode('', label) == b'' + for repeat in [0, 1, 12]: + output, _ = iter_decode([b''] * repeat, label) + assert list(output) == [] + assert list(iter_encode([''] * repeat, label)) == [] + decoder = IncrementalDecoder(label) + assert decoder.decode(b'') == '' + assert decoder.decode(b'', final=True) == '' + encoder = IncrementalEncoder(label) + assert encoder.encode('') == b'' + assert encoder.encode('', final=True) == b'' + # All encoding names are valid labels too: + for name in set(LABELS.values()): + assert lookup(name).name == name + + +def test_invalid_label(): + assert_raises(LookupError, decode, b'\xEF\xBB\xBF\xc3\xa9', 'invalid') + assert_raises(LookupError, encode, 'é', 'invalid') + assert_raises(LookupError, iter_decode, [], 'invalid') + assert_raises(LookupError, iter_encode, [], 'invalid') + assert_raises(LookupError, IncrementalDecoder, 'invalid') + assert_raises(LookupError, IncrementalEncoder, 'invalid') + + +def test_decode(): + assert decode(b'\x80', 'latin1') == ('€', lookup('latin1')) + assert decode(b'\x80', lookup('latin1')) == ('€', lookup('latin1')) + assert decode(b'\xc3\xa9', 'utf8') == ('é', lookup('utf8')) + assert decode(b'\xc3\xa9', UTF8) == ('é', lookup('utf8')) + assert decode(b'\xc3\xa9', 'ascii') == ('é', lookup('ascii')) + assert decode(b'\xEF\xBB\xBF\xc3\xa9', 'ascii') == ('é', lookup('utf8')) # UTF-8 with BOM + + assert decode(b'\xFE\xFF\x00\xe9', 'ascii') == ('é', lookup('utf-16be')) # UTF-16-BE with BOM + assert decode(b'\xFF\xFE\xe9\x00', 'ascii') == ('é', lookup('utf-16le')) # UTF-16-LE with BOM + assert decode(b'\xFE\xFF\xe9\x00', 'ascii') == ('\ue900', lookup('utf-16be')) + assert decode(b'\xFF\xFE\x00\xe9', 'ascii') == ('\ue900', lookup('utf-16le')) + + assert decode(b'\x00\xe9', 'UTF-16BE') == ('é', lookup('utf-16be')) + assert decode(b'\xe9\x00', 'UTF-16LE') == ('é', lookup('utf-16le')) + assert decode(b'\xe9\x00', 'UTF-16') == ('é', lookup('utf-16le')) + + assert decode(b'\xe9\x00', 'UTF-16BE') == ('\ue900', lookup('utf-16be')) + assert decode(b'\x00\xe9', 'UTF-16LE') == ('\ue900', lookup('utf-16le')) + assert decode(b'\x00\xe9', 'UTF-16') == ('\ue900', lookup('utf-16le')) + + +def test_encode(): + assert encode('é', 'latin1') == b'\xe9' + assert encode('é', 'utf8') == b'\xc3\xa9' + assert encode('é', 'utf8') == b'\xc3\xa9' + assert encode('é', 'utf-16') == b'\xe9\x00' + assert encode('é', 'utf-16le') == b'\xe9\x00' + assert encode('é', 'utf-16be') == b'\x00\xe9' + + +def test_iter_decode(): + def iter_decode_to_string(input, fallback_encoding): + output, _encoding = iter_decode(input, fallback_encoding) + return ''.join(output) + assert iter_decode_to_string([], 'latin1') == '' + assert iter_decode_to_string([b''], 'latin1') == '' + assert iter_decode_to_string([b'\xe9'], 'latin1') == 'é' + assert iter_decode_to_string([b'hello'], 'latin1') == 'hello' + assert iter_decode_to_string([b'he', b'llo'], 'latin1') == 'hello' + assert iter_decode_to_string([b'hell', b'o'], 'latin1') == 'hello' + assert iter_decode_to_string([b'\xc3\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([b'\xEF\xBB\xBF\xc3\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'\xEF\xBB\xBF', b'\xc3', b'\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'\xEF\xBB\xBF', b'a', b'\xc3'], 'latin1') == 'a\uFFFD' + assert iter_decode_to_string([ + b'', b'\xEF', b'', b'', b'\xBB\xBF\xc3', b'\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([b'\xEF\xBB\xBF'], 'latin1') == '' + assert iter_decode_to_string([b'\xEF\xBB'], 'latin1') == 'ï»' + assert iter_decode_to_string([b'\xFE\xFF\x00\xe9'], 'latin1') == 'é' + assert iter_decode_to_string([b'\xFF\xFE\xe9\x00'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'', b'\xFF', b'', b'', b'\xFE\xe9', b'\x00'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'', b'h\xe9', b'llo'], 'x-user-defined') == 'h\uF7E9llo' + + +def test_iter_encode(): + assert b''.join(iter_encode([], 'latin1')) == b'' + assert b''.join(iter_encode([''], 'latin1')) == b'' + assert b''.join(iter_encode(['é'], 'latin1')) == b'\xe9' + assert b''.join(iter_encode(['', 'é', '', ''], 'latin1')) == b'\xe9' + assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16')) == b'\xe9\x00' + assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16le')) == b'\xe9\x00' + assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16be')) == b'\x00\xe9' + assert b''.join(iter_encode([ + '', 'h\uF7E9', '', 'llo'], 'x-user-defined')) == b'h\xe9llo' + + +def test_x_user_defined(): + encoded = b'2,\x0c\x0b\x1aO\xd9#\xcb\x0f\xc9\xbbt\xcf\xa8\xca' + decoded = '2,\x0c\x0b\x1aO\uf7d9#\uf7cb\x0f\uf7c9\uf7bbt\uf7cf\uf7a8\uf7ca' + encoded = b'aa' + decoded = 'aa' + assert decode(encoded, 'x-user-defined') == (decoded, lookup('x-user-defined')) + assert encode(decoded, 'x-user-defined') == encoded diff --git a/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/x_user_defined.py b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/x_user_defined.py new file mode 100644 index 0000000..d16e326 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pip/_vendor/webencodings/x_user_defined.py @@ -0,0 +1,325 @@ +# coding: utf-8 +""" + + webencodings.x_user_defined + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + An implementation of the x-user-defined encoding. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +from __future__ import unicode_literals + +import codecs + + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self, input, errors='strict'): + return codecs.charmap_encode(input, errors, encoding_table) + + def decode(self, input, errors='strict'): + return codecs.charmap_decode(input, errors, decoding_table) + + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input, self.errors, encoding_table)[0] + + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input, self.errors, decoding_table)[0] + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + + +class StreamReader(Codec, codecs.StreamReader): + pass + + +### encodings module API + +codec_info = codecs.CodecInfo( + name='x-user-defined', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, +) + + +### Decoding Table + +# Python 3: +# for c in range(256): print(' %r' % chr(c if c < 128 else c + 0xF700)) +decoding_table = ( + '\x00' + '\x01' + '\x02' + '\x03' + '\x04' + '\x05' + '\x06' + '\x07' + '\x08' + '\t' + '\n' + '\x0b' + '\x0c' + '\r' + '\x0e' + '\x0f' + '\x10' + '\x11' + '\x12' + '\x13' + '\x14' + '\x15' + '\x16' + '\x17' + '\x18' + '\x19' + '\x1a' + '\x1b' + '\x1c' + '\x1d' + '\x1e' + '\x1f' + ' ' + '!' + '"' + '#' + '$' + '%' + '&' + "'" + '(' + ')' + '*' + '+' + ',' + '-' + '.' + '/' + '0' + '1' + '2' + '3' + '4' + '5' + '6' + '7' + '8' + '9' + ':' + ';' + '<' + '=' + '>' + '?' + '@' + 'A' + 'B' + 'C' + 'D' + 'E' + 'F' + 'G' + 'H' + 'I' + 'J' + 'K' + 'L' + 'M' + 'N' + 'O' + 'P' + 'Q' + 'R' + 'S' + 'T' + 'U' + 'V' + 'W' + 'X' + 'Y' + 'Z' + '[' + '\\' + ']' + '^' + '_' + '`' + 'a' + 'b' + 'c' + 'd' + 'e' + 'f' + 'g' + 'h' + 'i' + 'j' + 'k' + 'l' + 'm' + 'n' + 'o' + 'p' + 'q' + 'r' + 's' + 't' + 'u' + 'v' + 'w' + 'x' + 'y' + 'z' + '{' + '|' + '}' + '~' + '\x7f' + '\uf780' + '\uf781' + '\uf782' + '\uf783' + '\uf784' + '\uf785' + '\uf786' + '\uf787' + '\uf788' + '\uf789' + '\uf78a' + '\uf78b' + '\uf78c' + '\uf78d' + '\uf78e' + '\uf78f' + '\uf790' + '\uf791' + '\uf792' + '\uf793' + '\uf794' + '\uf795' + '\uf796' + '\uf797' + '\uf798' + '\uf799' + '\uf79a' + '\uf79b' + '\uf79c' + '\uf79d' + '\uf79e' + '\uf79f' + '\uf7a0' + '\uf7a1' + '\uf7a2' + '\uf7a3' + '\uf7a4' + '\uf7a5' + '\uf7a6' + '\uf7a7' + '\uf7a8' + '\uf7a9' + '\uf7aa' + '\uf7ab' + '\uf7ac' + '\uf7ad' + '\uf7ae' + '\uf7af' + '\uf7b0' + '\uf7b1' + '\uf7b2' + '\uf7b3' + '\uf7b4' + '\uf7b5' + '\uf7b6' + '\uf7b7' + '\uf7b8' + '\uf7b9' + '\uf7ba' + '\uf7bb' + '\uf7bc' + '\uf7bd' + '\uf7be' + '\uf7bf' + '\uf7c0' + '\uf7c1' + '\uf7c2' + '\uf7c3' + '\uf7c4' + '\uf7c5' + '\uf7c6' + '\uf7c7' + '\uf7c8' + '\uf7c9' + '\uf7ca' + '\uf7cb' + '\uf7cc' + '\uf7cd' + '\uf7ce' + '\uf7cf' + '\uf7d0' + '\uf7d1' + '\uf7d2' + '\uf7d3' + '\uf7d4' + '\uf7d5' + '\uf7d6' + '\uf7d7' + '\uf7d8' + '\uf7d9' + '\uf7da' + '\uf7db' + '\uf7dc' + '\uf7dd' + '\uf7de' + '\uf7df' + '\uf7e0' + '\uf7e1' + '\uf7e2' + '\uf7e3' + '\uf7e4' + '\uf7e5' + '\uf7e6' + '\uf7e7' + '\uf7e8' + '\uf7e9' + '\uf7ea' + '\uf7eb' + '\uf7ec' + '\uf7ed' + '\uf7ee' + '\uf7ef' + '\uf7f0' + '\uf7f1' + '\uf7f2' + '\uf7f3' + '\uf7f4' + '\uf7f5' + '\uf7f6' + '\uf7f7' + '\uf7f8' + '\uf7f9' + '\uf7fa' + '\uf7fb' + '\uf7fc' + '\uf7fd' + '\uf7fe' + '\uf7ff' +) + +### Encoding table +encoding_table = codecs.charmap_build(decoding_table) diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/__init__.py b/mongo_mac/lib/python3.6/site-packages/pkg_resources/__init__.py new file mode 100644 index 0000000..97e08d6 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pkg_resources/__init__.py @@ -0,0 +1,3286 @@ +# 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 +import ntpath +import posixpath +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 pkg_resources.extern import six +from pkg_resources.extern.six.moves import urllib, map, filter + +# capture these to bypass sandboxing +from os import utime +try: + from os import mkdir, rename, unlink + WRITE_SUPPORT = True +except ImportError: + # no write support, probably under GAE + WRITE_SUPPORT = False + +from os import open as os_open +from os.path import isdir, split + +try: + import importlib.machinery as importlib_machinery + # access attribute to force import under delayed import mechanisms. + importlib_machinery.__name__ +except ImportError: + importlib_machinery = None + +from . import py31compat +from pkg_resources.extern import appdirs +from pkg_resources.extern import packaging +__import__('pkg_resources.extern.packaging.version') +__import__('pkg_resources.extern.packaging.specifiers') +__import__('pkg_resources.extern.packaging.requirements') +__import__('pkg_resources.extern.packaging.markers') + + +__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 _get_metadata_path(self, name): + return self._fn(self.egg_info, name) + + def has_metadata(self, name): + if not self.egg_info: + return self.egg_info + + path = self._get_metadata_path(name) + return self._has(path) + + 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): + self._validate_resource_path(resource_name) + if resource_name: + return os.path.join(base, *resource_name.split('/')) + return base + + @staticmethod + def _validate_resource_path(path): + """ + Validate the resource paths according to the docs. + https://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access + + >>> warned = getfixture('recwarn') + >>> warnings.simplefilter('always') + >>> vrp = NullProvider._validate_resource_path + >>> vrp('foo/bar.txt') + >>> bool(warned) + False + >>> vrp('../foo/bar.txt') + >>> bool(warned) + True + >>> warned.clear() + >>> vrp('/foo/bar.txt') + >>> bool(warned) + True + >>> vrp('foo/../../bar.txt') + >>> bool(warned) + True + >>> warned.clear() + >>> vrp('foo/f../bar.txt') + >>> bool(warned) + False + + Windows path separators are straight-up disallowed. + >>> vrp(r'\\foo/bar.txt') + Traceback (most recent call last): + ... + ValueError: Use of .. or absolute path in a resource path \ +is not allowed. + + >>> vrp(r'C:\\foo/bar.txt') + Traceback (most recent call last): + ... + ValueError: Use of .. or absolute path in a resource path \ +is not allowed. + + Blank values are allowed + + >>> vrp('') + >>> bool(warned) + False + + Non-string values are not. + + >>> vrp(None) + Traceback (most recent call last): + ... + AttributeError: ... + """ + invalid = ( + os.path.pardir in path.split(posixpath.sep) or + posixpath.isabs(path) or + ntpath.isabs(path) + ) + if not invalid: + return + + msg = "Use of .. or absolute path in a resource path is not allowed." + + # Aggressively disallow Windows absolute paths + if ntpath.isabs(path) and not posixpath.isabs(path): + raise ValueError(msg) + + # for compatibility, warn; in future + # raise ValueError(msg) + warnings.warn( + msg[:-1] + " and will raise exceptions in a future release.", + DeprecationWarning, + stacklevel=4, + ) + + 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 _get_metadata_path(self, name): + return self.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 = self._get_version() + if version is None: + path = self._get_metadata_path_for_display(self.PKG_INFO) + msg = ( + "Missing 'Version:' header and/or {} file at path: {}" + ).format(self.PKG_INFO, path) + raise ValueError(msg, 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_path_for_display(self, name): + """ + Return the path to the given metadata file, if available. + """ + try: + # We need to access _get_metadata_path() on the provider object + # directly rather than through this class's __getattr__() + # since _get_metadata_path() is marked private. + path = self._provider._get_metadata_path(name) + + # Handle exceptions e.g. in case the distribution's metadata + # provider doesn't support _get_metadata_path(). + except Exception: + return '[could not detect]' + + return path + + def _get_metadata(self, name): + if self.has_metadata(name): + for line in self.get_metadata_lines(name): + yield line + + def _get_version(self): + lines = self._get_metadata(self.PKG_INFO) + version = _version_from_file(lines) + + return version + + 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 = self._get_version() + 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/mongo_mac/lib/python3.6/site-packages/pkg_resources/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pkg_resources/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd67c494fd9544f11914ef9bfe22f2eaa9b4cc4e GIT binary patch literal 99666 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/__pycache__/py31compat.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pkg_resources/__pycache__/py31compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b6752838cc5ee7cb78bf9f75fe4f97c30d954ed GIT binary patch literal 654 zcmYjO&2AGh5T3C&$tG+<#j$U&hjvL5;DQhmqymHrQYvUyNFiN2Wq-0>*_)6=g#+*) zTzL}S!B@l~ufU0M5YVya^NjRq{P~+fx7+#o_4}Jc2Ji!}g-7*6O7oULfWQLcKR3p> z>sibM6TIMaFZK{bTQo%T3&suUWzFij=t!2eJm8R{dLnM*P<jjyVqg0Dm28xrgsdI6 z1&$#Mw)6^|Y>_ZT%T2mEPDs)&IN=`UBTDm(VBM=B!z=iV2(O{M>p{)(j(&{rfgx=6 zuP^{}bj31W^UTY+9)2R;xsy+fkL(OeN&)mRo`em{l(GJNnoE&tV_PrABdwLT4XJgh zY;!a^dpbT1x%H}P{m%Mwm702@a?9l^`35>5Nx$l-(&=(q%V;^((M%OWY7-@SR2Ti( z#cC;r=HBE^a<R_)gW2Z&Jh@GASw^Q(l~xC7Y3gZF91Q1jBh1P~M%Ig}R;n;jm0wP@ zG-{y}N!@zTPt=^099C-^O#aHA4EnzFr$Ye9u!nni3w4jWtut`z78>Gl$n;IBv@<m1 z|7-2s4m;Y>bc=wNur_g1u4<`E?MCc|S^o0;$OcRLU8>4STF#X1l~M}xPl|3hvUBAc cblph*{#=PgAs@Is8>h`jIxOIwpo#nJH`Sb+b^rhX literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/__init__.py b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..528310ccc2b347d19b11c27774a9cefb190e3a6e GIT binary patch literal 205 zcmYL@F$%&k7==@C5TOTgsK2EZ7ZFe3qN5PnBrTz76Y{6E?P**+iFa@nFX3c5h#$O< z$D3XfhKu*@aUq`9q#uDV2OpeyadINd;CLr?n*aKYV65yiC!otL6k2g%5m*II#YNtC zJjE^DuzaZEq!_O?TYJg|&S0d8WP>hKDoSfHa_kXMxYjtW6@sZsY6a@nGJ!xl(Qs{n XQrSpH>B<bx`L5QyRboGVLLc%4uwXkx literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..546a31a2e0c26faee4c3af4d114040270f6fd529 GIT binary patch literal 20743 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 b;46I5f2bMxnIvZq<2N7t(ivS3;rD+5ozFp7 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..150b318c895df4dbf4f40ab1c84e03b584c3dc3f GIT binary patch literal 203214 zcmeFad3;=Fc`rV@Mk85XV>`x4j^#yCBFSr<;3#fv*-i|O5^RSAC1EnsdnAuEnvu^L z*^)d85GBN+gr>B&P)ZjlP-tmsf!-Fn(L!lUDWxszDQ$t$+j6_yU-#bJF8BL=-uG-H z$#x*U_x|ydK6B1_&w2Ovd7t-rpY7ehYE|LSe&jbEx%h^3;!hKizo+qh7k=)S+7bzs z7*43<a8jj)Qz|{2RvDG8WQH@i=PKE$+;B@WA@B0TdAYX^x5~XRT#$R)aGTuQhuh`8 zYIv30JBB;tzIu4I+}8}R!M&xjc53bL+GJvmp?qcC)cWD|$;5++s+CFD8zu|Rdy@(N z%h&7l*H<N~sfQACTk)>7vT<tD@Fw|Q!1Lze&62v;r2e}gb!%l+B<3m|)8xdm+wlGR z;VqK-s80P{(mA2iOYPb!F9~9731Zx3O2`gx(YfiXYFDdNhgz-HsI_XHTCX;!>(oZI zNo`iwt1ap!YOA_I-KcI-mfEH|)poT*?Nqx|m+DqM>SlF|>Q#NJU+q?V)Lyku?N<lX zt?Hn<P2H|ust&0;)PTBE9ai6=?ovn8Q8lQJspIN|x?A0&PO6uwm#b6iUNxldQ}?S^ zsMG3<I;$Q~uT&4Jht#XouzFZMq8?SRRz>xgDyb1Qs+6+Tm>O5-R9Q`^NmWr(s;X*g zTAf#pa#el2JiOJu!ET+naWSc~YUZib^@-t|?3+~P`h=R9ObuJM^<2uCMvQI4o%Z(O z9rn)QUATAI-FA<Cvwe%*i}ZbVzrEYuWA7br8{StPLG1mAePH-jbwOQxGBMmWo*3ST z@yJ#V4j-I7s%9r{TTC2FJbG~W_PGuAzKNIGhwOv)?Te|!q>L3u;*QAzO8%4{iRV%m z->S#pxzzc$KA5lv)SQ}sGGX7UE-faHB^Hy5$>BRyLoJ}R!*?gt<LWg}Ce&-}?^sL^ z-(_bej^KB6Q(|~fy>|GReN4R$&&TaS`xx#g?49Zfq`zA&PTZrOlzcN2Crz#|LvBy0 z?Z|Dr{c_}X3gOqQoe1x=Pa%9S!cVI%gu5g>gz#n6gK&>Mgzxtu{EX^FxL4BOkMJAR zcOv|qQoC0m{6^J{aJPg{+nXoO*r(YO>RI(2XwO;oCUrmV52)`__u~Fa^_=={+#ghL zR^NmBL+X3gf5H7#>ig7#xDP*<1dP2^egBim;fIm?+tkg-{btGi5rlt0?L&B<{RnFJ zD8g@7>k(dWKZ@|H5&l7S1Hv~*xQOr%sh1%95(z(MKQ>&lAG04Rj^N7=tIhbbS-y-S z{3EIZ;ST#T<fIUOhgya3Dti=R8{u~<2VqCzk0Jb{>Q;nrmGC&i?^1mT_euC1!tYkM zAbg92%Lu<mtwwmYgeMUGF?9gp0}`G@_`T|V2)|Fl6@-6WZA5sZT|xO%2>*oIg76jz zR}p@{x*p-{C0s-JC)FN=_egje;h$2w5#BA~^9X-H-G=aO5_S;&X>}0cgA#TT{u#9k z;a$?Rb%Z~t+7WKI>nMK);SZ@!ggYgC0pSm;tq5<G@I{1wR;@#LorGr*{;z5W!aF3t zIfQ>sZ9sT~J%{|}5&n5~Bf>XI_!7b&Q6EM4qY`c){0r(Pgm1DNh`)gFFRI%SzFoqP zBm7J1ml6JDfsEJKuUSkCzZP$QMQy{|ZIa9D5dN6zN4Q_YPayoO>N<q4lkg(KzotHp z@W<^%l=39PpHTY|-Y?&uLipF!8id!_PvQIP5&opwgzzQ_KaKEjsI>^MmGEVRe^c#6 zc&~(?LHM_ng|H>He1rOwItLj4PQdsc^*ibWVEm1E-m5;Nj^g=Q^}Fh``2HsKd+Gt) zzf1kTI*a>r>JQZCaQ|+^-KV~wUWK@CR$o+i<K6e*-G22YHHCNItG=wNc=unFr>1fL zKKs>+iHWzUlfVyewX5=cAD+M8uF3Ndp5JCq%kwy%f51L3&trIgyFG5-t^QEGMSbPj z^u!OUKT?1EBrw(R583C`pDZTv=Bwt-597_(<jvR3n;)@%$o}D@3HwLzn^1qME+LQ9 z(ZujO?5FK_*w3hMEG9Q4?00Npe($s&Q-8LYv|p$G8}j&3_2=^KX?wwbr~Qtjf*bMn zFZfn{6Zr03>c1-+ZF{%+OLYeK_o%;8Be?&V`fK$V?(bE9qg>qIXTMMV4^y8X$MgSZ zo_|99t@=BBf4};B^$Og7QvHKEjr&ije^isWe*hzuus=}zY4qy>^-t<N`t@h*y8vAu zlrJAFe#qQEjF$W}YW|G+m&N2*O8rk&L)@RWe|Gr4+OJ2SJdaiBf3b}ifqz9ye@@>1 z8{YoAdHWxD`}5JbNM*jW<r8l~9oR=7L7Wnvu};_@naD3Dbb7qOnlt=S_0Q^GR91f( z%iwKVy%II~1w7q~Uq)3B`bGQQc+MjJFUeC5Prq#cBu07AK7lVS$TKA+=D8j{k{bS% z;g8wBYX2I(wQ|M7y}&hY_~Z6DJh$Q3K5>uz@rh3?qK=#ReN|Ae4#fL)yjiVE=+jTK zjR>t-OyasWh_w!}enY;jH?7@(H@_)wuEU$(A~Yh!M!fx$yxnBtZN{75ZqC*I?V#7L z$M;X$pC0}lNwvkKdI{cs2B{X%>X)hCM$TKGP1&!r$MJLn`t~vP+l$H7=v~ea-q|kp z#>DTMnt;+6{;d5*q>*v3KYKKx7Lod<XVEhl=ezLz_wHt2SgMYBUtdfO|GxbP2ydHA zJ=f-Z&Q^HtL@fQZ9Z#PR#$X3ZOAUVk`F{bicB;?gx{I^V{&B?nB4*DU?Jr7w*ehLl z_a)rB?Jr?&eR+jco}}`ER6R)bhxX@??q;<3%Q_#l`1APvAwu|$S@sqCD-(Z&&@Eia z?cbmHV+r+|(4WLYUzJdwtofvpzBc?dr1%<Y{XY9^6JKY^lE>F1Ucbc4o=J2cOePYg zue2r-h3UEJlH-=E<JMG7%~Wiw&l;?hT-SE3QdL<~cKuvUxmLYqDSND3wdJinYmd&< zZOczO?v$pckWJyv7xS-BIC~CdG*__9npvev-FB*_diesXG(GLqN~7mk%TdS1OEibI z*Y#w`El*9OaehU63m4petB&mJPDz#P<yy5=u`2fL?zz(FXpmvARdXcPjB8u9G0U;X zXDTHJ`A$2w>mn6$u^uef&xO_OwdQIw1y!qd)vc;+D^{vvmmE|X;ft0#SFM+3tuf>* zJ<8ho)nai|rTXYOzKj%tL1A6}?$#q!K%*~|6$i?ylt-MBGsilPn$fGDE7e&Qi*;wm zpt5ymX0$F@nG!8kcI?r5WzH&Bt^4ON*46$(;U3$uEq1eoA{dkDS-5R=-eXrPwO;GN znp08RI<0QhxKy1(3v64u9W`K8(Yz_EFnFnRz%5l~>KKw*^>D8>P*R}c0A2RsZJi4} zz1GM~xl*@grcq0_`P3z3tQLClaH@;}E>-Z%kvw(jNL4LZcEz5ut992Zbf3D^bxYU4 z{j8O9T)*xw7Lk9kczD68O(Ss~l^X|uxIyx8+<Gna28u*0(b&>Vz1D{wx?nqX8L~oH zf#^W=96D4eSoj-rYE$8uTY#>bQ)jOz)VDHyuH@=?+x=<dcR2c|6!ey4C0%FTDT%vv z+8*l`tFyNgSLPUfxvf*@dyd0^L`~x%8BU{Jb*o#V^je*LhdX<9iTyH$XQbWwb5D<% zWM-UeGxg~ibgv#l6mbz<<hMCC^j6<t>)|eW)zxct_3|P>!G~>KkLr9iNMYV^zF^=4 z4hW?z!0!@3+W8rbHlmeOX{2If+Ob?h9pkxnWvmagp;E$puQ_uC0dcEZnzCID9gJnB zD1ZVLXmknGbiKMOfCLwSeHQUfT@si%ZM!p-x(i4dnZOJ{+4UKxim{iGHIV|qiga8P z$VI*Y>_&l^MgUHuqXcqgl{ks2wo9O@l-)Y2izzoM_{NzN^irx8OcgE?kFZrpSH~cY z0LA*XUV;VBVOCTC*=}u0P!qcVvlYEJ#o@!;CtTO(rpu$H3g-6(dzM{#@tj??E;_(? z>|cAfuIIJm9x4FIAncR`36+7}Bs#{$oi2^qRyRv1jnsf|eXMY?T&V!s-I}Fq<3pps z!8SmhhEB`s1(GDfuq?i{>!bZWEbjbFjU8hqqEujN#3t_n*lJ29dZAFb+pbG(&(upY zIr|EI&3}bgmff;OY(DyH8o>pFMdD)*00Sx#AR8$GyZMQw|E6kg-KwG0PB_su=%L%o zRlG-$gqD8m0isxRkE)IOScUlAo-J|JaS8C}Y8L^|(#s(xu4o*maefrf_)zF0K~wud zR1*2Q!D~}tc3qh3=(&<p8U^;WE&_Y>jXO2q*XU}ZaV;xs@U3n*b76Prs_K=LlX4oE zUDny9d7Qd5Y&*64oO^4I?RW8gRoj0NsUD}NM%h5*hXuo9mJZy@)$T;uaqH&YtGfp7 zbNH;We%G$9f#X=(BPd;n5x~a?sS&fTM{5S;R|7Ev=tm@U|EyKR3}oX#*3?GJC14uC z9hOWuERh&sE+YzU6{HX>MglDX5^(Lh!5TxDqzlXu6cON;QxMp8dTgc=>1WG5hc%%O zgp!N7Kgs4RyHcLQn5$F31%7{_cK3~ixk=5@Tg;5JpjM6KNx&0GJ9R0*2t^%hK{ra~ zs`PtdKD)1fU;p0u>-OGmow28_eS7e*XV0MnFSQ;xJ2-#y{UsD}@95n#paHCb>H5^@ z_+2R2ar<5L$*2tw9=H3ecKz@-!4OUi^(4KtV~^pMSLnogdCJCf_VlUR=p<jB<bn+Z zgy)WXvF79PUXW(MBY4wxpQAulsAIr>UK%jqt@fe$<@Ou_HGE;f+bawLlHH+N{bbc^ z8Pp^0Wh93Tfx^okpPH`Ed4&@-E>*TVI_I^Vs5uu)$gOa9?QCtZR+*WqdfB@<2fP-) zq?S{Fo#UuOD<1^0cz7oShgS$;(rX#2Nyy8g7DuXcUTXl|UjDvnW$wP}sEwy-O+k98 z`y6kbK+RE1)#J0HwtVr{%R57+9IpahB3Xxi8AMub!ai+jQk^K(OO-IIc8O&G(c2)Q zGeT2_aaPG&A8@_)R|ulj3%_^$X%O!q`7hXaYqC8|mpzUB(5#m`Gg+QKTk~3V3U*YR ze$-u+KQjZ08+gdeo~=#VRj)&CgNA-`yzGPL(3xHaNMCs^yh>;DLFZ5i(T3M5G*5MA z%Jp)Z{P7C<e)~wd?zMru9IVt_`)p|(AF6ZrP1{vIuNpm5pR3q_3$7GidbC#Y)^RSB z0PMhkW}10x^!&Kz?7gRsSAogqy!O%BOckGxI8JHKTRl2G9m{F88mYv3j4#fBtUl+L zwJJ7|y&RYH`^LNuRl8Un#lTB<pm%Hm&z5uctTeCfTz#tI=dos@bfFY0H&X#HdM&(4 zckw}YSB{U>n%6#6nzY#vwBPmG7<$MAI%MBKkUUZc)O%|se7|E~DA#7(;~;#!4Y5}N zxNGu6Vyv#tR4T{pk(u!$LZf&YsdrXTl-E+5K0*xYt@EjCWIt*vo4}0S2oNvlyzAws zXR4zzc<ZKRPZ4WoyI%GUG`2hT6le<RZ`WIk)usY!BQjWR<`s8YUI9>to<7BnTJ4U< zhbiYerRuotwYoy#3fSsL-HU5L+>F{XHB9qX%~Z>yHHBX0R={hYnU0L!DlQL4d_v4y z1ym0>1Cpr#-+8NRPI<hHUE^60O~5%`%S=^PT1Ffz&jMcvvFo)VI$=>dxRrSha)$=w zMxfT%C12+>0<!ehG^6!zrh$4#v0axx1|XM94C3cLhD$xsNYs;yDW{{6IFp#m*Hewe zV)9HPlc=X5FB{fUkb07DCo=WyL~aohy~Wf*vfe@t)<UY0n#hA|l_7^QnLwzu0j|NB z#6t-MPC-wubR7ym=G3P9u=JR*;DnPMEV{QF)N7BXIMItBcCh+_1b#sGEC`vh4N7&c z-#UpTT<EdoMl{)}a3_U7KNrN|&H%LQSgBlb_4-`$vpQboP#t%in$ycQuxgRylOoM9 zN>x};G;@hLVCZ|jvoX<q(!XH=f{`^A*SaoKXgPZf>tkJiBQ4yp`uqE>!~H?#-rCuz z3W+T&il$@cbGx=bqHeh(7%&c84!<+_xjS%C$vOtCkx&qrq1&?*oRLj~=LDZOA!<)< zXg>AGjKjp=Oz|R5|AD`rl$QoN@zR)VSXGnt_a&S;#CZPFZcM-n0JPl~O3v=FS_P}E zyL)tUcfGQAY-IL=I^f<`ymfSBZgTJbvH6QrqkHf-Ufq3m_jH*<>td0q^c|S8=aoC_ z?gp(hGhMIMD(>#-$?+nlosb0X?&1XuXU*9iz-j;VoR=S{l%_^h>F`gWDlUGB`Ax+c z3~T=Yp}*oD#)FPA)Kl;Zpw?L+@dl=iOhGS==-xU5Hj%ORa(Z+SVb1l|joWpwO*k_0 z8Uy3>pggYwHI7d0)tKy67bMKo8JXNYX)g^(B?VI-E<^^7y(eAh%rl>?)cb9Cbl2gM z$QF{BR4ScMb)+^V^U02+Lkao(L3d^fY@I5IKiQN3&!WFULUNa9q3^(KLXAMh&S8gC zv8FJ2rb@E`TyRwR8^uowY9t;lEF>GrS3<mfKBWi+$sws1hCJ23$4k!XT1tIc)#qCW z#_cL8-@`x0T$o)Z;k*Gir;bZdR#rY3q;VJlm0SS(TBX4x%}gW~Ay6eEnC%2yCL5{6 z6a=gr9!V{v7cz~+M5>W)WPmUd=Q|$+vO&GF^Sh6`qorxv+69hIuLZsic6Hcxb7MyW zwPdz*-1mS|EcMT4cO4$+><VhcsuGnERNO7Np!Mrer$mFI2K-Dfq)=M=`Q)zWlXv)i z;ao;^FX=XQhBW(^nVs&2`5TKE<DxC~j6k8^WAp2=HM7R+7G^ltBe48xE?^|<PFFy5 zr02^Z7tN&Z$$A+!!)xbmujtNAjbL7Qg?cS`&dL`rjaN+-^V%X6`3Ngmz$KB%B-bT3 zB-bRJ??Z@C5d3kj--Vysj*Fdu_C*5P7r@8>ghCNS7H3Y~9YSsM#Ughy#UefwHCGVN z?Zx8xnNmf6iBu<m9Oo^_`Qt2tos~~Y*emSWyKn!2TMyoL`%8!0j~pF5cKk$XWE7L_ zn~xxt7s8W2daSj(6&H-&2EuMVF_D~XaZ*iCjC$uVxw*m?E|M@5hC)xu4CQE~iiB$! z%HL+*dMIO^lg9hI`0ajN!p?ze%6h5^K-iM8vnr=rL|~RvdDRLbNQ)|{Hr(@6#K653 z3K&qvK<ok)GVrENrP0CHIX5BO`P+mUVEcr*-W|(&$Egh3Qg|Z{Xh>{<usbtUzAFfO zXq5Aff4sB4gZR0ecMUAg#Y6*`elqWD#av4iAy~pSRc*&CLrC7G8kl#*H0NR?J;wJL z!3U`!=LeAsz%dQ1>ZPaLaW6AXw7H6P3fQ1trsRyfgj#S5#+)BT8s{Cnyb~8MLmp~V zmlKf6)pEU9{5?c**Wi*!=78?-OXYCQCFfrv*fqAT0l!tJ8s$jwk9Rg(n!FJY4NU0? z{?Ig_lH^2sF@ugy&i`bvjAA7tC%=M4f0XP!BXb}fA-ntX*j&if2PI0Tmax2}Lc!+6 z3NjQ9Ua6{CH`w)GsFfkXI9IyBRot&K@*W2}aYon#)v*dFc<}15+lH)QW+Y%-XadFR z$uxDN^DZ<FfSn!%CP;zV+_a3WE(%5nVB;%@F7TYl&37)>lkw=W4h>*vh#d-unM^qw zN%)~tfu9$FCGj>lnR9yUfR@<X4B{TG6ORXR>sb<bPe34vfoPfkXBV3}y@-WeM{8tG z*a>7Jf@c-^>%$7iy$F~enq{g<D!#O^Sr`G=$*^~WwhN!JDHCkgnsUG!Y}H>#9#ZBq z)c_}~UIJiZC`rhzP!H!6degZB7cZyFc1|KN1iZwT&iirc$>~@!dt@HTC&u$Sf~|p& zq)7H2zRrS4J+%ZJ+KNRGF6`f8@f(QdcHol8k)ANW)clRhfkl`sSUkBt1aoXN0z@I0 zV`hkPPmg6ba-mKQ&3Eo}t!@z1BvY-O3KExYcH5zykW--5xc30Ii5N7BkWP`NC#5~j zaNSZY0^t;ke~%Py2A4!Km7L$QY}F-VtlC5mf*SI8AOv%x0XnBgQ&qUJ51Y#ba>7cC zLjMUL^(0ye9qD+_rw?x%2&NEgNfKNN9>4>83;Q1Qmr8C<ECA6u2UH5!2_#V?O(I;Q zUM0_CX|qd8FS1WF^G_Womz?M#4qXC{f_wPBT!kRT&_SA+2?6P3Y}><VvN?ooZ0V#C z=48oor){t-D-au!>IgR<LgLAKFoXdlL<+=unTc8%3@@&?)A%4T3ATYVX**~18k}cE zIf~et^2q>y69QYsG$+{zM*0`zFZ4(vlS_gk2HdVo&Rfe2dn{RO@Hq}L1{?68uqrHK zBc%7MlzVG<UCq*fT~H}OG(BnOO^EKLA*l2+#QZA&2>=sOip3PBhYusmgQY}6zMMxx z1icU9p{Lz>D{jvB^Fr$1V}`X+fZlr<YLgW~OT!)Ra-0wF^3%Nh3@<;=%P;T}cBDKB zNkg*Yckq*?HJ{9+3vKQB{OUaR6@|hmJ_LWP)m`{W%ou?q#IUms-%3N6NP<wq)vtce z0rN@Accw`V#JI*<94-7GP0idP$*&Rhe|tEeqKR)A+3TX4mI}fMGQAcoZ+c1OFpy*V z3t8Qn3j=&f)?_!CT|NESwhaM=cXyI78MmFzo|xRU6Qpq`#8>7|uP%Bfgrfnu-*nT$ zDg3c+z;BS0Iq0{YdJZ14E-iHSbI)3;BW6F|LO|=6#JdC}jT^QGoFzywvG+6;4iWyI z0N?M`=zedQonPc$$&*MVJ^`Fx1f(qs%ml$K;8gH`eqAQ{f&h3sQqNZ@XXq1{CCf0n zMn~Yd47N<w#fF;fCJodab%gv*f#`S)yj*n$Fl}ub1YCqZFM}_vDDA1ty^z+ieo*{2 ztxLVY*6n2L{$v8Y51=oR`3R1T^Y9_vf@~MdhfG<Y{)LcMq_YqRn;}1SNl1$`XxacI zCjG@A2ys|<S6?XH?!nlD35~{bRl<7D-XZ~n4k8_m90K|{(l21tjg}~xgV=heI#L>) z<jOWFLt^w)Z1UScJiCYsc8B!#3+YaF$W1|arklEx1i@YSxfU*QY)AHlSQ=z;$CeK3 zLyOamX!FAnicWVSsMRKUZ~ui-rA#T+f>n-d8-Vu@K{Pm&(AfZ2({|ABU}I~ENI*2O zV*Cx_Cp&i8nI#Ng2AsFG0*^+bbC!%{p8{MH{X#)sWD?0@zy;+1yMzTKlJlJ_3S`0! z7NW}^@3DGm;?F1dZdfs^L)K0gYaLl6%deoamfaSq*0vS%LbcGUVsQxc@p4Fm4b)5H za%&;Sa39MdQHHfJnNP<M2%C2oer_)=Axx+g;2^Cz)qo2?guq3M%Hy6>t$>e$x2Y)8 z?X;HTQe<%7*ccG{Xc~F(kN2SeNQ9Hr8<Tx`IJRl<??503?Ub6{i~Zfc<;L)iNM~6q z6daBqOXVN$K@G?YB01VfUQYr@DB)klJ0F&k<)(tcPU4mTOq8i&@y<vEwy#`)AbyM- zV^0j?CtDG{n^dTUP~_k=AZzY#Go+{;snW8<xe!0!5vj)&IzkiY%TF=VgzN}bp#hCv zFg^5S^Q)57mC(B^=M#wD+%v5hXFb|SBK6s}QojVThk#d_pjZI-*I9<pcE1rXEhOtc zh7X5WSRM~~@Jjga@a-sm!5?>Pcj4#09dSd51~fnHGp)dm#qL9;?d+IlUnK$4hIxf| z(EkMkD;Z&6!I}tgU!X-1?rpRx!oA&YhlLfai}2h*3nScD)5-|<HMBIseJ!nxa9?My zciwKV8Qx&89lp+9H@vaB1EEa_ZAR#N+9M&>2HGUyejV+SaNkJVB;2>qJ_+}iz;*~$ zN~qgbS}Nhq4YXFm{YF|W;eHdXmT<RdxrF;RS})<=Ned?2x6_IV_Z_rk!hI*LnQ-3) zn<Q8?A?GeyHQ`M+Et_!fQLt{p{btxK!NLhKZlRSE-t^Ma3HLtOGQrvjU;1hBgg3is z^@RH#T0Y^vm)1|X@1q42?)w$#>&KiO7^l)njF>FK*fK$55=<gx=nn`&s5S-x6f`2W z{-rgAH)S&Xr)-EExRcZRUyQ>&o~#GxMzD|rqLa!f7WFnkD0B~Af+V5aWZkn6&}e;R z!$=g$9%mWRM0$A7qrF(Qq%IHdeG~+RQL56EgCq>NIgxbz111qETo4gj;iq}+#MC&g z^JX;ENBZKp)@BOn&Vb%Dx{E?S`?L$2E4xhVPOIAxrX;N+8FzQiK`*wG%8p&Ty8`;e z5I^DV7Qdh+>A|k6pZj()P^G!f2#LMjvZ09x(!t0#r-JdapvW0E$h4=a0YN>xJL46L ze2@Zlf3ktwHE;mTNUZq`wUXXWn65Hn%AjNQ2%=m43dOf4dtds}m+s!XZ}<Ma*rf!C zz{Up~&aHO?bjPZ95*7D^jbl~JP6YfSXm;*&JFT6Tj@)gdL%Q7_`~}%bR-FV*1GYVp zEs_4Hs|i3|=}VV%QrAk~`*l~bYW&lgnlu0i1N}=f?}DU_dXrsOh@-34uV$vEyL%wI z0x_eT*1WTl$>+CFYrL|1sbRXCm%aOf$NhVu^Qx<AnYy9vOw%Pvn!ow2*D>~WHGOC6 z<rDG^J}qfIW1Mwn>`06yt!JDQ5W$9#V$J90hjkUN)~Y^0+}t5+zuqyjt$on5!wfuR z?cEntq0i#1#w&D`yc{|kNJL2S1$0Lz0-!s<ycG2Xa02TT5r6_&$bzcPLIOe#b!zA= z_NEO)_HtTLmaG|Q(nHd9U2JhD!-nz*P^Ir<^cHAU5JaKH0yGBYBIr#bl!c(IRPl0{ zZOE^Qig11lDJQw4i<nM$T?L9iw4&8%jTS-GNd-pPApY^b3O^yJ9z$}{GR_4N?tqS= zXh*K8GM~X^q)<o1JYdF)IOyPb0wOeo>N#}B{d}tx0uZyMdZT>F<I7k*NA|tE%{P+c z@>FkKWWEJ(FcXulwbwRMuvUJgk#XOw(4iCQMrt5|98&c*<nXR~JA}NV`GGXL%vH2? zs&~|L;C7~JpOVtk<B75KWbV17`-qg@fwX_j5>d}I^4}$IS1+=xOnnVxJ8Pj^0&xUn zJ}9rcvA(9h8aauAL-?LTum;{0lhuQBNX73u1?;?cKyPJTeSLicN-iK@qrXBRVV=gC zTKKR-Cxk}TBC+e7Poej{^-b^~<K7G;SdM|-z3ZFeV$GhJ;(F&U0V@MI8=6vRID*y| zfNEpYHy`vmK&@A`DZ*JWFCj>#{^K&S`QEvRMu>ia^HDaZKsh9k6V?WyON6rYGNU!B zTtJsm*a2QEGuDrVlcW>m8Iyqf7l(pW=hM89|LA;%7fz;TxF^Y5C)^*!1BHLlf9}!> z5LOqG?J1JE9TF~xfN%%iGH!cvLuw<wrx0&ra{jvLMr`?AP{0tTESH#o?BFo~kh58U zR`x_3`iTsr$_H@A^nlh(7C!(D@I_8<2mLS9W8nTpc5=BP%_2ve;-YI7E9yAhbBqJ_ z9&M-aS|zSee0S=+NGCO9k<Q0P>@sd%@<LOGJzp5$z(coi`tUp1Z`{-667#)H?G83y z5ha8mp)<oGTJ(T$@WHr;B+_=ifM@6TdHFIgBudSeaJj9I!>!5>uo4<+btDU^LULVd ze)CF|8D%H%k6V*q9NvfkP*bW-jJyZEDk9rD1Rt2xsc|sr`L2;1z+~h`Z6Q-VhWN=k z6w74XhB&z=fS?!yUw6gxz!)RlVpC4gGJ%Fky#-}nuIGvW8<}FOFY)H^^%Mm1r7yfR zder$m-s;)%H9kpqv6H;)#Yt*oQH<S_)jRm)r1K|?Buhvd!ri8k<dzzQsoqk*i@iv| zNC2$2;)lLW=2D#k@JsqLNEU2rIRM-Y%0lo-JjCGoqavTp2=WC~H<EXn?`Zoy0Kw#B z!Z}2a#BEp%AQ~Z9rf8UmP?m^)qJ^mYO<W_fh|nB0nV5YwdbxF?Ks}yEPe5-cvyhz~ zXrvK3u#lVWueUW|dWujdzO~?&UueY=kZ-i&KR21#%+bv@S_Ts5-|%4Kd;`BKP%%b= zs(^Ru*_75C0hv-gt3rTv*#FQ+u&a6yI51vT>tVJCPZIbPiZr4fr3Wy}o_4)f8~X)f zMq36KV=VaU6OzFc6nmlbt#w0{;4iPO1`G{dJ7|r$UUI_uhQtJIIs*-CXzz#>-!fxM zU0q?9{0zr-D^ew7RP$*fFo<7M>wwZWV4OE5cPyPVLGoaXIn()*G3I~^j!I0DMJXH{ z&RKuDvX;%2f`X2bUbw~LCs`|I2TtJiP4hL36=U7R3I~8;Qu>0_l=J5-kP~8gHXn&6 z^lh>DTP&BwE+K8?bF4r_jkFe|O*{Vm)?T43NNz`<Ls%@r8;2>Zd0o)oW2IfGd0qx% z>0GIORAoVwV)4@}mZ`tT$|N3?@#NgsT}lE>rJhO~o)~689p5y{PC5U~=PNWFW9;h$ z7K^_VRHb=@!#J_(r2Xm;shR3f%XgzjsFXx&RgYk~OAUE>wrkR!b9*vg3pn;<0O<AO zc~+J+UI8XrrOTM~Gps48*#s8!LTY|v93uS^mQ<D%b~obkbOOvOV67+fmjNeQw-At$ z9tx6hco}`ap9Cv#$3pTlrqT7j;-3aCnKxzymgyd=zVOoDfJ{EmIy2WyV*Zw;^%V@^ zMwVY+2N1daD^f)>^`DtH)&(|KC;yyZ24-o~sv1TLnuy5K#245r86=Zl*@6eH64@~Q zGL~9SF;r-iEA-5l{92=DVD1B{aIk@4t?`@sRyw929V4l~=$C+g*|b6lv2F<_cRSi> za2J*{B9r-7o)#laEyg45?ptJ81WkxF1C|-~|Hia*U;ixBEAWBp;F{3p&fk39-#^>a z4+s)^fwRCLVBz7)MTR=V0{$jwOKN^?tS$U{&8>K7#a3ug`gYp^_2~dCS7=U7m-Kg$ z25Ac<fB5zHYi`omicLb#^et@`HNdC>E#_)3c%ZyiHc-H8`Sv+~iIM!LNaM80mESl? zxqREWT1OYm`RC3+$ZQLIb@zk}xDc3VY5*as*8HG2)i?A5kd44Kf!N6g%n$HHXi1=D zu$5YElJaToLIC!+6l9|?GKirTF4q46h`ZW+55VeWxF!nXUcUK)+zFD;2VIbETEv0< zV=zmSl-T7y{M<L=(nz`mmE&H1_8@FN1W`YFGl)YfeWz6lYJ>Ygd}8ryWX3>#p5IW1 zH<LzsBj)N82tAk}dCKqD9;DoJP%#7zLe)g~oJj|Q$az9PFJ!TQ$F^-D$NQa$21q4* z;TEE$(Si+|s3Mj=;<Me!TRJUvL7dpc0yNI1eTF>++i0y6HC7gt2VsmGlYl$HNiV^& zvM1D&qNy6R8zH`iKB$H77zJ&4Ie3YC?ggmnPeGr$JgSFk@X~Y*T)_pgMd9$GkZLU$ zU})BYYK1xiMwKW>tB62NQoruiCM3{8pj6#2Ehr((28}{FkPyJ`2L;ocfT)9^c7%^< z;%d5%;OA&nN+FxPTC2itLsV3P@~v*MTBhm&#M&jJe+DfOv1|#dB@GWM6I4(7TB-%9 z#b^z*wmV&eUIAFsGRJj2qp%y~fvA*=7$CNepjSb>Lg-<vX!Ho0Z2aEhbP93^bdh>3 zQJ(-##}w0p)NjTl<YzAxMi6Gm<<@(KqL><W>ke$<bTg*uS?0SZWNY(_=7R@jp538l zP?H|e9&kPPTl@Ec&)x$@zVK1^Xs+;n-tZ;D624m2a9klvj<!q#&zV+nx)s+@E@~1M z8FVSjtdvIViWT=R5sNSlG7;Y;UU%oIBS(*)5{b&PJrGX`#uW6FkUlPfICA7@*foaB z9uY;bR@=p7UPhIp3`ZlPvIeb6>Ow+prrR&z6c7R3Q0X?PbvfV!Fd;&$hTBa(#;XJ8 zKJoDsr<j4*_~1tXNP6O$0LbsOSkY{y0eTH<v9Ho;%MZDf8?TiH$!qOsmdw8;!VJEA zxC^6mMIi07qy~p9L=5NK)zixE$ZIhZUN~s;eR_n)X<tJPBN!`bO*Je|7ol+%;;pWo zZr70BTV-W=cm4>gRD{pKZEa6p^9bIJXD>GiGw*R%s9$05cv+E>I<M!~c2f_*Th06L zG^+I<Tsv<>)I?_n+)J<kzzA3a#y~s%$ri}L?kk_1UlSt)k#KoclFi77YyhlzYp}*) zWy1;wiL$oaDV0I?1_0m_Q!xrxbTf%*xeU;0O_fB6cnHx7OfXas2oJJxXW;ROc^GR* ze~}C`0P@u6_myOlz}1NZd^!XZ3Q>xRtZK~>QIO~zbBTr96b?TB&cJyA-5+6o8oUf% z9M{SqM)0sae)gBEWd+78!53))A(^<}s*IJnnZK|Be4*z(3h>K{Bd?hF)X#x;JqdN{ zezx04uMO^RlJYH|;v9@9=@tceD(v83`RIzh4#j>~$je`OIH*D28&f%>z?23U1=B$Q zp=mleUkB{&2Y~8*|5`Hmo4_8;4ZxnHWD9<S__@QlfF&VZVOkD?8+iiZ6wG|cjl5kG zl;A-^*cI>~vv`|ZXn`F{t^x9|k(|ts#|d#*7Cgva@E^B4=ue!Rq7&z26<VVtGT=sw zR!pSBKn(^u^jb>->&eQbRM1JmLky_7LiEEn6~zc#2eFoi=NFk)2ukCKZx<4B>B^{U zCr#9gW~BM@7Q`g!Q?2zVQT!D&W_=*UlFqD%EUMkSP_Km~=gJh5>6|^i?Dpz%>(sJ@ zLx0m^7b*Da<P8ezTA8w<79tsOUQTDKSzg>CI)BB>$8hmi4*09q@t|>`rDFesQG`kR zw|x3LUgFFFryYq-a()o>6CE@JhJY)+q1Ht&&myKdoj*y$10T5^snWkA+hD|xDEN^9 z`ll|mfoxz|m|Alnqf3z12f|AejSiv+F8upH0;IYqeGN)xa3z4Hh>XqxIVov19fwSV z=8YpSKnb@hMsW(wkCi~`3=U=Rx`>RfN}K7Z-HbX_nx+y`0NxQ*7FPXA^SB9c!}6~V zw@ZMw*E(?EK&U1{TQd#0I#(kz5FU54iKf#5aCwwah+iVn-UNR-gBbjg`6x)*@Q@*1 z1qXQpsS}8o5->RxM9qCWJVtAn+z>^#0+UdP@|hMs#Bq3D9LUsLk0yj+T;Rn~OAHQH zf;8O;0%(S>?gN`pSJ+T%VY*h|qxTfqdBB`RVFMm6pacoR8e<fvp-8U3Ulris2?YIu zy_@z0(EV`z;X{Y|_CBh4K-}nP?D}XE_^~{*SLo{MrvaB=RIJ$=N|)O@G*z?-GAr(+ zny_3|nVcB2DwD1XDGvFhzwm={Co5wUlNIH{>APDANf2uMi`D>P$-t~`tq-#;!gaIH zHzUtA0NY7|tq2uX6)04QqfVVqj9(Xku4aT&Em$R=N`Y|%N&^<Jka}u>oxd&Up+P#? z6a$a|PBrT&%9sdZ!+KttVMLOnOuRg|%~^*QEU*P+pd~Wx$@w_DQPRd{9$DKm^TzNn z2SKXd4?wpi0iP^e%^3lhaSzF!0Y>vV=hY%aOhM7%7#k^y4mr9A5k&_%dErTEKEL>i z4%H01K}6*(+Bp10)OpZS^QN`%t7y@i*cte(pzc7iQ?VG4w=}6cWSp-ctzM-?#epzo zz(}vjO=Z&3?n#!p4iB_9rO9j#8V=NP*s@e&3u;x@As7_G6Dur(LJ1$2<3$>Qf{6)a zh`TS%{6l>8b^o(sLM|K1Ca|Uy6$?YL_-58i%geZFY+}QjNI^Xqkx<0?xX<ANiGISV z(jN?<I{8fU>7*|`dq%#Ij$TNKOpPvj@{JUSejz=3K;-+qprj$~hx8t7+JOY9>@2lo z>RBNA!_XH%T>Ylla{e&AcVtiw%7lJF3SI|LYMwHF=n*90`iDZdTqvgl*h{CaXJvJ# ziGo7=W$tYgm$j=Jqn|JRLx(gaTyixry3l<_`HFK1m$$L2a8Jy4MF|?}21!>&Ax8U( z32*}YtQ9}0$^krx+74SUYHZkP+(<KCaQ4$w<AEqKt!)_=p-=SP>GNyOQ>`bZ)q3hk zkE#AK-ZG&C&C6aOpbFHZ4Xvotl4g7rY2MCe5SXA8*mKo}AV*OVlA@vG@MR<nMf94} z5hB(<<yY#ii0+S<o0;Y&)mP=hQ7F&}6POfa>vhO8nYj`USs{8fphtxi&PHBD%0<z* zboE=<2I5vKdO@iRKk7ngWAt^x23e}WB`E_?W)BdIWlHVB13F(*7+c8Mhx}lR05xF+ z;7$A9m`YDN!rPHKXDmC|$mYpL18^z*$5?MY+t#J>=_Pg4u>!C`Rx;hBj^xnL`4Vac zibw94a$_mqbSmGy6LbNLq%iwGiMZkNu)?}P(~u9aLhK5NKbtihjJXRd!M|8#$atcZ z94i~=wNy$Yb@;!@8Xr*4Cm)_q!EV#ff#q-}a1y!QxIjc~K{Lqj_{|i_EGDZts0QF3 z6Bx(V@28Pg+K4G}na`i#r3vd&vi>2zd5|ABPg+cs7?$^?>dz-1MYbPejw`E2h;`Tp z{oK)c&FZz1yXbZX5XYwTC!<M~L1@gTgxx?^!vGLK%ISnHe<$QwSU-u<&>?Bcr=V1Y zr-{sBg2?_n^j{~SP}P8CKVzM52Wm76fZj?9u^kdT-l}5BJtKOUr-&lhf9TNn;0CW$ z_B1?8&D5RM7^mh=wD9g{*-Y*M6Hp=}Z;_LYN=L?R!f9WpI9f(9=p1|wytJCRh;ju1 zMyLRwwRC9_5dzA_=Pq))CA)v0)2%H|BF>0O9EWU2+4n<~4j~aFH-RH;pJcxJHuKtv z`G5ttl%?%f)Z~O!ae0;Jh=M<;WNb1)T$905n;D0{ceK%DCd9Fbj4(jhNcV~PEt&ly z`~pW4!UcFm60um|yezi04!V#9X=0lW2Ymg1-{8hD{077$fYlY`)gN69x~Nqz4Ir~! z+QSF^CfotCq*$?9FrpQXA&|ySOB~u`qXH?3G(Z>tu{62|id?<G*3_YXKZ{t*C5@6q z5D!MOXlfpFy~f4_FiUu)Le&}k+)i9%x!w{%RahfP##e!`w9c(wvCN{d14%?(+2AKS zZCm2->#K<L8I<HxqH+ABn;#`9{FNBk{0ex9O41+mb4_$KZB=xxv33$8rSWqQ;!;mI z+*L!WUIp<r0rDhNhk6E*@(3Z9)T&XU`I0St99aY-6`jFaMzHccmc<{37dUfQouK~* zneRbUmcX|Lw3WE;FsOmu(rz)BiSPfHK&}AowBt|CCa7I;Qg*}EC1$jPNvTbFXx9Uy zx=UR!a_Kr`J>2aZ#T@9t>n<9#nAc3dM_y_RCW#C?onC8S&!eIB9@`$D+-8<>%%T(Z z7{c9GX)c_bjMn3A)~}ix&S;pfek=So_|-R!_v_t-S}%nBLsmGBV4Ez_jEvqDANCr< zYEwtpP=SFW?$CJTgb48c!!O`?i+mQ=ECv_m%!CQI7C1a$1q|lpYmpthO+y?w**Ihc zh7X6tHK!H;TQ56v-w@Of9C*zs&(oDbtW*t1OL7Ok)WhIQR4y4CzC%_gEa@P#p*b1? zgiQv;bdlkGo$%dl{sPRvRhw8rHY^%57(cE3#0!fFp^n9)P>3NKW<{^UU6-Mjo75(W zY$Qu=$9&TTDo!p&(Wu6yhP0#VJGW%@+DRzSX!=C9WM9RHzxFX53>R*TE?=fQLj0+d zhvCrpAx2qd&~O@Bu`hvWpOV6z9e5ilnZdtc$<)T8o;@W_8&dPzub~D(53_gK9sBVU zIWCCdjb=kgok^kXV<fP@#0bUv4J0#Lz2@qX@cmoAV?g-sx?;5gADmFS&D{U0;(ooS zqZ=aUOUMaJn9zyBA1jVkbuE&*P#K7wi2B)}JJ!P=LMoSPZ(XwVuup^LBYsF0-j0C3 zv4JTI0E~QtMpAb8P|Sj<S#kodfAIyD0Nm-rjv!gYk6e%WBLV#SD~~>@hIU4z5lfKv zM*F}&Gb0rHLcFpAbqKdi4!3mSPS&}e-SJtxGu^QqPes!FJv)N@vqXmbQoSc_(#B-H zP6RfEbmGv4-ynYO{U}Gleh^!OTpilmbRvS*3bCR0S5P>^j%!n5ArJGo+f{Y}K6n@M z_`&Rc0lX0S(Q9>H)<`b23WGfDyb|ft_|oc*VS_P3RW;Rua1LCTw1O3dY8}sFTalan zsQB5_wifRPC>9plz=LTM%a*S<3XK-9`F;)Q+9vXldKREsm#TeOO3cF=BeR$pCod`o zV?T+ba`^tarQgp#iJG>X{QgPjgm60y^<V%9qq*GqC&3tOS!l1f)(ed`ZgLh@NqzIE zZ@X%3tWpKu$6Hz6`6sdc(XA<jtx?&DwgwI=1BA5AKOI0w_c0#jA`Y#4prWVM@|N9d zz%hBhML*^AA!w*r=;2TsQY*cYJ4@=)c&w3S0$g|ab_(Q`Mx87u-AfjN8NkWUpUa=W z8;)><*3m+S+#tG>5Jb=czq)KsN|>ZZN*>_=IhzQjVk@-FUN{4cBP`$yIX^q269U+h ztqpx0`+MQ}6d3#T**WB8PM$q}@AJul=aYx$Qv<u<Z;aR>BCF)=&;m=6r;*KPR&p0V zvD!B9L-^j)q0veXKFaEFhTkECB2m0cAMlig(p$OL${i4PX14ND)r!-J7J7v+uD2RG zIrUT6Q&mpt1TFL#ieb|{f$fYBOIa6hyf%2$Jz7(9^mwk(xpb2tv0g;{ch23js9XZx zZ8OQu;Lz}n{}hlKIJPho#FK<m>%`(FFTAIem=zYl*=<J(t$aiE8*Z1|@pcV2%W<Z= z^hv-PAWMj_AUNO<9>5<Jtpw3R*afJ7V(aWy;hEC2F?pu2GJ_Y^E!_B1-+)X2VNk(> zClwBh&wKkbWUBdVA&|U-@8Xa`N2*l&oteIa;G!3}4Z>K1+@P65q+<pUO`MKYx)ra* z1KS`Q3Nq1v#T*h3*f`K!(dp(EiX2|xBmAmEGzftTE>(ADeLFJ~qU{*$%_dr4$p>se zp@R4y&jKUOie(wU!kWz3Pnta8{Jk3$3Z`FlzH3@mD|{LqXV70VwIiPA<Y*k8WFnre zTnfhE%P`1LmB+?#C<xRQ=*AicN<jM$y4L0Kb9Hkj4%9nD1p@lHa`Kw5?C|aHc3ihw zWT~LU<<yIAr}Gi`GI>Px1s6Uv@gKl<aP6XYbm}LkiZLtS-L<`o&MX3rQF2po6j<CZ z21!MFKP!T@TSDR8ayCi#l8k%0JEQNQlNofIp*DkC!_s;9O+r#UHq|_cjR!x0*%Bgt zY21!F!eC^nB+fG6F=L^KHmG`h!xF2Th7BYOvWV+g?b~PV-MhDM-@d;6__Ma}+qd^< zQ*F6Ukf}|fsm?C$t%4QQq&#C$A8QDjaNXD;bsfS+j4$DSA*`dsjrh!CdJB!V4q5v` z-vxY$p2N#X{bEgv4vD1Qdo=hSF*x?E#DEoz#aOG5KSB~Mu`kznK#K*wj1+KKKolz` zW=Uk>{0Cn8gk*Xe2M#o0ofgynqeMDnbSE}y^KCKQ2HtH43c8UN!ErvTNhZRHQ6f<O zk(df3m?J12#1!O=K$&nBPaZ!|33f30d`=LP^abz`-ht$FK32~tpXkc^91f61^Nk#M zv<^^j3kfesJDHazM)3s80=Oe?q&6fPEn{M10N!n`kr&eG{f)fyc8Q+{;RNGYm7}_t zaBe@!_oxvBSQ5TR!mVK#hOBR`7gUQT1T_h$>${MjeH^B-NNH-;x==uw1(t~zH!~-Y zOMbmb8lr|Q8?`J%YciIjRRs9RU%yfs)Up71Ll76sP3uHE)#5;s6iW91`v;J8tXvwe z;`p)hsBd_}`9NZc8lqq}3+I#8p}?Km<4`k=9untAM(LkiETn4YoFYWl^Z_g(e1is@ z;wGL0#oR^nQ2pcVY;!7GP(M-GHk@QthRb|7E5SxV#8K3%EPeav+1Jhl7BN`LSGY9p zf+9|Jgq;z%0g8O!o;}0?oZUea7zpr`Usw!HU5y!~QwRF(%#eS}Vwx*+onn<TURDD4 zDLU7Pua$`Z6@Cl+t%PXI>Bg)L$O@7a{0X5<!Be<XrsxPFVhBlNJ7w(LA4fb0!s2`7 zCbT1t`X49CA?1Rd@{Sl$O!qp=(Zq$F?oPK4lD0#Z(8rX=29?!0naUEAp|Wd2#&Nuw zsgOzrc4S?>)P-h84N}WDL~6NKD)8`5_2?ma+UaT^BCE92M}%YID?>9g^Z_4Dl3Muj zK<h+?=A~f}qX~B*%-gh%`fdz?msOZ~=e!IkAVYhnhED0MzJc26y~Zc_G(a>T$Lh{u z;$Bv~7cmm>vzme4A-(c%1U9Ebj?MUy&RzprdIO%;0nZ;u^*38DvZ_G`6B76nORz0? zz@ZI7TrR?Jw~_oIs6xCc>8sb2{xOP`aN1M7KG!Dz4ma;aNmz@b=jH_ln!Q;1ePwo7 zR7sKrbHea4m`Mdk@cMTApc0XN#7qGA3v5TTJ!H|`bOsa0FQY#wO3p3rx4Iv=bgo{X zKD2u`&t}9~HFCr)4z}C9f44a_cehT{&%?R4n`e_v#A;=E-AWw43*t3qU9%$52Qtu) zxs)Ot!--k=dO{yw*TfBmH6)Yj!WwjuA5d^z-Ce+kk{Vvrdb;A+PTmg;_(^XubfSM; zU3cslvu+j>b@D~*5}-(C6+@4mW7U#X>K*Cr9;=R6qrIwk-yZlI-n(Z{6UsGsQg><h z#j>iOyYoQA=xPOoiR`<2g8^n;AW>WL%IX?vj)iF5l(nH+xINr8%7Eep6(oxv-SlWv z&T!JjZ=qlgn?Nt8tE?qaTASXX>4}qDX0i_A-S_%fCUIR8_fF>&OhUvBUHJDS0P;yD zAqgvzQgq|w+^C7FX^XC-;4K8)yD=DJl4s}ZJnM~W6SGbDY|DD<<k2vo`EY;?eDf9G z&+6(eDtFz)AWJ+@gt3FoHt9r4_XhEEhgf;&d(ejyjyA#e^ZLXisA>_4Ibgs*$;f!T zLZi?GNZdg&ikB+q7$oqZ;t(fS&9R9^T+z6gtC5xnPf<7|qA@1y#6LyR+R=*<#lz`6 zy@}8vr`KMtg6=U6oth9UdjXzXOfP(hy+9@+IMJC6z^~*wwx^c#M3^ErjO-2R39{rd zMEnVbj62R@(1VrHt&j%%0pdBI!)1B360bvs2qq4+ZYmZ(#_DlZgp!0lg5|WYFTkM; z;>9Y3G`dn;LG^iKB#@yFA!NF7w+|@FI3Ga_@iwJx<YlL^EbNGLd&(*O+QhdK#{GUz zW@zZ_S?vZz4y(z)PZuA~f|}r6_8Mn<4m7)5{Y8GG^EJJuzn4$H&dYz}<?ng<2VVY> zmw&>AZhK$?JCE~cp&s-veEmOp`Bz^4jhBDtWf$ivTjc=q5_;`@o<S<)IKrmqI`6dd z@^yZoy1ym`sJklapW4~~1_q(MnQ(64h5A3*%Q3Y)w0kY`@-^?93^C_+Ug#!R)^dk9 z!a2sv-Mrkx%P%mOaN(CH;i&Dv2gY^J;UT{Z>wW8nu6%3zs{D00HUKcHIc51ALgcfh z@t;ibivN5@{<HZ5g^l?Q`HuX$d<(AG{F;28@e6Hu+MaJK+==%)3w`;`xUYgEW`Q&m zNC*lh`3VHT5l_*bT?U^f6SXZM9Wi+)6V*%#JqhnzfGw5U41TLhg9C*FHORA~q75{h zkZv)(nUgzHLi~i!NYeg%a5{-T`-Mkd$ksw{Kj^ZaXDngM12Cu4e<1?+0QnwB51s}N z`v<HHXF&|;!v#%Nlm+V3X!h#8$PjEt4++r#B0>)KBkjVxM{FJq1d2lVSL8&IGmWDx zMVo|VM)WKXmNvqpaZv{zNbOTOer|9I%d@}xVJ(NFluuncsYNILS*+0|bm59eiIc{W zvw+EhArBY4F%}N{SidaYO)m9y`~z<WFAbbMa`f<mv8Qln#>e474jgsuz(BmgPvLMJ z#<xn$4~cyj`xnYEtcsgw_#+Xr_<ar>=p13-V=(xj`<)s3B%D6K5yb>)ef@hGvQQaQ zwksgu{~TZj-%&hM8OY)t3}sOMxbrL?BXdNi#~pb0o5V&$z=;C<%KM<pdw`XxG7Ls3 zSfuoXxCjr+qFk3LwJZaM0$B!ZUJO{2{QiGP6!`dm84|f&4#5%9@~j{pfFyy?c{x9a zC|bbp6h3@DSPTmR@DcC=;L~_B1U~4Q;~+G_h9r*YW+O{C8z6`Pmip)+QJ0ml%J3*6 zaQ8_>Wak4PESydPS)8fh6Go>$Ca0WW`mJG6OkPVSW7ruKhP({z#~zl`G86WQm!qqV z!P8!j%*w&j%{_DyJ@Ga6kWiRu8dm2a$qDR8xx%#IH;A8mJ1&sdlDUXg1v;?sdWUDw zEO<^+uN9LwMZH$usk93gU=rI@SyP7QbNBKbd22pz>_M&hmTnwzC8t|?S=nJ|*%`-8 z&iCT!i7?vJ&NVsAI2aGofTmV>n~P?-I74I~IU4ydgTYTaXV5``JesR!00BF~c7gOY z?SiE%nWYQ|ZAcHz=cNrm)$<uTlR#fnnysr%c8uPKWSv)VIP$XiV7Pfas>0nl&DR+S zV45}Mye&Z+X21$`-AF6`Cen%r*$UR2f4m2+AZcqxM_Lio8V8K64fJs=r&I<r;1D1t zs5lzI>T0Nw8m4i0M{_4{^(z?U6{+IiMymKKR*}`?AD-oRH}0|uXyNYs-Cf6OeK4g4 zDKXv!mH|$)rs^b?Pn!S11QDAt^n(6^Bb<ey%EP+UjCkQTt82dz5GVDXuWA0DL81Q; z)GXz=2nR@jU`-A>z9(F6ST4h*CPZx;o=*AZ9hlbX@#Hg5MZgtcub}qL>8>^aC7e*# ziSK`sTpP9L|7T#YSBF~1LJHT+GYQpBeP^74vFh2R+C*2Jjg0ozqdKq`13DQ?J(GPp z@pSU()YIvwGf!v7a&qKl9*PcY7jko(>)FdGwN9?<7gIPFI=zqsw|pzClv-e=1h<6z zujemgLN4UA=Uu7^6!8N>+B_7S$y{{Tv$=UTS7<}o`p8gYHRlrUB`eM>?m)2Mh*b?3 z2s*ul*J}Z9?8e0W4Mj}LsbUE}pynbRM00|$Ag2@3<IZ_R|0ZW#u>E156L2{|K3Zu3 zLE5hJ)s$)lE0JQ;WE+T6Ovmizgvvb&M1vj#=L@4CNOxR#@<Won^9TW$z^03=<B3Z| z1<nxaXc?;z#`)&I;gIHU{yR@<PUB4CInZ8HI5HWOX07VA@^l@W$Lx5kDBuB9;vf|S zk<Ftlg{B(bsxb$mELynYEVbrCe;o>BHnFED^G?82V+#(DS+>7oB?Pd^z6ttg2Le2_ zl@@9$`7Ffb=z|RULR2U8`FGM6S)P+7Rb=yZN6g>}bG^hm7yQENBhZ6N)kh?<my@Qr z4o9bH(mM+80BpWJ2W?O0Z@OYb>LcG|qoXwmkO7CCwB9EC+#kVZ_HA?4WsrQA#S%!n z(tZ;p=PGp>O&vgk<&bn5<b9t8b-uqIJGCbg)dTbW1d~Mo2LXfd%!4|fO{o@4Q3E8G zvv77b@kHW5ym>tJkSXbMW-{qK$5OMh7rG5tU?6cZ^+e)TIM?|h{1_i|Bd<NGp4Aq6 z1bn|?>{u;8OlvPFufq#355$S%R>x`pmUlD8>v^%!i_lSEXL<!WoaqQ>jq@;G=rL%) zvD0KFc<ZK1MV!T5fzCJ2|C@v3c0DGXfnLi+hvu_RABUt9Z)j+j0#k?^%?@}%!712S z!naa|Bh?Nc&p7sR>$1aTGMeugAST7`KydG2+3<U<aD5880gMfRPB3-Qa@3a{z?*J+ ztG8Ag#2<0SkIs~F#75P19%HizaWW5dvnl+fy`L!{SVOc7qeXYcgrCN1J#}*Ec=6cD z6DKeq;o42Q!>Qmqlx2XG<V0nSwsgNbWu^@})RC+v`A#~nEz$|A*?Bih=TWl-GT1bn zW@p>8c*<r#1Hnc1X6(}OWgU3<v|@DVbUOfJCM7!KpG(`q*l95-oO_fW&e}OSH3r1P za0{OO!;bUn^?KF7@y7bN<AOQvxJ^B+cwS6$xLsYA1CNt9C1$<afOAheu-0tEeYM)8 zHsiiVU9Yy_zE-_NZN+_^x<TED`+D_^x=C5cV}shJI`QT@^#-+F?ZBIjYNy(TH=9(K z>c)NZ-3isBZhkVMZnm#qOb>6dU!raSL-VV6FK5H3K6$^jx(09hd0LGBri}Ar>>C$( zYRqo6dpw0xW4=?)k4X-1vo{WRqP=p84BEaOeX#@KH>z9J!6!i~;^dfT)oto_)M%I8 zrP5<5^-^^Rp>B1D8bG~z>@KXocdEm9ce9D1Pnfwy=@Vvp%?UGo=7gDkb+@_)DR--r z>Seg^Q7>1gaNn!$RYSP%lT&7RdW=40=72e6=2mmc%t3R?%xy}aGIP6n6VCj31m(XJ zr`x<5IUK@CHILzbhbpNN+y~UCQn=r#Y&C}aVKuJK;r<=!yHr_CAmv?ZQdRKgh?-JW z+>ff7n#O%lomUR-$HwV`)m3%GJ+7WpGwK4KPKciIMK$|me)w)Rr{)p!9(74Ia6hRQ z)Z@6nOua_E7WbE{?^dr<PaxGP^=9>?dJ0eXK8<B#cnFB=dz@W>&iS4rBcPr!xh;CB zw<^>j)AAt4_f4UXn(PNXTWDQ%B3PmU@S*N1cLz|7<^c&@bW^3@!)LM)<nKN#oetz4 z)Dg5P{t?bic!;>1YwLy@?8{4OaCXZIDMdHYoyMw+lkCYjk-e(nHU+g{RYDCIQSb4c z6h!$s(4rX`Wl@h*$Iq25*wI5K4TXB~42Mr5hp@+Z!*|{grO8EHtjz6fUKL6zAX`PH zzV6sih%(iqK#Yf2m&b7MUw9;<^xOT!yaCS%tm|XC10D>HUmwJQz;1V^^+>%*T=OC} zG$u|FsPWe0RQV$hoH|>4@E#~c76<P+a{7#HxLKVh62ZHE#fqOLq9x6lSY-?ouin^e zgukbdZ7>RFY;3Q&UU3LUY$`Nq9aeY^tw6-75AM~wNNma>eZWa8R9L84#&eGoiaUc` zuLh+iBU7@J2`<tpoqdoC2imAcSpPR2YAvfgA$Ah}F+{;65W^n8{j!JWgtM3}i^9II zU>9q89K_32QZ=TF+y_WGbo<HTGEu*}=(BHAv4qt$fAPBeMZ}Q<8^2<YXrm;U<19C4 zK%xj_oe^%uAmI_D()$4Y%`;~GGX20ky`C%U=eJ$8*Mf}#XBVmJLHyh&aKWh%z|{Uh zHX^V~%N5F7c+WF?Ai}G+Ks73X^BWi{km*`%lWV(4ze++Ka$PO4*5KIfL~*S=uY)RB zqPSl2-5_tSlb9QYX3h?s)zTyg32}7uCXrcrZ9-=r5i%1*aH(7|&n=jkr=hRzwP_i& zOC3S4;KCs3h&~Ib!<{Tohe%Oylrw`B$ScSqBUsYAjur<|460vuOqJ%eB;)whbR9>s zOxpJJS;!5%HlSrl2#$lH<WdO)EC{a+m9a}x1XJbVbnQ7RT<f!1z{7EzDR<m!mm_72 zfR9ewkWjb9^-_-QwUd5_8iq93TgA{ZVOpGZ=0H!s2crbe5Sm9-u_oA%bF60x3*Cs8 z09`K%*(6f=9J}ifuf_p<fL-B104FSgi02~CzZjSd;Dy#F0nY#cKxQW$w@?WmCk;Vw zFcJo6Or)LL>lq&F0<MBy{&xW8f_Z+gcG2S-qKImmu|@G~1V_E}B}yG*N=&f&qJrS* zgsR2TS!Nd!dO%}j(iAR0A`qz19@%!lC(_z0D7OsK!$?GGP8r-HD5mHPjhC5gM(@j^ zY945JKbLAf$laR5K`m-1M<D^-0J+p-jiWG=)yqQ^hNGgV=em2Ey{yIZGkM*-ch9~9 zR8#iRV|VAvn@9kY|GnRO{>v0{Z&M+`AQOcOhqgN;J%ScCd?bA@R9?*6Cih0SzTATH zhIR13o|jwuZas){!roe5x8&Bn``}UziF&Prx8Az{AnyAP-hN>Jtp{#B7~<dK@uL6< z27{N#BQ~AAK!Kr<W%@N721d?CWUH3;;|my~t8^hxEfu|wdCWxTNnT#Z3u$w~V9sk1 z^pQe(bb1LViK)Mf_<*d+#2TLOv_^1&F}3h#m^63!Wr15=LH=OfV>W~P0^}`f20ZTz zCxmHTh%^k)$nr>+#!#nV;DJ#o%B3|*XhFaZ26tAtwRCG0<<nBm2rdY8>PUFuq%Id4 z+z@}#d6RwZgjS%R-vmf<u)CpE0xrTKc-1pbYacw+y$6n#`}_NQuI-3*!a$@jOm<OH zzv992S18|r)3ud7-x|~#NA38XhBJ{qjWKgB6IA{epPu8>JMm;dWjPN_9*lyd>hB@A zh&(4xJsCQ(Fh(r_u$Y(ua~LT?GU5ONgcF#sK$OGPVUhkiz?9S6Z?NYw6p}U4FkMWw zgOAO#@&Gxx(*4nOp&4>;<P*(EMv3?#DIX>4pIDT>)kP=K=qi&<RL0Tkp-Hg8?a*w5 zgL%;Q8n+vAA;j%N_nkdX?E%bq9ToXnHxudJykvQ3UZBkRop%IqFWDfcP~#f*ag{PP z39*sWOBmQ@+*d;Z+^jROu%^FXwx$~7WFSI|;{8s5zCs<SCp?xG>e&$ch+HtTEOOdK zokzY3cH1l-8yE;lu<tRQpl$FX`kbYa5qP*OL)8lMd~gv<v!ODb!GxX6yt4-w63PlJ zJ%T)uwIOiyWbmW*SwXX0qd5UGgZ#?k!hrvD7`}#sXv=S-eBv96SGVb(CFjQezjE$u z&=g{dD;z${&yjYSW_{ZV@m}&~ZL@+iM2P`1vZ8>~TvaahADjguhi7oXClZ%}9J~%v zmq#iUEw9A!USLSLuo`S4I3fOs4fThKJVeoM1AXAMgRe}=bAGE(Kv4t|fseDn!h`t_ z4wMn9-Gv9(z;S^|Ko|x=7g%02JZaV3dJvl+FN-{c5_cMyU^yD#6NMd6ROE7$n}5%} zq9)AEeYtu8_(DiRb70A|8o^uy1wIaCXR%+CiEHK~7XRqzl}5xWLzo1DLsUN$fa;(a zFj-2ICn}}!1s228T6wpt^i0sJPiDo7XkM_W;KvaAoaGiy{>U5VPeg6h<p({TsEG8B zhJi_n-nb&e+tDJ`2K>|0Q(hX)@pwc!*wvVjSO@~atk<e){w~AcVdyb=3x_@leMxDO z?kqjZT4o?^vz;$;WOJ+_#uFo|U9m(*^e8(a6y=$8-iD%2R7-iffSwc-2-99p7wY^V zVUSA|<Q}rYX$^YRc{{&RGK=jn&p$M7&d^FJ@UyJf8rCaISnJ3D-XOccqNR_uT2jMc zS3_W9KZ}+;Nh&H))*;2EN&;<<07Q_#PQWfopKMx$3qGN6HbeLu45nG9YM^p_ZLX4R zQ-z-dX$v*GjBTWr&C^m~E?mQ;-~A=PY;H*Wgs>qUXLdI@*_kwH33$AM^Bm+va_GA& zjr#ZW?GLPdpdQ9Jz~ER=1}}|Oanv)E2zt3k=vj#3b9{<?&~Z&Hw#m@Hh=pWqiDO3$ z^>Dm6FxQ<jtNf8R4yC|N<035$R5)oGC?7I=8?P(1iy;9I^A;3uvcQw5!TC#Wu+-yF zN9=czU(oYN$66wxIb_`|^pXV4*2F<C${(Es5h?vpLhH;?=mrBV_^u9ud{1h(+7uLV z97IKMj5ez^Y&hqnp?=obUCzmhswoD3!{IfWldWF`xkgS`8N=>V^bfH&l}vfc4H2$1 zT9Y&v%W%>KE`Y48+{F5Q8-m4sc<o$-J_e8bwp0!4Ke`vJV`;k~Vo=bWK9VJ}s`|zO zQR53a^2Ut~Y>fASZiX#^Fz0aukDNBW&;yjJz?sIF;s65;$Qt-97gm%NMSiL?gUV^O z3mQR|&e<hJ3J2p+;ZB^XdGa@hHt4MvQ<ak|D=LC{c+L8p(v&j-ZVOt(sRM@>WEZoX z&Zd;|Vk>S+rZ2korsR5!Dx4BG7?$P9F@MwY0yxyo27b-q5E57cpDua<%+}@E&(a!m z(H^E_K#N5iolU=ZT))vQz-isUH60%X{lF}iYxTFt?D5-&Ip*gIOP}2|`&l6z@1N}& zuZnG_p8)52z{j%)zpAy1(wJVs4;qWcD4Q41!Q^lo?*86==3)QdkfY)}i#7TL)D=FD z71c|_DZ5C&9bsX79q%N9zs{$DSC=)lSwzgQ2P8))-773ZMBX3r)ndy!m9u17*PBsz z#MMiCTI(BfaTo8n+^A-zd$Guavuzf6!^W8ZP%zj>;IKZryhlMs7Wt5$(d7nsJQj<D zqSh1#-4dzw!azLCy^jy0!2^@pv!yBjustfAb6dJFz-u%~(D~Ba90BJYB$=pxAm7CL z!F0a!PQG2n&dKY5Bi2YI^PrM6>6hCIWs&A_h(`{_f#fWItMPM3a6vDNiuPja8EpLV z48=H5>|5)}Diq$HNzB6A1<bT9ct{qNwlR3^QMo7cU?W5fi_Y(YCmUEvO%F>REzARi znkLQir9S{w$MM3>8VBsz*z1DTWR@s@LFe4Q)*%Z9ft?;7tEFQnYeP^9S5Fb%mcVzw zHr#pu@+)jV2AlKg4R^(UVi!n9j-^9Y2QQ(A2YE&tsgZ@|_1$kLSO--6+)detPdovc z=~OR#?Khk^U?eR1WZ{A0oN?<o!_NPLs`=7VV*sF)Lqqmm(0QQL#$YjC0cZomjmZuP zl%$Y2R4COhI!`c4z?9=Cp}c89za%5eQ#dS?EQ!k89oh_?w9k@Uf(*jagQsg>zP?37 zPNoB-Co~r|c-SzKgDP-#`?1K%4+b_a7$9K_p@4PxP74-|U|ySEzq6CBe?-9*Cmu>p zuEY?6s)F8ent1S$wZ$*Dd9iH{#}^mCE{^>pARu?>GCEgXg@YkD1eJ=b)b`pqonDJ+ z|NISvZxFb2JJP2?lZGh<&b_R_*@=KP33L!{rgtE~P2S}sH+S4ZFGAPZwe*G>O0elC zu+_#EFG-d7w2wJ~FU2}#m@h=R6?)}hw-)I+)=R<P8+ogdJ#%Whw2L^C=r2Kxsol#3 zThZvShZ|-r7+gECbjmWhoq2BKMUXj<2GQRQn<m8G@8u`iA!GN<=O5!m>LgqE_Go$Q zSTW(ytZhftAQ6E28mhQO5dN}N4A?U%)P}!7{DeiU<pQ!RPL|s6$!vzr9so1g-~XEJ z0p~FXQ0OYnY6)Zk;mU_8a)MY4*?^#4vf=fSBz9Y%&gvpS;10=ma}gtLA{$@g{9Z_5 z!Lw}M#G*v*WA9vU;~JZ~{#G^Erb<qc<wWo6t&3#hLeL1IF@Tku9SyflnXyVJm9@w4 z1Dl2Gl5XAdsT@BMpwLK4z{#s!tVXjxi%f&A@;Tbon%N9m)=Bzb;&v7Z!(DM42`?-} zbHpH$?M!ivTgI|_B^2EccFiTgp)Ya}n2amfd#kXZa-fgMKD#fNG6l$_wH<5#kFl7+ z>?S{ok}UzqVLZTvO?vkJM%p>6=nd>Bxq+Z5ZePgE-8j1$HW^R@$E;6@w=mFr3+eMW zJ_zmJ^BXg8Bn~~{Q(8|Ldb}H<$GZ_<pfE3v!_&}9045MA+z)YrZ9{p!>#&f|1}$kQ z1e}0Tqw<nA6a%2*-7J>#Ru`$0aFPlHWZ}4n*z}FakM6_a6%CA2D(0@iof@R`H^e7r zQ|h2QkV`0sIfVe5@2tbsG#hdk$mgAVa7{0y^?AMvnOO_G#LQ&EIl<1MWdZCMPCy+R zL^3?7cbg6XpHcMUv$_v{ihb}JUMPeV!#*$^$-Rqk9a9(U#ssHgYqyvYG?@o!CJnor z%@-aX8sAPAa^Ns-q=9x556@2!@Jfkc1B^toghmRQk=lG-qeO!(g8_2BpS5iQ#8#Pn zCqZGKVO5x8aMpPMf<c^E>BvokAFCpAtYqMIu&Fazg=@5o+J@JP&A8qcyz&a=`*8v@ zB!YgYU;gJ%YmPUM3UP5hC0xn<6-QeX-h2HgjxcQ`VWFRqQ)tq1rFsvh1sqdm8n`xa zbl=>uxs6CgCwe(>n$t36@~|H1##G5+s=U!ykHE!f9X^z}q~f5F#A4=&q_!kM+=mdi zfVh8=Of10qdY<h06#WM{AM>A(e+w4l*2N6!#9DuW*XUcS-@huM@W0Udc<V#(D30Ho z8kyQZASOLiiQ~JaEx^|{ILzG9$m#k`W)b(?3az?Xw+b<!XV3roitVa$Mm6;d-n6p@ z@HLfQ$k$iF*=J&+1HaYyLHX&~%t8TAYoALw@1i#?_rnOSlTa4dSI(WDJ;m=pR!0}w z8g0`40`qF*=_msA`b0F>=aRMO>+9h?YgK*27)CBE<+<efPY|V5Pw2i!?x#)fcO#bc zKHlBsKVP+{hptkyl=JFX%~G}RU7=>F^REUjVS7I<rNas(`Ybg;OW;E*OAiu_g3RQs zHlh%N6s#t{1Auov!;4^}>zt=Jp}EvJZ{P)B3A=q>KFG@-Gv+p4{+t&Pir>Vir}_26 zypSx^Vz9><q%2I+TqMV|s{(GN;m$KYp*1Rb8zMovB0?mPH}ELpfW1BHwP_x)*c8$= zGX>RN8svx9ipBV>gf*qsgp5{cp~z5eurzwk9wtJVM)5etB~`$INb5keb)@Jhh)V?B z1l<Ue%K~V)92Sg?kbUT{8|CYo<W{)h>_}}Cw?Zi_D3pybHQfoVLu?#$h->&3`XLB! zOf|2-v04R74(aQ_Gw)#p=5Y8N9AscBkfZV}jIn9o3Q$Y}4Zv4|Of8E439{JPhv>rC zd7c2_AUGQRN|~grwIMOg0rVLdAyRMZ!aNk?WMz2=dyne^EnS3()U=}b5n~MsNQ!-I z5OJyAEWncl=GA64rk)xjxzMc}M78#ZV9*MSKamg(ouDg>UnKZ!Lly#rSFJR}a#gAH z5Dcw;j1?Cx3{-p#20fQ*CefqON7+RGkIUCx_{o7zp>c^yLG2&of&EQp2}SWh6~av@ zD=GoHfQf@z2t~nRc4?qmhA5Uwo*CfkA`i0ys|Ge07-}$T^hpR{>)=@*Xk{2UBD!r+ zdA!fi!V$v{6JO+@LwM3m9Qj6|;J2KFz>bqpi}Y;kP;4{8YKfSXBX(Ja341%e`~!@> zj<-JjSs>h`VD-&O<+Vdlf_*x44-g7T5=rr4c0KzLB*1<dkbndz#=D8fT8XA)xQT<E zQVf)0HEhtzEIFWo#3vJs(;?Q+`CC>v>HIRE1*B#FhT~`IKlkla3h9FpMb?;uP2EPR zvcK_7iZ>M0g2--3W#r>WBbB-Jh4zp>N{?0GAMfmI8AVRiI>u4lC1MYr)KujPRq<M7 z^opP?e<@O-m%iW%5eAqGJe>a~YT*0|D&=Llxp%#SmRIu>0=+H&7(Qx$G5?6TKE+E& zbHY!*%19hQK%WdIvlPL#Xz2bltGfZ8<+PwwN4j19N$P{xZ(<g#1aoxk^Hvu7{k*)5 zm-q4#qQVe@RySqx0l&ZUAS+O{p%;ulHaGS1iSn3UuY&oRLuCm4`~|w@KH8|m?(&&L z40!-yz;qh=9fCgeF)A8;WFqJzTc?Yu5MhYJsQ_Ux6d(+V3BItP4-iqnd*3elhzw@X zxdIlS_B#|fL!S{8;*6kct^r+eDV3>k6c0YSm_48;#bq3#?F`Iy0MUt79ap3C1*}F~ ziOkZ9jcWlL*Mc!XO$~9+O3KG;!MXNynJXtV`ioJBbu^&D8A}=7mcqsnrhk`>BZj5w zM+ep;0n-=K%oiI0eKFGAdsc$PWxD%C!#xgXxEHC#ffrJX0O7Po5KepXK1V^dLh%d; z=huiZKF&)MY7wlH)08Oe_m_MRQBOJotrC-qiQtIeV8u25!EPJ)rz1}cWbn_nt2X6@ zpq@f8fd5bW{ROP^o2dGKHqv<x?TyeX@KOib1=Pnl%(x+hBJDziqiGkSpXAeN2%Q21 zB$Ul^D2Ub!J_^c-ZG%s<v`ENDL3s)JD5&*67X|%yzjwb)6hwS2D2V=A0u*Ec1!0SS zIRzBdO$2mV+s*^K!YMM)4Z?CFVMs`1^o|SLevN!8_E=qft}R7A8dPaqGglnLN<z;R z5ei6F*1u-^G$~Ik1eW!Sf`K><NI8-OLL211JSk+B@=wL9whqC+XVo;bADVIh_Yl%Q zM?m0PLr8@PLTZD%uZpczplINPL&9GSw3N|kNxD(UqBw5)2HT)nq3zh^wgWq@$#rD@ zbFh=3p+EI|4QL628G8BQVoYBXgZR00IjG14%Yr>7+d)to>9OoW3!Q6x*B8Jr0&|7z z8q9+hm`33=89ej+iI3t-wviKG5jd4Mofy!&WSBz%jih-h%t9+RmbYUmr&|{Is#w6n zJiis`<rEpP)d~}ZH_2R!FvALubE*Fu95Aip!5$CH+g7sICfeZY7i=N0QCe|s1PBP! zARDbgy}i*|Uj_NQ*JynriBwH#&w#j4iB}{}b7M=|DP!0$!gWbWPiYQJhuEXg^~C5T z-1X@_6;8;Y2b9=5y_5-cy*~DV4pQo_^9!6=!kZCFdWyk!quaF&OoLC;c-LdRFNeE- zVHXG=CJl>YFLUq7GiTtsO3vue(8i6G^W(gP<gx6n+B92ZkV|q7B&$nikfw8JFh}c$ zb;3Fj|H~=5#vlVG<9ksJ$-HUGZzP}Cx<<4h0Mv~Kf(l)Z07)jtll3&h@D0C#?=$3Y zK9w??Ltm#it8INg!>%Bv(J1wI`4l!Jpw_$sWVLo(DsdAVBRC1Xq4_3qJ&g9v*P>dn z%^`PVQeonMR@gnjBXw!o2VZ7+SkwW|7xAT-hPxv1SqrbD2;n)4dyZ@nm;rqsrqyxL zfOf4;Gu)jPdkI`Js*#py>VV_uA=;j*mFFoMguu`jg)vyEjh9DbVnJAX!a5$3C+Tfp z!e*q2#?VjeH&LZjE0T8WqR!FvNi`-Ltc}69J_PlUgF#7>XE;~vS!*1wdEk}D?GeS! zh}J=%QHc)#7o{a>p&~7Wi1aoF^+xJnICh^sYmd%|_ej(1-B1E8LyXSGjn<S6yT*Hi z##62)YDQyGncE1QT(O{XcwiExi6+BP*FyWqL>1&On#28YqB&(lF(9hkiCBHQ8AVe3 zus(*TBfN^Jc<$YII}|+osILJv8egqUtFfZ4aDsUOUK>=jDC8<i9XdA-B{TQ6Q4A31 zV((zSLu@be5@i>-?mB13M3~5rnMil*tR#D?o%sAJ$!AYfCME?VH&qWwZJbAgRSgET zb1;<=HGCBVvQQld<)5WJkUI^X+L>vQmx^XO`rRDVfNmhbP~{iGXlNz)plNi6`8rw$ zIReW?$MxxY(2M8^u~S7k(4fbWh+1PAs5BU5eDZ55n&i<8c^0E~i)s#A49~?x?ct+< zZN;21GfQx^HHKLPrKDa9shwzUra3Syf;O^fFv$RjdjtRx70sJ$pZc|#!~GijLq!}7 zIvE3DmO*e~Ke30XjXv$pjn>3kqLcFuDjigtW?RN<IC_x}K^3C)gYl8z6jR)Suh+|} za#op~`>A8^*F|zuHBo-VjcNz6No#CD1hht-l6%e!$q1B^F(lM}F}n1~K2|(Rh^i$; zD_R0>fxFqMX{hP2V&SMnV@02rS55*5HjisG5k5z<##E2E1Zk>jknAk&N_PRfLk?}` z<Z<a#CCng4RvT{6oIl`&40srbtdUt5!4{DfNS4x7vGR6u{Sl_YOSC+<9a4p6nL;c@ zz&9n4Pie5MLLW4%&>|L13XNO}CE-~ynV98M1_Cp>$xG{Zl;-1Y)*XQ9VUDM0%~9kC zQ69_?DfQ>6U@7MU-tm|j=njG*-HO$$un1C*f=|ZfdtvqO0Y%mZitN3h$XY;=ZNM7W z?tCx2hh-WqPb5Vw34z)|%i}E&N#;O_@#H|g{vE~o_rJM&_wcyR`@Rzx3<d)b06`L> zC|OoUpd<hiNt4vYGA+@9KvJT^n@QMGbb~?6@B)GZ^2|^qhXW-wRa;GC$4R@{#G7sG zZ0g6oC9a#z<K}UiY`0DGN1FAsy}6S%b<<mV+1)m6wq0+t-Ou;;zUMvX%nU%%lG>&q zad76$d*1u|yI;bTA2du5pTRam54mC4={yTis(KTY1R@y(0s`nDDy*-8;^>S#?mWJX z9SgxIJFryM7lN9G&r*JnDch2B9JbRH8au71TPf?n!)NTYTqW3y>ykr;YAJ#P!0Lm? zvbv!GoEh~w9XXjw!<fB6qVskUzN(ZRgg4Ja4yqo_EH5WMQ&VaI1S2m=8pK77lN0Jw zlO8uaXBT;LIJ5kN)iOtMbviW==Rn|Faiw%tFD;*6JYNU$3t$KkF)83vMS|90#@tBF zq=%G%3Z{NVA{sXtI@p402!@&J<trDfJ{q<8i`d}efCR}}GQI8f^Rh*1W`Pxsn$C0` zvBAwut!^QNaa85(4G5l8svqVL-wenZ5VuiPp;k{HrG0Z8z?Ekx6cTvB_JGgnOZU3P zj<zZ4sPlS<|A+_5TI(0t=L(%+(`-l~UQX|vkpki>?^i7}0;n?|BAMdaOoR%Zi$?r$ ze>y)isdk+Gs>4F6H}<4T(wAtDGJ_chsl;^GoORN@NW5@67Bi_cy;hioWA&S?PEy%U zS$wf4wI$tFwAHk&z<#q%r*~r;zDp`9(SkMEK5L;!cl=_$>*U<X`pHi&=;t)QWV;LD zt@JDvyhga^mamJLap(LQ`9;RHrA$N*#=iHQcOw;1e}+yQpLuM0#PLCYQ~2o9TnO+I zBCR-cq?`6MIn7RQY<2*$K#v~PMa*SuGyWZ?SIF>ZVL6?rWHC|gw~BFxqd%+WzN8nw zuG(|p)|d1sVZ9s=nVR<(0uT8<@sDyvRE)r)X>nbyOBaG6--n9*o)emzz(c0$Sv1y- zrq%gP{EDfpJxlALE(|!inlGp!!JHvMR3Gk{%+~n6uSVPz+2xQB7(__kGwz8DOQcu6 z9Uw_ANDy0<!6lHNIMUU@>wo&%&nW)uh2E7a;)~pc9_&tX*GpLFU<CxS9Kx=J9A|RF z{j7u`8&*lFY4K!*CNT-qKfccknWBsMBq)&-vj`3U10sez_GE)irM2B~rcY^}Fx30q zQ1?ia1h$m?o#qA-*8bm3A|O&;7D@X2$+*_bpET>1$MZe);R{3bZy(5c6y&^>k&N*9 zVMEWO9zFMy_ILEnQD-%z#J<EC_%xFncGxL_y^eE?3{vM2>dyjzIhR7w>IY%{K*Nee zZ3JWD_!nvnE{o3S1FwF?l@1K4^ZnCik6BczJ&GkJyon$njHOWoaU!=+@9Yi2d>&QP zl@u(ofX7e(mr6B8VsUXC?KxSUbRC7@R(f8G9GWH0XK$=<7?u|<ff|j=StQV0K-2!a zO9J730^FGCD4vPnzY2^~=$<gH!%3P=H)gS_>5;mg#4l3|7V8i_F(KnnQ>ZbGqUd<+ zLX$csx8t0b%BB!%b`AM>332K>L%^v4bqAO=xEUy{XG#;b<?_-Qf`u&C%1cWZ&OG+` z6Fj-FbmplKerWl^QteFnLr;BhA~Y#z=|bSR8dCnRe53v5w~Ni(4$T?}z~HM7M7T=} z?7;h!uOo$SRX;zjiOJIBBW?xoBYS=FktwR%X%A9?bKDEvUU5CiB-ae%=m@tHzEOR* zGbfoBUe{0NiB*w#5_i<fwv~>*^NY~+y|_%N<Z8G@A-9URC=}|vttvxlw=qK9hTdfH zB<ZDzQ;(7LSr{(*ySkXQu~3@}5#Q3C*|8a7Gt($Ba*-j%2Xtrh)8C}r^u`oU8%iKY zYrvmthu*%bD!;^=ts$VD9j!xEl*K|!y731;`UT1<3Iv&?2}E!B&^`gfx+2A)WV1Ge z6Q$7ZxnGzNjA+?P6?E9KhB9Rv=Xc1=*%XLarIh_n0nCO_QOW{}@_p@s%%qWEcaY&8 zr936IDM~(az@xI8@45abuALL|6fy*DzWi#RctTKOP9ejQ##@MXMZd>DHX<8Az797S z%^|5r?RT>Wl$5L9Z_h!9(K$W0XXIt42E@6%S-`IRKABCsI$e-$edB`qHbK~+ViJum z4b(xvWN^nLQC^8=DJN9=_X5W`yfhO1T8869Md>+C3}MZlYhd9_UkariyoOxU@D`-M zxTIv7R`KBHp?76ZFcs_SuukwtcQC*Kbo>OumNnq-Bk7!p@CWljFg;ZboSs`TIoRwC zXsc=s$ac{IEt(F#WHIHRW_R$H5OU4dr`{r&G^W${&9TA`@q#R^qvm#*;<FU#!?7N1 zo$y@V0>D1PSSxn;FkBAag8ddfAaLw=e!~9=nQ=sdN4_gS2Q+y;tQ-h#aS<+2ZPRmM zLX%<(mg|F^t1y?&PlhS$m@9QN_Sw*TP7GzW#*@m>9U4o99V+gQx~`T%TWO3E$_qYS zEwAhJ#x%<#ZC4%knIz0v^p&Z|p&+VjpZW=NM0U$}RRZNm^uDBnNH@g>i}Am>P=?Q6 zCfosOxN&sD>n|#umY<496k-YR%Jr4#!me}-xDy11sJEwnK89b*;hN=*deOCZ{7mUM ztsO{OJF3>6k6SzCT6^xg6Z@W`HD38XwH8KbAbaju(3wbI!r?<j29%RF`7FdYGASTT z1o{0Vxy$)eDV70?u(v7H>RoALBcgBf_#X*Ws>VW3W6y~UbI>-KiOJ#9@+gq7XTQsF zIvN?m_@@Hw(8b<@`9Ugmw$rj@j{br!U(&aq;f|E{XQ0HGe}_K|rx+4RF-FmZP(VMT z;QB#xgL7VS#w2xNiwINQ)APS*JkorT`2p}<0LX6zlnb<v@+*7hBA=zsS6n&(e4DFF z+o*$#Q0!5V5uV_~b+VP2DTi1exeuWIbg7^XrpiR>qrlWYlj30~7CmV&6^}oY;t8hq zz1ip41hbJ{_;YEPI)lY1rlK$f>%!KWiI~n@x0A}b1scFY#Gt^#RHMYhh7ve7enRKm zi2w~sr1%dY#Jj>E;GOE?rme>zgpP%q?$BgAka}?en=+JB4KXc%JxBI?x*9l29+pb9 z=wgQ}>?V;)Fe+HNN^y>~^7@6KIeMBdn$gs$p?PZ{1Hg7!{mKaMNaS5s$!!3qxH=%7 zro<D~6Gs&y1XNQk9gd`ju{a<0`3PFQ^ylYS2ySxN`C=cGl|&@DBAKXD>0|{|w;R+4 zicL*BSu1!z2nH;Q<jy?kfNzBV_Id^<u3JF(R6UDM#6ZAFr-JY?=EAC|dIxG%{d+i~ z1k`uX{_4XkuS{y*ly&u$NzI$P(~P-0&6WSw{Ygz&Iv=Z5=ISD_gw@1ftB1c<i=Hc} zdZvajBLOB0Iv{>`Fj>YV29rmj^<2u*PN<xBX|Uzpn*wWDL61S`|CEBzZ3al`z0?gn zAH!PMz_5X4Bh(W>oAy)t2ZGC8Kx%6^-Ne6APfWwIIY)*V4?o-dc+)QgnbIJm)D$i9 zTYHHM<S|jMR{O76_%s1eTsHupuRX$);R}XYOK-EkIiM)NUT(7=`3xo__KAE$m$yOg zQpS<Gdg>ev7G43Hg#~)PQYCsi86DC2n=TR9M`n5GJ9fN9+u>BipwofEln_QPwMkOQ z1S78l8X>IUe5{E?`f3z#qN4W603j=^TrCOWD1uKwIhMpwo5h4LS5Af0lu5N|-MJ5s zv_nd6)!<WEGPE!kS=u`Zm*iV8?%!Uu`SIW(8FZ*80B0Q^{e*Ay;SxctAo|d=A3rlC zLSbrR*NzYG`@qfzK9Z)Ntf*)xS4MB`ve}rLkork_oAb4gxIYX=l$z2hK#`qZC?mSo z3-v3q%y@umZv`+WRi}=zRjZruAyjTpy3}u_Q{iSfD)Lg$k&(lIj@I;Git{bT>)+bc zv39M3Tk%$2L`^$Q({}hjM?(Vx92k)uJtK0Vx);L5aj8BPbdcm)y@4eaK__rD%Wv%v z7sZ&X!|+Ap&KpLNwCx#0OKqR5MlrcDdF@tA!kn~K%;TvZJQ;cStg(vI{R^0iC8z7K z>{l+bI3a-AqikJ&;C2RfLJZ+dwY-X=eukv%Fe>io8I`i&P)<CMu$Q3D6&A^8_lqKD zj@<Bp_*dBj7*e>%VC(JAP?t8_*{A~Zl|kl;S3R*~f@_*Z(ZdI_QnYgwNC@7YctJNi zRD79zm#N<{RcXqK?kG*{+>cR#wV4TCVPB`VYgaZR(~3*<VUM&Ecj#j6>*j%!a-{M2 zEYeuQu|b)iR{WHTTN~4G;7w9`$WuufD&ILd_Da2hJ%#04ImUK2+qV`Q$EiWCvFfcN z$)hFht+n#Hv;5Ajky93|^+oqpBw0x80JVje+F6cqp1ogt+5$oh%i7Hm=GeF0mFXD9 z^w??<qE&lYKbbxK91p(xJq_MK`Hp11zmXj5bvLs`>XbdP+ustEy4ZIMCho}eJQc#= z9j!_9e=%9d@Db{=7}3Ah<o+97evzq&ewVxT=KcMAzbDLlJ~Qua4vOTxUT5Mz`pzaE zaI%E;!`*-szW^T#r>JuQb_Qs&qZ61o=@IU&Aa{lB3H7`ilRk92lWse{H8g)v{WwK8 z)>(zt04d_HoSvV5W{s8TI007ry*dGwI(z*SkSu^%fsv2t59$d(;4mNAbRJ$~@;i?~ zcJ_r&A%LBGnZ(fn{%n=8PYyBdYG3sq$5@qE2)*UuyD`pj6sp8CqF>FV^#vl^6P5fP zOr{+k);ETqzv!M@Dc$RhUNTL-QSXyGgcAAMvpmm!u%36%-u884*K4J8w5lIfPeQ%F zVV`KxTKSD;uSHkDjH#J>3L!=HzB+nKQ2=@a^IF|e8X++Pi|Q!f794$WGl%gu;%(E^ z4nr$odd?G46WWvec~Z0|7@AvJ_Z*P}_G%0+sXO}8=O{Di-s01bd8a&Omn;4eMA$t0 zAzEOB+|}Ri#f8-p#IEKEyj*-6JLYC?oSvng7u`K2?hkK%`E7U%dY*bi`AmWOBMbke zZ(S;e@avw65uXo>Uo-hK1iK4GUV5bT7z)fJ40(V({`*HwlmaCoW<vIf2ZLr8>ti&p z77v{a1s5^(I}g3>#1jjpy*nj0BsO%Yv3>;_3ym)3vdar*2{e1-#>Mm19gvwsk_{C^ zW(5>g&R$Wmgo%*~c}{gC;*HP&PoFX>*~P+GsE(9|Z>JycBU9BKDj|ENDD_Onh_zB; zLlrtLf(uJp=>pV~N2*N4ksB`~eK{V9bzhy*<LOMSA6}Tk9JQ=oOknUuEIq6tWqbx{ z0`YGtQ(S$k>4;-VC)LFr)%H%Mx-qp|U$^x#X>_-W-f@F|Vlorq+FXCcNx%2RliRh9 z<8V^hNecr=6yScIr@|D3;Jg+hPxjPF<fik9v1}r5QUT%!afN5o-WDqu41vfo^kJT` zENN5LwOg%_QdCOo1$O(j^B1pN^rmVeM%7Lj!ph>}l}K3@6t567USrS@R$&Wvp1sD5 z_|Q*c1yPn<B@t<2@z>S?cG;V%Jy~LB&Erzb%8#V+L1bYflKr{4Udo0QpR~wXQ<D$D zE$TAuWni_&?%R1$uY@-~(Edh-N)!)Mt(<k%2xjBnc(zu7>p=pb<LYevolP>bJ6H*r zUDOwx?aNmPY{*u1M%by+jYn_U<Zji#IoLfNWLKcFBx0RJ=lEU7@%KJ?-~m|qv<+~p zyyCEf=9TBePQ(G4dZYLA8Ya8FRU#gYDZ@$}@c9V4$uY;lX(amhwD@UZVWCsGzKrJ@ zAIMAJr(Kc5J-+Uq0;ec)5BQVZ_$nziV0?xXkV^7nNSaoigE#KQ8Gicx5eLGe+e z#Gte`080_>iHjx07J`@fgG+_0UPIEU%WfEEfCV9E{rk8^aeyK{<H|jtY&SB$x|d%m zl#4_`xsSV{-2FsEk>)|aJV6~jO8QpCRoP}SR`7}K!T?zt8S+m|kTLa&)Pdds6raQ{ z_>XjQJ@Qi|kX88;>bCJ!9YO2kBAHg-6H!9rZ~y|Glz%f|VEjR1wWQ<-N2RzpbUv!p z-(@zdE6>}F&5E`$_3KS@VV(p8^YcHs2Aw(HzSC8>`*go^F88@xbGfOh{sYeCiob#j zo1g#68dKlFUs>tybN_Bi%^EZ7Z1vaI+Um!n|6*HQNkG=y;!N~4P4v&-?nGPZ?i2ma zH~Gx1H+gE3|DbPjL2;YTUs+@FI~mz^X8&E?=CkW;^M}{k=CW`7FSgMohP=f_M<+8s z|Lbeabq7ST((lzqfA-cJJvGh$Eo^j~&Tp+T`JEfx%|2w1{pfEXm?W7-24Y0)bZ_I} zI$QP4wYDn!)=c$!YO|vMxtDtR^JV_D3A>RB60J*0jQRP0tRWc1m2bBwObTVTP3X8_ zvBWZ@y5F2oe6l&Y$#y71lat?kgyLaDr_Nz1jUTWXm6<hOCS{f^^32{F4<4v<9HNY< zs??rwO2jTI75K8*8_KC>48PNpS``Z=>}Ae-N65)XCRZ(YI#y<~yfB8Xy%9noD++tc zZOaFqhwY!eA&-qzMgn94VN}^Ztl&M2@(;lXy^_cvapgJUauwV<shgQf$U6rcj5UN9 zm`p^tPcO77j%2syjU>|f=HNd~lZ1k|_UOdUiRq4VwUtGfyy{9?fWaWwXlBZ%yz8iU zY9gtK*OQ+xTZ$(xU7dw8h#}msciE(%6HVRx{J+o^HI8gl97}s7+_+eVZ48^V?R32z z`Vr@YMSLTH0{P4?u`!VXm~~y7XYcBVH52$oiMv(a<DlkMYEIdHhI&bqF7qBK6LFIc zrkSq(WCwFHcdmUvi#5!7P;}RRKOE2g_HoBWx{q6Im?e}3ve-c^GUuU_nEhF_WgEHz zFq>xsgSRx$HC$mU90VjK^0SN+OfpN0<gK?eWHLSGE!5aPVfcAD3s*VlYeK3L_sMXP z{{(x!$kJX%8PCP6f6OY8bi;f;omkjvWrDk~Om(kF<VZ?OlT{*pP=+T<_hYD;&3^ z`#Vw1*GLnAM};@AO@#%JnfdoKA8UZejY#<3sJwU%fsRc@o=xNeNE8Ui-DZ~8R<=8+ zl;MqE4K#ct70+?ymzC*jJQXJKI50WFA>M6CuSiY}%H}^2ms%8VjU)O2UH*_p<kDhC zZ|Ff*ZQt4qY)A%WNxerjG98f~lEvv?Bdhclm}q<D_O@H&pLZElJfI*%<1ir=12+O- zpPrj}Za*4yp4p_!E7vyQC2T)+nzR>!*pCOvSvo2YeKv!48S?LCodBJhD5)d1x|Xdi zp2Ub3y{LtDQeg^g_lMr4_J7j)9J}bIroKC_CGZRW121}q&#jrQ)E3!2Q!=xW&<Z%| z$`Ni%kt36d&18E-%90pNM2|~>ywrDLzy&rZ1|Z+}_EZE4c+m*qan6Q25H1%HRW zhs8SJJVYg{^!{F~2UF`Zypy@Evg_<Fvgxg0i;P@qTALG*V0lF=<PUnNECwAPj!&y! zAS}l%bjk8{Q1MD^36B6s8V8oqRW5m;8JdRrtP_^#FE%kxRv{D$MnK_-kdR&gRR)pu zRNAm2G17^PW=ta{X>wty^npi0&mQ?eX}NY`sf-kMyEB8ZA}N~(Rn*aeU2Ybq7Ejf$ zFIQ&WFyFPtvAS@bN-PJ6$)Bj`g>IY|jhR9#A9f5ax)?;X3a+!?qYY~|5hI8Q5fw@_ zNW`%=VUa5w%<5!P7xwG~ADX?F3hdk5rD5_;^<84;o*_`&Jjyw)F3(i1F&Adc1!0ga zJU#}Xi8E{xr6$!b^XX5p8R^`50b3;-V-8cpQ-X#s>hgWM{Gcw1mF@Gqwl<hQ*o?&~ zAr*s5ALKu74C)E@pdG4i1VkQC=iJw|CpBThz7C|y<+UAUw7roz>6$r{qdMw3vKZ2q zjFZ6goMcQ5lNnq19AwdZF=?kPmn(+w>!)#zL$Tb_Q?SF`LWso?sAjHw6@%$E%G0YG zWBOK<t5L0<ti5uv%R7)67kPo!nxKlTy0YU$LS&N!TP~5w-jcJ+)g<bG-f_Mlw!%|w z7R?DXQNvlc@ri}gizPfFOV_S9N>6=gcWQKD!MfTIA2kE`Fe?Ohl5=cn_tc&pd$O>? zN<#c3Wq0n!?wE$#0MQy%K1P*~XR8dp=p~oHYTv=wBRy$kiXMp$EIp2~IYyGz%Dz3q z2+RAP$X2#Svmd0{r@EBv90^l*dn4JiN3*jxTj?E*g_qj~v*)pFb!&`f&l76;$!ys> zYx;?frl~G$lDULA!7}zLT3}I!tN{Tx%2yVheqMA<OkLS-_AY2Og|>3J%Ce79$AQ*E zBSdv_{>~8Ng0c9?WuY3T0$2ocI>6T==Sk*6x$r(uF9yer*&A2OtENnKB!uzXsY4cL zO`E+j;U@KIksD&-_s6^a>FWL|oO!C1{X59)x4eIPBGH^Oew&D0a%W;XoLRBaPD&cT z2uFaGuFT(D^_B7j)(CWk#J8F}dzs)ck#x@#YG15WQ|)hICaQGtsA=UJVSWq3O*UJC zOBTO{0A652I&kg^!PIuja=>U74N%jk7Zds_@u>rynLqsn$o~W)i8!u=)J6gKVS;cT zr7P7bR6R;3l_Rwrql(QE;%T=$wPB^K7mKE|B@vSrl<v&l5IK}yGn2z8$9E#V@DSSs zElk^s`=(}|n?0~=*De+(LAQrMx1(_1?Ks!atz%AFc_Ef|JX(x*+_OTU{Py&0&y&sp z^w}m(iwkBr5wN+#n-UaA8U<@*anmJQ=uVnPU*)UwYE9AtV#RjIOwkY{T~O8f(cd-X z3bMEU3}3I&(4Xh4<y1p$143?IxwK|WGO~8OW0`>|_@MatV{;I1<{jM>A=8!jFvsZ? zwQJH7$KbWaKV*oQQ0S;-$dE9dqDOoXSX;4}Wc+2Gw=dx+;TRS#oFvj892<O9YQ$|> z@3RFnEr%Hv(W!+z3%i2Fw}}%QOJO6=sx1LMx~?M<Gb}aR)z~c%CXm5h!5ClB-K<4_ zK6nMz9@&g_6bXUVVmT#KLISPnCVJyX+#0buv2~bJM)~%!7vpcQhEeC+H*Q=cxbA6L zWT0RK->0~_PUaj1-d*h@mdM_`OBJ%;#S#(orqEqKJSuCkxKugk0+YHtL%a{8C)+ut ze&GE)&VFo=RkFwsva5fo5S=q;zy4InuKqXsy|bT%>uP*6%<;Ohx_p2rCv!a`E)Zy< zzXCA{KtMXW5FQ)+4Y+116(iD>@g^$M2~;#_>7r{{8vt-j;8=1Q-pUb8fNyb`AU62X zWdsIE7h1g$ao$>ay%7C5rn!|@9no*G%iFy?T|DvDm>QF|JRXqT(0f`V_E<6lv&!f_ z)73Z0<<L4r4XfG=7Q(lX!|Y;|-)%U44#zG^cb~{Owi*)Cdzll_N00Sedx1+}{wL)9 zaG`jq#J=E!I8nd_R?tci)jN8Uy<h?Wp7q0aDf~ayj^0ED;OM!-hiyjQpeIp_+vp!@ zr2U8&D^Yyf#UOGVEDmijmuX>7P`Nxm|05ctaXc`G+xSIB+r}Qcf|*f;bM6dA)U#m+ zv@>v~D{DGGU#-l~|3o-x9qgzpkb&Hq!C8LIPfV#VHEXenO0JbB4&1p`?tHmBD3z72 zN?<*aYPAE7yCU7k$$P*vw*sK1TaHpT1Df8SN;TMlp{zvr_U?RM)uJZ$r`K&!B?1J~ ztcIjVyZK-_#WcIjt*miBOZY&A0R$Gw@%Ry+B?z}-0yfCzwSVDnu(<-raY;rDP!j<U z2#*ZbqDDez`EUpjZf7O3ldGJ*^-epxO3$wllT$Q}xgJ*%0nB;Q4dZum@%&;0=~lyc zhuScr&Y%q^PEZs;^8`Y8kG(1euP#tQlz<bM!q8pLFVGJ5FC9^Kr*-R;^Wx(JG@rT| z_u3Q;3Bs}-%N!9od#D#$&VT_rFm6+!XiX2LShS*{RJD{;`YUysz2e%%0@u{6(G?d6 z$%dU&pB_VZiJ3YGFKu!%W4<#lD@rYaoK$F+^}JG>n%J{D&E|5D1T*Ij9V5!Ufm%^W z25)`X`__<p<@#%7+mNb3qCct4XwYROXa4e?_GrEX-|5}Hh`PjnL^N&Y*G~L*=tcrJ z>p7xLD{p~?#atRd9EuN_2~kOk4%~bk&ob<~SILgBI>2uce^9c{UHjQ)?*XEKz4kN2 z{vw15YR}UI+aw@)8E9KuZWg0!&7ooP;u3^>h|FzJEtg+t4%Obg{6aauw1Iqh#0xu1 zq%hTaeIJ3$he_+Lz?;g4H$p5h!k~OMw>sS1!284G%*&StKI=ragDbz<EDRGf47%W7 zbCxz*yf3_;R!6|>pJ#L<^)dSXugb-0t~|IpTFy6zE)=j+->ur}o0=m_o9PoHMexg$ z@(`Kn{Il|gZ9U^X@(E~;%9s){(>7N|C9>bx^AVz{jX1+gYGZCzP7~;5usNa_XyhkU zAkdLFN1!SW(ARP6>o3yRjr8?lt6`KHHfCxd+8Q-%Ox3XQ&5e#OAx~a!^zCMz>;G<V zW1~-y`MYdZH+W(8fabh8OsIF8cYJUMn*)|LZ{xya_y&jVdn=-50msYeytC@Ia|;y- zuM1Bp&QaWP1;da~or*YC%T8Ysn;JO82{bSII1;i;VY{pJF@tQz+AY+sm#!k>tgnO` zIkGXRO97|=J{By%i$SmjxjDu@i+2p5BpgUp=KOdoX^_g883nLOqIm<MZZ6b#dTK(~ z-y5)1N`BHU#d?Aae4N}qX`#B?;41+@&npPJR`25JN?A(7ScxI+p~y@dQPO}l>c;zF z2W4f$E>MeD+Bo{S0}zE^fV4bB@R>lG2d-Sa#BDe5O)^|*hb^MAtOR86047KxLd4&R znl^1~m5oNPVal}<iEFl-9K;}IB%!Fc=uoYC|Awkgh6Q4gck@Z#bhq9)xuly9uNP<3 zwR)Kk>58<SVXo%rnD$a?nBM7|nYC%x08C7y2(4DyEE{6kB9*Hu!+4s-(8kG%M6|Vi zY{4lnl^5A>lQ!+F(G@;lhs=MSYSDybD3pDRUNn@7(mo}Ag?5=#dPjEb)NoA7VNp6A zhoSuuuZUL}rp}HQ#ApgZhJ-lKP|<_CDGY-OH{J2B^TD6@=r<_8=e5~Zs=M6RyB1e2 zU2hjhyZ(W*Q&sE&nArMEO-@dRmgDoZ9qEyTRhoe=;&K%Or+0ZR_y?@@+RpCpompN% za%l!SwZ-%BPy|_AlswJ+v^yGla@X#?mA#L3Jl`I7_x7vWQ`xy^Z%0K;N>*}fTYqZe zlv4psXk)l(CEgP%V)pOEA=@%I_b2;Q6ZPH9KF|fwAB-wGy2m8G-0^TbbSxr9AQ`3y zMyi(2pCxXD=YA)5b*}TyUEP<Xz9P9T2_L$>^w_RFkMG*^#D_XMz@!npCUsa`INMCQ zJDNvLpMD(N*_ZP3;^8g!X#2ok;lXR!mD!%Svvk|89b5GkJ?W_94z_N$ZTpHne01+) z9TodN-QHI2+{UliqqbW8{>>~&=EHVT4QuW_#^15;vXLnd%^W_mPtJqH`vH0=M5oaN zgntYAp~u?w8Yr9EI&nukxpNn<+ov0ddzNGGuC+i8io$fUriHprz~O2#n%(WAK^xaL znl+Epnn!8f0d$?zZc4XIH{zua4=qfuP?0ATgXb0kJZN122{fcI*e-dwDcyt%c^`AF z@oR=pG0nkNCN|XwZ5RSX$jV$ISoLiA^7#v(drZDK(V?Wyxp9piF-=7i#t$RcbFaN> zVeK5<<uzTdQNDQ0`dRCyOU1!3iMdN<R$sJmHSRr;bqN2loXV#W`<M!~$B=X~n%tEj zgt=pfl-9VXk$bi3xmo_q=*hs;p_#dvBhwaV?mN9D3t0M{-q#xicQP7d`n&VsOS1=0 z%pE>{Y+q@5YswbG0?&PkiXvqaj((m?tAG|KI)90P7YcJ@Ga4!9mT|!@e4T}=`@EhR zKaF76%P+U<*<oG2q|1kOQG%%G1efVCGXlmDO{A9-WDa=RwN;Gi)Yh<p-;<8IY7M6W zd}|0gD*mPz)6J~`qp4~&7cRzP;uRbkbP1;Zq<YXTcvCT^O1>`U{usUOdC`du6$w@U zl*)SuNvYzYDzc1|o+>=vX8tJ?)q}Zhc1P-N`@0oQk#k(z++iXbH#gmj<sbhs*+P9X z=YD&mzokjib431pWd-`@qK6Ps&S7JBygj+>H#EIhG<YBovj%mqi!HDY~lX*LC@d zipk6-`VoCJqt`F$?xvpoPrCb4y8LNf2pFEu)o$6?EeqH;^u;gf@@slcIclT7W*>F= z4PB(8iT=9o{x@ADPjfNfEf((I*2iz@qD_M!^XSY=^M{YkS%4r5O&I+Pefv4pqA)0t zVsb?PPM6=)<v;53`?~ypy8I_yqzH=$EzlF?bm`M2uS>r!1ziSoDe5w)%aAUn864By zSJj&IVlKL`6fMyfUGCN8{kq(*%LBSh=(1fG$)=;nxND6dg;Xw{MIzrIw+yz9oKO=} z%N^2U#2jaOYCp;+zqfM38;9>2y1RIHadhauq0PmIi$lft6-W3tJk(dr4?SNj6pLe9 z3C8&TvG*%3FVF7I=Z5=j7fuZA9euv|=<xeSw-(2X!}jk$vCrSR&xN5a#ew3W{kyw3 zG&IfkeZ~G_-*91Qe7I<zcrvtQkzR$LK7Us$ag*dKf7#{#C0N5-#h1zdo9}s9q1*G( zE{b`RshQKl=8JWh7zC0@82wcVIc=5{ZIIZa(w2#GB=8u*&|obE=Vd0kUi;M{H&@q8 zjp60yxuu+?wC_c>E17*CxpjM^&#^X0_U_X<sdIJ!c>ZPX<5daD1N-t>!mq{3*U`C^ z3zcffREu)r$5qEq=<)?!?9|zrdQvTPUvRbiv})CvDE8%h-_aB+<3PjdqGoVI$LK+V z8oDVz1vtxvWkffMn}F!niC?-;-GkJVOx;a|gp(DQi^H5R%Mz|X&Mc@l0XhXYkCw2( z25lztpVIdKjOKa0X?;NxP^6w7;H6phjviFs-|6J4GY4)xxsOn6t^HdbK;&6?tM}!8 z+sOqsPcgcO7aCJWBFwn?g={cBkvXnbFp9qQ6syr&PBDgtB<0hN?LTI%&K+uO`gqmW z&m=mwxTJ)#J*;jyAfBE3=<QoAz$s0V$*lbXV8k$XY~`r!6S>u#$Ma?`V=WmxnH4uz z!fK_}C3<Vm&HSf&y#gL>+ym;9wV#fX_$58H)Q{m*xD@MOqo*&cGn^P%IBbeLVX{hj zHw)tptbNo}LA1_!(;OXF15#z{ybTX@KXG@wDMb1#e3RyFUl?$Z?5%PQIER4C)~vLE zt$1v?<VZ$$4DFpx`HGLzHZ_Ss@45CoFYZ}L@nRnnQ`%d;dS+$ioz)Q1%LId@6oWOP zx?Nm18`~kExq`_Ol_ha>usH#|?~qFcR!OrIAiPS=_uX6Rg!f4?EE~!M3rv9{aQv`` zF1MeTDM(W7;^c~0wr1dw+=P2wy=(D%U6mG%C22o?>OrLKMOIgTr8_k2@)kGQ^D9$! zQfZn7TLAL<sEYxlGmIAGk-SS0`w4FyLHMq6u8uCIod0Ye+JOy}8+KL^#19&gUBu1a zt+JpQEi3B_nhx$amdX7xKW5iWcFc+{xocx@Rhf|77)|`kh}nOBF3lgPWKflGw%(4x zhpe;kXpQ{DL$!&<U|^9CO>cH!#b|ng^j5#kq-8N^5u6bua->pijau}KqxvWxjp(;1 znsWD7K()xwf{{6<Q#1G^s1PLx!rNMHuzF9K3Zpv`Ue@uwmqr}65Y?^p=c1)$r(g!m zV}95HgRB9(K1wYDT_oSda)(GzvO&OV<wCCZF#0xuG_y_Nxq&yW!BU^JG+JkSrX1lh z$cw{x6rv9a<v+#6;sFwUQ4D?bK|Osy^K)k)@%uI87(s4hkd0080N*XZs8xPF07hbD z4ri%7(I@(;9pRG3mX&-tcQ-U%dGs?qXL=1=4!&F{Z!8zfgW$~pduk!6UM^M!%fsc7 zw@}%=JY@KE1E_5*5(-&(m1A{hpi^py1-#n~DoCXT3Rb{VWQ&%7(%Xxs)4-+`77NI6 zt2<+$5`>z#ea#Y)T>^g-!bndY1Ef_i>Qlra|7>dF{Fw<NB^iBXdzX$R4EpSi$@6D$ z=0s&<w=>o9ar7OBdFJ(Bs>=hMOkD_>NsubxGsoI=B)6`;bnTfvlQ^XUY^}Aa>(4y1 zcY4y<qRwDydP!kGuM)W%bJ!KU*U%|pmms4vUcq|cih0SXw?r;912e%84Je)`2Vhe3 zfcsaqu7givBNJkH5QKOw%&C`)TwS?B=xw}noVA<1sjNkyhTx}{SW=Zl{x3+A2LnJa zq#7}+Zqx;6uNG@Kb56`pm_gOVgAUiA)tS8^JR>wh7%mrbY#qeon^4bZZ?t*su7Q-p zVwn>LuBmne9mK+&R0*RdrUP2G&nc_$+jyJth6)01brPvNLZiMZztI}G`3H|3%Fu8D znf)vWunn2z$~|O^zOUZ9)VGQm7Dy*w#{>bB0MJ<qwGDvU9t5=&F_wAVqc+l#f!a32 zs4YfnfX=)jv|&SNQs4K?j~FT&wd+O<0YPr07W*Q=chgOMznM%d+^yzN|D!7B$@uM{ zJwNvE2JPMD(4K&jQPZuv4jeo*^YJ5d^WS^$`(8YL^1%G;3o|EAIbi<JR7!B(LHusG zuM4tk72`eH>bE%ft&#YF9rEZ`z>Te;<Y;-vpJ<<2dRCWbxOB&lUl0_RjhyhKGT8|; z#yHZ2Rnjw3Ht@U%q3`GFR=Bc2pIAbYQW)m*_)u}hl~i1K5&ZeP&0I_YEfMVMLVxXu z$CHG;3MKn-_@kuZ*(H5n&TZ@XmKu47YeD$7`i9CGo*uAvgr{@h>7Qn+5LtPNG(gys zbhiI%>Gmm?Zu_^Bwv%tTOSM}c^zUQy67YPVqq$6oN=|#Nh1&%Cb@vfnY-89;8PYd; z;KTajyFmXxrxi7;Ojhl_-bau%ZYIptw%&&=czk11yn=xk2y8tq8og>XtB9ubF~^38 z<K67Vp-tAxh!gu$d*391PpiusMr>L6Me69>cPjf!G4<f~U1K=zm2|(MLu?`=q-XhS zEN7E0;b82{rFV4qDE2iOnn>J<<(Y4%RGp+x-F%3*n(@7%5nqX+s=uthYHoV+jr-$% zb}x$Qx(Qf^yE2_mP(@^uWI_*PKW*Y3*Tl`}vJN+@-hW128Rn)qmd9an^sb@N;r>NF zhaat-erk8jlZvHZSZ2zzgq0&C7CLxQNT;*7x(nY597#jAT#=y7%h{x|*k{y$)c}Lx zq~{8UZOGZAOY**T1}bqSq94rc+PdLdcT~cT(y`-nR%5!X^O{y}Chw@%$r&fEY_nOW zacW}r=m7%RXR-3)MO?Oz9w^OTEbqbQ4<)U+p7BV*zf*q_2HN^MHH+yqdBwdA0L;8u zFiAGqg<W)-n2dF+)=s~*C%GhN512(FY_n}M)GG0sM~?mSwO{Ht<mhBSea9Mk#Y0Rn zXR*jf3+zNbf;_EZ7rw#KB2hp*@!1vj=sdgHxPL>N&@mX}mf@|jt!-X!g&m%y7K4=P zJz=R0FA!LTPeAEthw(}ZSG^wp1OzIi0I5OF=X8d?3!vFbz|no;nC@vGPym+iP^6?a z__esP;!uZ3DR53ZD46D)%0=Ui5CFV2_;S8HST2+YGLpujh-!Phe?#2;65>Tm5Xb2} z5_1mFcxzCrod?B(yYKd(d^aZ~=AXQ-@>s?kTarXOB3blgs2LP5;fPUueYg<yI=aUT z?KL~L`@MZ`LLPPB<-em<VmnE)81{Dz{cj=WT;i>D_V*{Cd%&b3P?vg)?m6V?2KGF3 zk2?u@=pIVC6T-FMBnd=_wr5Co0)@dzD5g$AH<IGJI1~R;6X1@y$cXf*h^HZSDonfh z4rHxbo`0YgP1agON!qul$&Y{D$-$^n$-*_Zj&1uHILhd}*<{H-I$_u`wsTI32&b@k zn=r?l2`>>uR1jnaR*l0+aSAM?2rB@7%f)-XW?0KGV_;Qx!7|Ruljo>pU-(iIt+j^e zt<Az-EUCRs)@tF_RhU$FC$1K3X<x>6ey;SjqrOF@3&v7$_J(IvpV@=8XlEo~>{47U zNJP9zCUq~aTp=r;NlENm8>C(4z{oM~_L(5PZd@^gY!5h`9@`EIh5LSDpNQ3ry``t= z5GTfq>!FjgXu4z$8t8<S*dXb#2AG)j>g`J_iiCq?f<9nu;fM)q-A|#np-k#1k$}vn zNw)Es8~{p&01OMuYCzS-pWQ&>sw|q1O_me-Bwi2Mu_cp-)d?#aX55KAVs)F0SIxXS z)oTn?SQo{Gmd?`#vaZ<Q2meU+*3`tz+${f}pP89^{`r}dJ&B5DNu5ygB`fJjovBwQ zGtZUG>&9d<hRJ>80{hTwJe`bZNsp43)a>MItBI{i_l93m7t;*~`9(@M&{k_{%H(YL zudoVxWGv`58o^qEY1X>NOxx2F>y{s*o$eh>&0*)vxIuQAncJC|(C~KW-sjfY9Y-Am zH@>~8@r5^Tx!$C&BYk+77-V{xcRM#g$2#~85T1A40FUn|-S!?Z-Zz8Cg~JVxKgUf% z>PmYIf<rZ8*St_2+G8Vl9SSs=P{Be>kuZsGiyq%M9uC@whlsVE+9nU71q#zKeTY0e zrU4aJNHn0W;WW%>jb!G~B=Dx1HXTGvLClKUJiw(p1u+D%=c3C5Md@aE^2V0rtac%k zrTqx{Qc>m2+-hDrQ=E4C$x<w$nEShX$Yoq;_Fw3YzOE;$132;&alRSk6HYhRen5^u zMl2LWUfWy9#7OqGn<Ny))eX%J{2g8$X%06>F7!nwnuE9v;l_h{3HK7Y^AL^v#EG8E zCtmDn7A3bwt|sz>RZ)#+)uU0>+Z-+TJuR0M9CP@aYmOSJGGMLuNZ=Ak6;#t=>TN@` ziZS?T4W$-n(1}CB<VOEWFZ{4B7Tf1R-6ix)D*d&y50k1G4^N3!qp#||z*;JOwQ6i_ zOfR#Z9*P&S)mNLp$R%2A^--ub;Bj7JjFG6Fw`ggn=tvKOu_8f(Bs!C6S0OjSXGI)G zwZv1IbMYCU(bS@+$R;NhdS_~CZRCFwNT+R(PJ<cJNfecSYEN;=@DwA)Q;3rgPcaHt zG30m(bTb>u!`S2$O!G2;z-ME$hu0UzX~^J-Q(B9;wHX!El5UldkSIjVV;P<!rZ0lX z9`~cV7Z4oq-tBf$J&ofj2vz1J_%4U2Yzodx0TIY4C;10W2IWN88e9g_m2%1sy;hpS z?mZ4<X+!bkl6e|BDy6MC^%@IV(-fzgB!<0`EV#aSI?GCZfLU?)8;9|;^>Y>-uo9~% ze2xK4ok)YK(FA+IU)C94sW0?2NDg%a`W>eSnN~iCwwhc}0Ly@g76Waz@-sj@I8Bap zQ@g<ll?5}7s>&$d<%VeMq-Z>7PKy&oERbZJ)-BaZ^v80=L}IH6<%;yDS~3TpWOW>= zeDVC*a~8VJ^59C&V>P)MRy@kt8>d+sU!hySbSO%eMUJftPG|3SlQW~2Ig1nR(JAy) zX8$GsC59x8Rnik@8YUICl9{9kDZ-kNVEe2KtqNHuQdTQsjcWh-$TFcS?Ez1Uy9o~^ z{rt$8G#zCGj={y7v37zVh$DtOGsYyHPMr~}dd8f&U{wH;VjHv}pnhbO5XUy*qn$z~ z%iD}BvL<E}?EB2VG)JpcXCV~JWfmQiV<O<3BpCzFV@#k_qjAMFB7I!!hZod->VR7x ztMITw>cD-lNY)SMK^9J{qS?@CnMTu`qKZ20p6j!^LE65FnVFdhca|o~GZB$(oP!=7 z94;lZx91>{H{=m5sas)rYNg2;iRa3?M7mVC=rl~$Cf&Nvg-MF3>-H(ql&1JWwnK-| zB={_`pY1%<N@N!#nm}f61V?Lair9O4C$*VQvgS@EoW_wG=qJ-3W1VIC*}2NKZl!8Z zojzZe4gd0`a|@>{80n^GgVQ#1YWDD9VqLMz3D))0&b?1OA?^vyF78kSm%!^0PeFF+ z#pQ)7_M}o@j4i~~H)Z?ujY#`_hYk4*GlW5`UB7sGWtsC}VHawP7=qXNR6f7JE&V1f z(~eSm+w$YHbFLw>2h;-?bj-XhfNNNI@2GIlNn2C?HOgCUTPBT=%$q3D3dHUyX;*Ma z{Uj{0_PN$@YGOC>&K`f_$qzpDAw<IL414Ne2w(2xX+me)nSiaJD&Ge~axkvmsfjGk z%BSr%X!rEkp$=d6j?!X>m$#SBA(wD&mcj(_{*q4I$D@w>WMBCsvomqCir+6~l6X>1 z+fMuP(aD`DKeJTJ1P%r@m;xT$JtZ6lcrp~@qy_}5)^3!Y0TH_`sLjRm*L1YQ>eiA; zb=CP^OdS5iOGjo898Gbzsg|{0JUu{VYwa9ux&(cYc_`GdSbJlh{#>cVgEsF0+l}^4 zz=O|_$kg@lm{D>@+#XsqsTtIg{sz7IuS1JwIi0tAqC;hb`$mPC4YZu_<?>D1x?Jiz ztZ3gVHgo>F4h=hHmyJ^zK<n=G-o@&eaZq|fed3dFxbMFpBhf(|{0kSb*~g&Fr;+37 z2KRmRXQA&gE~^$~RyIFOs%PGcewDP)_DLn{Q2kaXc017j8%_N%R)+JK-vm#B9=<H6 zf9hEpxVz`V0Iu!7W^F39+^<<X?oM^PJ4)&e`}9<K1NwVDd6TyB>I?O|+-Lf&@@LA! z^{q>HyJuFGah%B+Z#Z7Pw>%QR-~JtMZ07wRFN<#(CrzL;lpDXknfkWrnT=~Jb_(}l zr*Mxs_y4L7>j4inzt!6($jo-*F>{a!+DaG+<7pq`ui2b6dtTeD1cYxh2NA2LblI1& zl`!?Gu@xv=-llZ)MJ^<A8cx$#j_+vb>mTIuNwFMiBHz<6;1hVqBwf?fX9*qzlHLFA z^(i_g{>UtELsw2GT}imP#>+knmLot&wg<gp^f6FRL~sdO)|ptuS*l!|+G$J-&y)lN zclv?`wV@ZlsxIDqN||*idYBG1`d@jd_S&P3fro0kd89F@Kkhd7>gnlw9g8oH#j*Hu zE^3X4kC=rjsU1h!=j<j1!?V^%phop|YcPD2Y~b3d*cLbXe;iYJzAA%8F_-*}p3pS4 z*(=JHy*0Q{^WyT>*7-^eXkIx<s=;d~g_o@}tzuL;Wzt^9`TkL>-xY1im+2C2+~)Cw znE%Tf(g`(ok_(*b`Ks8}Yps5x`J+$hE3KKAN$|&3&=&72y!@ILZ;l&j-t*W6=vP)B z@&*}3pEpEmEU~O&U)>e^4`SoWR<e-W&0CvM2IP2Sb1nySJ7&KMUxJEYL})SW%*2qA zMiZ&V0S3rfLl>?q@&lk9fkFuURhv?%CsS}>-6N?1!NBse=;0Y*O>UC9Q^`2JaYuo3 z^>W7>Ipid{a_<KvuRsO?G?htgadkj2Y-tcVMzKEBEH(?YS-e)F<|5GWE56o&3kB}| z`<H+4MFM^xQ^_^^x2ew?DETYpK9jNxN592$LDJt!z584K+Y#W*{XozB1%>v|sE}jH zaHUBLpYN^R>)y3eZanrpy5HU>><FP++ULS*ancvfgAD!aOzfdKJBHJvk+x2o;b^N5 zSIbua*=Xg;CAV?R+C;l2`nWEy=rX6vDP6RIria`<`<SZx5-m9U`@Q=9d0kAdVh2Q+ zx)!~_!`3K9t1DLz#_=4x$xZ&4HlMWHJ!~dzzcDu1Fy<*^ImuBZMNtsutvr*PoKmmr z`QyELHs)BaF>2c@$WJn0ZkSs8_^oM5u8*cstwm_+!{`h*KK*k*oaM}$;aXMxK5z8^ zs?oCXTR<H4I*u#$8HAv}g@9o4)iL7F`0otm2+`$jIYNh+IP1(Qbx0B`$?a}pxuOhz z<o3fyMlv)>)!5JcdMV~Vm!7N9r@)iF1`YW0Sst}bW^2gieWnK7_+`zh$#`VaoD0YS z0w|rzFL|LcNO;SKYC9gPO*aa5I~|({7{D~|wM$z1rY^^|;2+}>TL#Ex!9$l6V$fT^ zpsvVHr6;x_>jRb)hI{YJ(Xn9<8?0l~g%ri)$R<-E7Q0%`2yjJTQ*W$u>sZNX1iRD? z(O$(}?4l=!wl8uYeu5_P5RcO0uu8r{48bx46eh<5<qbxbK{O#8D`JXFhFyeXgZ5N{ zvSP|Cc_f;qvW3qxGe$&q5soox#0uWHHD=abe8Em(fMZw>bdivG>?#R`_}|V~C1)Yt zAW10ra&hHs^?U=J8fh<`+(n#ey>#Mw{Ty6441r5K;o3u2r9z=om1{Ejbr}SlYR;et z5;Vv9m%V^v_QuplPCTs=`?Yab5tUI7ytG;RptKa*Uy0tJ9|$3Af?Rb@cgU9*?jjYm zZ#o${`LM%9K#LpV#Hsp~M|ZyVkyp!)zPjtx@*^o0fSfTR*?qA|_3C<MA=>|H`Nrd` z(>wK<FeCMIJb1PI5%-|HaNU1QaWUJOnlt-K=j!!K`#$giq%MmWRxqU?Ou|*7lU)43 z<txa_q;&ki-X}l!*oQv!0fHy(EU)au!F;E!?M@kC?=+rfr!g)&Js(utDOPaj0-<v) zXYkHMC}P7G*BEm;@o<mc*uCTN)v4K|&DjIZ10R{?<72DSQ!mXnUpmq}@{yPP=ff{G z4}YThiH{t1pZ&Z*D$VSC`87LY85K-mOk{_ehL$J*fPHmhcSWCW_SSYNvSzuL?9s3& zpY8Js8rTuY;lb<o*N2GyWkP;Z%<Gv*f7pU~qGetFIz;ry(kPG@-wpk<x`3Wr@o$Oi z`xNl_^4E!mwb$D1UD`;?UloL%AF9K~-0aN*B4J>}fLN>5VtrG&U%9O7Bxf>`eT$h1 zZ!uP6+zf>85_2-YwLA!99%}r#Id(St%?GqYz$HZ*nOkC!sY1@l3Y;_HQzOCp>p093 zYe9=HDr^el{WC~KwD#=fo##oPd#X~ga{f%II3bxWn~O;l;elD><%Oy@IdF%}F}@}z z^Bs}amk59A#;(Th?hZP(BW`V{{9w#Z`>IQT`{~rMteVEG{Xt;oQ`K-#IqtwIEc`jD zUS#3mmLwhvCfc`<LMIRUV5VuxeD2uv-Hz@SFm!ZxlA+;W3wr+>U4EBKYruD{)o&wq zl*`LPH7{`?PeD{6Dv-%-$q?I5>X?<NHR_k4eDYxZI^2Q97Z5q#jq=W@>dLCQ!le^& z3Ag;FFvc!!dMsnCNZ}#5+(Y1Q7FIQ?WGE+{4&-j1Qbm~S(5Ove7kXFNCus4?eBe-I zDcy+<>Mo{qjm}+FTKK#L@Du&oAH8~QTeBbS-I&p_1JIF$=D^cEmtR0T2Ni1cpcw-F zQO!rzc_?~ab2@0yo0wJgNEAsluj%j{MHfo1)mwJSc>l2qck#Xa{RG>`q@2?4%2FIo zV56IwPFjubB|?z{e7GZ8Z9kC6Xf!Vzh-t6fvBtp3is+g^%-Ak$BW8Y8W6@?{ABdIe z+zxtS2-xT~x84?>1&4weiI>}vFuev;Wf9oj-uD;Pm@S8G>~l2hPQ`6eGV1<c*A(;H zQydmOJUTHnlA&dc?BnZB)t;kX<c=)WUQE5<n2c)AQ7?&VZzP(ej)gxHTS(oCdJ&8) zSC-GioIBFu@|6{Hyb+Cw;wjhw8%E1eF#@QGy-xy<y|E9-Z)Zuh8E4FW41LhpIrWaE zPEXoN^fjv4-i*5@63M+D5bMqoT=guSq~=hEM7)mKcJCt=1h_~lt#n;r{u+@O&ZPsu z9iuNP>lUl^W9qazEHMG%PS=$hl4NCBPqiU*5C`e=g^V(^AaLhIAf5Wy5dy1COsw$| z;^$N_x{kgi;S6_{POq#W-6f4c5+IO(a?DiZhib|@MW6{$Z%`X4+*_&zAMP$SiC3!D z@slCS-a74QS&SlLr<g4maVEWEm#>DrOOTWD-Fn7nB1~kyOl`GnQ|njl&h|qbWT<^> z&=+4(s%e|a(lh%*ZbKWS+D-QdoCG15${TjjL^_s>!hPj869_cXR$!Ai`D$I>cDkwR z#`GOpVh)Tl%co0s%!f^WCuMxO2DNL`Q$A&zXlimIMa8-}WtVH@qgjX+&&5TSYfI%b zr3q8XNtGDS&P1uUTwXdenNnm3-!50K&39?&#trmq>D75=a&@(%@uY&Tow#u$-HQpE z@d={)c66k6dAVCBCe(-8qD{dwlM|hTckgv=yK@2@$ult#pHGgU^{Cc1GaaGaUU_9Q zJq~+m^0mbHx$S#D&UH#y4Zb^}H@-9RYsU`FbyqY<-Y0tgZDRk*+e#F>JP0I;uI*NI zU~njWuA}Db12=mRv*A5}3*Y`G#71?ZS+MdL7}Y*$<?|ioseQgEf2W(e8^U|N|DGQ1 zHZ%)dhxrDH33nsS9M{oiAJ>h|ey(H90j`^x`RI4*o0qomJN}&BysKQ`e(T$C4@7*w zo4-U5zDLwOB6H#q|GoO%Qf^%Ot@6N`zO8y=TlML(YJ}2X?@dH$_qumK-+Sr4<n8*P z+CV5XXd=2xZzEb?+E&K>c<CO)lX5>U*6&TqZR^2h`R<#2P7&kO2Oq>kX?|O?k5)eC zYuKpXD9ZBI9{;VB7JtcqJ7(W9lK5NS_fdMX>28hdeZJ&o{|$YN%ffGMUb>HdZ{zo_ zo0{9r?$iAHQCjSV-@1S4dr({CqK7@lrS;yTGVoks)x~pFb1(JOOY9P@(*xyk$~<80 zPn7TC$@Vg9G5??mrnVhxJZO8;z_1te!!HPSxX3XMo@RmsOs1iOFpV^T-Chz!*cg7O zHuaHxue|<H4N1N!RvKgB(W}*0BR!UAuaR$3u+cxQKSAKep6?MgWXhMvxk34|W0l|{ zb;xc;mcxk9L~iUY_9EW;z1mw+8hN#hb1IWYfj+!;3@^$*DoXnMs2Rmf3Jpas@+j8a z{1uw=v}8&c_JcfqNkpW&mCrS%J|^<O1L?pnbWz-Vr+2zBpn*v^S9CYKrW<`zT=LV8 zJXCAk9&eWl%|M`6_3<Icnu*eLMCi}!u8k|(aOyhpo@)n<+ZqfjZj#8>aQH06hl}K3 z<I<*xE@+-Mrsqke20X#lD#l>CHJT+KTHDq_sW$(u!J~N79zJsT*uhrez;VLT9Wg%6 z*2PxB$oWVLp6GYDwC?gvo~*!hFIG-CHa`lyWpsv~MrU>DqOWmWqvwjMDirCWg=`H5 z+A6B+p@tk?;o`Z7cpn5^%LlXt&d@1zEq#j6H3kETkegq3@5J4@%Ewj=r^tNiRwOem z_`Cb{Uf+{^mZnCL;qLW}shCrjxzO0rySi?(#k_jJ&mg~nDg727kg*_y7Hf*v6=LZn zMX})7&D^E?%RQ!$d0a9XNnNDQ^$Ho(Feqg5$i&IL!Z!oaH%+x7W$@qz^X7tm9cuR1 zHz3LRCMT~SrOMCn?Qrxn!aHT8s^!8@=2r`-UkXbjH+x`g$1z78SS>dDi48x1Au4K| z%RdBji-I}&MSM@kxZ8wer~hW3wYpiYQWljizgtwEewvrebn)1CdSCrc@1R9E{7&!i zcX~&r^F%tVE7~EyXZVd8{jZ*Vde8pp@#vBk(oTC9zS;O>x8N%(cUhN2uA%jh{w0$c zeO?#aE&oJ!*Yt(<jqMYxj>T_AT^McSvRj3#n4d0OYV}{OVV0zii#k?a`0h*ERZ~>f z(_7L$a(cSH&FJk$*%$g(%%P3zLuI00A_ivm#VuI!LsWc6Ecvr6uveUT9ej!@-(^4} zrnfNxl3lJ?GZQa8gi#p0N%ApPL>QQA<K68v>dg6b=1*M;?COO-rr8<gCg>pG-HDnw zo|%Jrd34OrqlJKslCRhtl8`lHvfUQHt}bs?<C6UpWrjPmmgb?u5I3!BxHY#<BRvcM zj)^d~pbNJy1$x#HS9{5E=B2|oz{3_~WWkI2W!Z?q{PMEZ7l#f_F(jxIVjeD45n6j; zblHBwP*FzI0EzqFAQXY+bz8>%5jm-<hcQM>ii%qN#Pr(g4RC?<4cZYh09G)1@1m46 z>}-_aS!3H@>$W#GFz*Mm%9S|v556JpT1t`a-u%)@WiKv}5?s<0Rzg|_ESJoS2sMwU z(tEDiaxIkBvUHkdkJOH>)DKsuD3UO}j*ScgpChdIRIre0^PMhVz?N^hR=%)wW=Cz$ z-qK@_?|Als?K}4Fc`UY%>tvoL^^z<$-Fv!ouj-Ds^@j?4T$IGlYEigMKl<C}e`}xS zCacX5cuE{fhy&3RJyP!{uL=4C(<c-#PC`u|J!>IF1~7e+=3oFrB|UxF45IkNvjTjL zI1)IXvM}F}=^Lc~C{R|qiD7GP#Hi*1A$E;oJ#*)#F{#DqG?39*AoDvKec1vBGZ_;{ zrX=zh1em9b;Dw|4lux}?<kVXAX364I|7HpBgpgGmO_apk>URk252=vZ47{ql*SK^7 z;;+!+&j}WmxRIfWNSoN4Bx_VMEQgq|^8#(0n2rokL!eszI3H3}OCh>n*_ezzVfKwa zks%4xzRW*Z7bp}c7(+;RqkR&;3Z)>r!<lZBeQk>LQI6lce8`0Ac{BNtfyY~&t?-_A zgfY>39L;MWvI%;Cembuqn<|^$f2L<Lv;fI<qXlGHVT+^XtvR<9EQ`8O0DnzWyN&8J zwa#>+&^vBaqcf(!-6WaP?)W~KOO&bRj`02Ku>jtz8BSUV0>lT-qQMzNREHJ!bE%Lq zkH{a3PBX;D&;w?4AXRZ=z}*L#y=~Ptyl?ZSSzQ<Je@k<stVn6RKia!BH=Jv1PR&M) z`TG(;62$oLlmt-ke@gu@5?~`Fz_y`H-39hfQ#5USkdVdYfuHP0WItvi2zlWQ5-)8N z-Z>jFKS+f3o1@)SvGBv3Xv2SIpN1UK5Ve55g~l}vWO$UIbUadyVIm+Iw~~wmvuePJ z%XaSaL}NCP7`&fFd3uqZY2GXpbPebYX9+KfCpl|tE2M%=RSBWx@>DvrYbg(umP5%g z7OHhBa|(hsePfCc5LuC`Pp89^GDuH-+%`|1d{|gfqGZ8E^0<~>t-l(*S|x{T$z`{7 zZr3s4KoQ6WlgeU3$KSN~Oz?H6d1oVKu5}4H<tU<FDcqZkT98=UWH`E}(f{<R6SMpI zGdJ_x{zm@kBZqXIJ*n%VL;DGwBOAu(hAvZ*F|6vY$>lrw(%{HYvNJO%E=F?}@3~#T zhp0wkjXd_mPRV2T#5^fDVU_&)^c}2M-&+Womb?&)_lR1{wOB@QCwpD)v3KLDL|_9T zz`6<VHh>m~c`7?$J^frW?>?!dp*w<0{*P?Qj7Uak*+eq;af3)^+}XpzaCTb6VgNg2 z>-eJfV=Q3#A}{)bpQ7|7VEGR^X-t|dVjr+~0`}-4S?TCjjW-R5(ycLNNRuJrJ+U+h zlPtwJ%GoJv4ch)gfL=>?s~t3}Q{PECHJ3ug4#bQ&e5`}(@bMqk!dn<|lVALRHiLXV zO$y=ghgs$Y^vvE7>S*Pz*199%c&dU7;`h{{dwIv9;S!PM&CWBRV?0tvv$L1r-U6?! zg?k5XfqR8>`!Kfb#|^bVVBY>~6XMdrsWIl2^r4W#y$9X_?zQ<$aIa09A>ah}x*VwO ze7IRP%8IdlO~v{Rf-8MUEzm72xBNR5Qp+RTjc)n^o<(%{mZ}o%XA6G|1oLSX7RlsH z+}5#f)6V&)TF^0WiUWDi?u+3c9nT;d9X$Qibns$CV<<(ojztAtC)m2I7W-PG^Cx@| z1>+^dNnz*-T|LEzEM2Yjl~l+%XcK!{^zVQ-WF*Qr5dk%@x5MZxrmHd8$sWIDyzhH8 z`NF5#zmk(R?#^~M9D2@18wYQ5y3TZ}Yxk&r{t`joy4rmf_fjC9#d2>pY`vseZz-th zptliBkn~U_illKm#i&c;SAIj@h^G8Y{Pjo$f8`=f?HTZ?yd$M84epSJaTZQrA!{e5 zX_r<=Pl+EDUPRTi4(Z4!(|+_<i?3e;Z*7Za%#bY-;0<F`%3CMh2K+E@0pbkC^wXp2 zN_XP^LCu=U6<L+WmgiUIR%WgLVKsuSnM$cMv+B?%xnK&5lu@=~oczA%RhLh7RRm)$ zdPKWQG&xjy?%Hlj_5mwic2v4d!7=#GzW;Kd+II+Yu%lyIyx-*tv9te{K&$dlv<65p zB^R<dOkyIDlT~y3`Tz4go6=yNNJ+--fKP(yiEl{_8xzM9&_<O6b`CJq06Pz)#x1$3 zjXh6#7~@{VGdkWy&*3TIJdkFJuj!YWund5_i4S%z@0(Lh6^UMuxnNr6vJ|=P!`f*H z%|E_7o6#CTCQzevt5B_6l?VK%^+FdeV~>W-FDFk%*@~OYpvTjL)`;Uk>+2BDn#5be zHl37`n$%&pXzTf6){$MiNI!QT+fMNi7k-&u*g-t15Ih(;Ai#1?iuDjhMsy?YuOjYF zR|p7Wk|>U(V$NWIBB5n0=+fBJ1}0W@R!47-WYK9Eik>NvTuh(zgR?8G(3<KE<@8iE zXy-TXjnlvdExdh?6-s#VIjc~w8jTA5gz-w(l1h~qUNf+wZ8UX+Zk&>AmWbbv;!8U- zGs#~}bL+>?=)38x4qXG9PK<UmA}1!QJGqgya6&$uN|2<l^+Svp>P4KB3@{b#Hu*L) z1(UDoRoCb4s7ah~7Rou1k3l&O%+`bPAu;K*K&)mxhJM-{4*FT3?X?WUgiMZWe+IC( zIZRrBddcxusc`%su^u|Gr$DCB)@JUk`LeVN7JQ$Lb|B73ILvn#1pJgbD(X#Glen#0 zlCCCX$~y}?p=sL}H&YxZlwE#N4aPrx{^rh4>s`Fr__*zw+dHc05VWYbaY!>8D8@{+ z9W<ETK*B<@e30cc9sy|UVV@Lm*wHtLGK_H(ztb2G+spUEHkYS<G#0nHjLd&nA1%Am z=XH0>4fkq1!CJ?0;_qr54_3RmSY<ZcX=*3R9I~>Tz2MI$9sabf_aOKZx05ouZz9vT zNzbZN;jLVB%#~bcqY~TJ=0TJ$yVWr517TpdoyB88qjU&%7#uT<_DWX;u6Lt-xAv@7 z<E3~?4adA&(NndB8b|M7&t}kzX-?V^N@lO>H0iesNq0+NCrUB~cIxMC0=r9^r~vH7 z;eMeu4M*Gx+=)#QRR(p(eiBWi>=rk3`rN+bVn8UW4Fs)iWaPqkv5o5Luwxa9*lA;g zd{?^D@75;L6fUbN!B<D9EOHlqv`qTBbHMi~Z#AC3gH7ZC&bzpMI)GVv^QeEfxp}@n zvw1eVb+`?{^*T)i5JZ}^_U%%AI((}H9Bi_?dmMlY&-2ko<4x86b{ls6ZsFBU4K9XP z2CINq1bNz$4D;REY?|^L>ufeVpOi80g*1m+$)D*peqVw>iIC&uR0(%lj3k;{kgH$& zp3{!HecD(uP!pb7H4wF;JmH8IE7AlbL{>nCAh#90nN~f6xo2-kWo=S=7aJvImuqyT ziv%)FAQ_CcF~gCgm-;w+qqqvCes1B7^T=eWDRORA;)@_&rGNI~+az3$BXdLi3I)G$ z;cn~;pPhr4Bq3Z(CqH20RQok&yM4MMiMy>i6Cq!j&UYBI2!r+5^$C_EONYq%#`KK{ zc1_YExg;d*y~mhg-$)>8U96EfyPDS49oAoAfe~TGGwi4i$K*$!h5zr);{SK?u5*Hy z#%8VZZGr!1Y1xDSr$l(Tfc?hu7HU(D6tPbO(NpawG(Nec-E*QdPg<y-si<$aO<H_G zqZpz?J&?glu?be#l8hvCOuKWiFY&IM$FDJu>qThSjDI$sHKcRBV_E9rot;&QpcY=f z^Rw!4#DWEl=s2aBBsc#xol<ax3vHwrGszj{@tP;pjr4ZUW|)^-oysXD{uZZFlFvB) z`k}_Q)Zq-R==jCfO<Kz2XxbT!q?*6YlliB##~hvGMWSQc(M(Mj!c079;6qQ?Py|vW zgfji@3lL~|ScDhCx$M1AsAbP>FWQ<HI{ei<2b(>qdB+5_9anEVkciqWpI<k5o6gwJ zX?*<JnH}TIT4;$)@fhFLGpnWeQs&GSGQ?asvu{x_jbF=m8+MHYvdhy-GGKX$_mI*` zK2|+Gp_L1zShVsZ<x!;X&Wn6wc}!m9<!$!Ort)U+^oFzY(ArWSN7*}U&+jU4r4*qW z^F1$*0{!oageDp;yLL#98s|b44m=@FB09KCM7JvOg(c*{5972qtAbZ1K4X0+mRgI# zkO6Tak0$%4kIr}~$Zti?qH=KD$Io(;oCVqAr@VzHoR$Y&n*4_euMs_6AHWxw?RHk! zYp{CGz8T`1YoY807kwcPeH1O%hy7bQYKp@b4OVwxq!2#&06imk7XP%fb8q@Ke1IPD z>Z3;P<&OnM3LL^LvbpptsZp%@qr0#tnfN?NQiG9atn@pnGukF8mD2B5wSipajYn<v z5eazmBOJ*tI>|#s)ieRTR@4CmYxD2u<KNPyrHcs-uF<xFyj&vOhR$=V59NLICH3g< ztI!W|7YC;O9DQ*aYkj_8>vK>EenZ{8pO<>ThR%H0{dH`&b9qFpziq9dWRwjW_bk7L zWgV|~kJp~!62Z4#pAh{O3boJPU**|1<Jlw9{`)$cJWFW1dgUS+k=2rZ^f$CBF_c=B z_SU2{e3}Oyb5eSbF(Eb=7C2VXEaJXw(Y&>-qze6w7!>qC(W7hH+TNdqOP2uYnH?3n z@;F^FGL5(%(z4Sni|0j$darGDpI#f52Hd&jTrQ!oP)GBPHxFK`Q?HB`@Ys8!Vj4wL zQ>+H71IXsn%CzEh9!p4SR4UHi9Nez2u2c;hB0tp+8zv6uU<R7;7Om|%lo^mt{3(7d zl*d`R=sVqWv*$;0m(dy8%t19Oc};va{%n^S{WjnKy?AvCJ&niOXR~drsUsq*QaO+9 zX9*28+Byy}*YOf|Yf#^ROAQ*uhw-yx&Kloyi-yD2($EDV^tYx1BN3WlL!=Z9D5$`M zZ&+kyIae7t>g~C9f^V?1z`B7rMHWH^npf^6#QQ=iRo&h3#{FI1=<{#99`6btA>|6) za6TLZ4kYc=15;=vz{4_-+iB}_#$~p{HAkJ)y~_SW&5~3uPPwC0Ut5ux3`@w^vFV*j zP}n0>+QaK^l8$h5N9JRMykqc4Rte5zzFwV1<2d0sPi`NodxADx<QMU(E-X!=O#Y0% zwV|&iy8kLA{tpe<@$89D_cpZ2?OVeeh=tK+w#07QPw=07>+E1-Op`g-1dzk(0U0tr zU5NYf{?dYz5*uA!4lE{_nDFCQ*e(OZfPVfK%>z$&*c;fBK8)(jo5J2@dz?ks0Wje? zSK@5oueO2m8;;8d4J%YW6Cq=1*gg;2TX@i=TU`0ud{2w^*IKkYS`2;cDZ7B-Ir{6{ zzmrzWc?AwsfO7hXcLv~X;F$S^CH!34FecgEX<Ybswa#|rO-5r_(N?^nFIIK=!@5|6 zqF|%yj8{#l?oWXM2_1#bQ=lgPy*7oUmGHPkcNp#$9z>KQtk`=W2mmRf#d^?_AyTQi zC!@K>z3tluNkC=cqIiiwImLj)fQj%_vU5aiqv7sr_QiNAIm$n#?s^9I*Lf@Y;~MFw zx$7K+%HA`=Ak<b5;I46hN5?Allg?B77{N~hq>DQ@%X_tbToBQQ?WT=}`dtwb<(f09 zj)Gu~+`D|Q;L{S+zeBh20Bp6k09v9=T;c(2=DyWezj!I?2Cr58{p!BsW(2Lf(H#~? z2a!)Wle}io$7c3HJ|r_MKUYsta^htCM$S6uQM%cer3CfzyN2c-(kRp|(A-q}5-6!% zSKQ|9FD7`;kZFcq>b~N_x!cv4q|Xw~u;%048l3JW6`d%|HlvttsIjl;BI3)%)EC~2 z421|(Mt1tNwIW+jHMySLL*4(nPLlSx1mdIP#7OBc4h|0w4-HR@=7-ndspcr3=Bb|d zgj2b%lE2vpH?`3?AQ#1=P$rYL#o!w7+*Q$n)RP0gEUv026_0CEqz$z&!mx}0I;n`h z5adPzx%gJIH`*p`)uL*j_L*TMq?CZq6^6U6L{4&-Q1&$oox=;k^+KXfvlKMS&6Ph& zcpb`M&kBTak#$^Ha3{W;d~}kq*_iMzkX1K%!w9?eUfY>^%`A8q&taVafk%vGqwAm* z7cY>GZt;TI2-!4btrJ8Nb_;+UNJa(enit1WdZu)|S~(saU5P3#Xs1a}3AK`#68Lg6 zh;3f+wUVN^JTbi^R5LZ9Tb_jP7tZqWwZzqAJAsq153VfK&SSrDmFUn=#kjI0CIr5j zP=i{)P@$s@o`o{jij8WKT@ikC{`GSkCUT8Y#<gqS{9;elS1tuWq&oDgtR0p|Re(sT zz@ZM!jOlaGfW{Mu9KdnX=O@eIptv)Z)M~Fr|5nG%j-|nTqjWtI`;+=!8C5&szh3xI z0u9E+v)rBSYhXa{+&)fydMXBN*vIMfTtIK}*!8z|l1l=F9eR^!Ab{e$vqOd`u<$+1 z2A0SqI~x!d37_P6QzX11!UAL7`?DaM^X!=Sac&a6B+Iz>Iv-viTDKe85zqc?JT9z< zzsF{5UZG&qArnJ5U87v)h>B@Q+Lp^!>W2k34euEVVjBJ*&^j8&@<UoNzl2ukb9&H~ zBj2yiI4SjJqF+i*-55@HYSHjJ-IfpUCVpr6t>vhYsbhmFYn&z>lWkbf&*t%^#Sezi zrTy2wWhL^Ck_4Im>S_T|UZIZdrr4TtKYq5m2{84|>s#@~^|jpWvl>X)eEGNY_{|_^ zA!DlkS+q7iEAZ^gy#!P3?P+X<A}!7nY#M0~(HlP1`(n@cK}_I7Tzs?mlB;8o^1tq5 z62Lg&9}K@v-=JG%`$i17-zEm!=FUDe2WtOkbAU(<J<)C~=LYcX$zR?L5rW{-d~XOP z$wc&k?xHVnW41GM(<5$W{)C<w{b=iE$Lt|WN8iJxH8MXh7+DdpoS%>WjJ{AjJSW8z zB^l+pbobtE4S`Z{HW07c8nh5)0uDy$w1xz!oJ1}9)2gve+VC~1J*Z`$;>(`C`!FjW zhy2Ooy{q4?YylCQ1wx>X;tTE>*%57uOR?EqAm(%~bPR1*NU{^y*73RlA`2-lA8zK{ z5p4a5cq<Vw88r|y*jqIEwqD=Iv)9#YM}3GW4jYv$@F^iphQ54?E_I<VOWK-j$*pPn z5=t{yyO+E}(3u7U5;2YlOLw?EdHl=N+uDfi^JIm%PL;(Aa!%|@Y3kL*^eL0$Jiv0Z zCKPMH#S2t%#gb(P;LccKsr;-y%MG*2S>x2m7oB<Jnlr9#pH3b8l34=t)B`)LYzoE) ziQkiDDx8p@d#m?`xqyV0;`KAZq?2etbmNnt^=gN1;&<1Rx(K?hXsD_c=ytyYBuq?K z;MVG01vC7=ly$BL#!~$SeH75*Onq7RZTmoE;!-l5OeJhmDc9JLYD-SlYsN+s!c5^j zorXx8%b15-MtRjyo>KE-=!>KI+*o0BVCWub&Vfaqgr68{)(-F}O=*@#jk1iT_Z#DM zs^wyN(B$_-fsy>4$Y~?|MRuQu&SVA0A|0=VzeHEFl%@IDqLD?UMIuN=E9;~%WnF5? za2%nhc&lWq5uos@YUjOW;ZswOAw;Rzxj4CaP0K3;52qQ{RPy^c&MG?YazaC{M?Suu zA|KZbyh?Jqm})H@k9@G#$=4?Xy&5RRaD%c=Ib<^VG+r;wn)bnyj;7C(jp;5~m`bTL zWsedn&{>kYs<LLM6C~j%J+^Dl<9nVgStbtmlD&{IG<{`~lFD26%A_mq?s+E;pOjT_ z2zct(IN?q@hU4285jrVQGkpm)Q!SWbV1GAdgHE8G>32@A{NeP8J{|?CF2z^I(f{XS z!ctq+(UeAid_?C<l*(;VC7)80I%*Ou5O{>+ooYBSb(MA~&?IxzUoJp<V8Kp0y27=e zVe$mzzpy%Ro!C!~!a(*>L@@dWbVLripbQ-`2pv&^ju?bn9|Tj$_j;~5h#fqiR`Y?P z7<_XOielVTC7^fxQ(`)(3BB_LDJuQv0i~6=nYUn?e7~B9${2r%(3zrBngeH?Kw}(Q zqJaGC5uOh^(S14pS;*3BpKMC3`x3O!5WOcZ$r4nHsH~gFZCu}Z??K=DiEQurW_->5 z{|00D4ccYfTu`w0=a?m8n;^yO|5R^v)G1r#V=mgrwidXf&O`^C!91H5#6%dP9fh0j zK~)Eo^0stdPT%Ui)(*dKQ2tM7dHD;5U|9oEk=jtp3l~q97xse#hG?yUSx-<#EG#Q{ zE+K8-fUCx*#h{auQV%=A>l?fhJwWx*k8%uL82L8RN*b3|zJ@nTWMtY;Q+j%XLpWJo zF|l_DOLT4V$jYK+V@RUR|06XcBEOZ#nPG4A7j@e^-#%a=m_MQcKdli%V(H&7gqG|C z6@VviB$wphql8is>7_tC60gYLBM%8CnP7o1=IP1$&rX50isYWYwgM{uIgKVohWWE; z-(@z*dqToQ|2>P^=qtTm3T+A484TsGiGpCz-VqV=7d1lF3K8>ugFI`|Fwu`w?7O34 zeqN2}_(&1rshFXpv9Q3JMU8HjUlSR3p=Z~Wm&SB#&K-@kfK()G^kZ~?O|tcul7$u* z(AY%pvJ|U{`oy2EDe5!&>ZjC-3HXeVUdJ)cSO_(XRIjHvf<$j%=wV6p7Wo{0-V5qV zTKR=vqNDFIb#>-^<jFK~Z;D^zC@T?eMs68RWl-(*D5~b2QdH*JaLBsh1cH;z^(d?D zB!<RqiOwm_A>v3`dZbCm7znRRi#6X%T8wmOr9%tnmmetY+)s+=6ba_2FOh8-IxKW` zdr2OTCi|;ZmT_nUt)vE5vegQu1Ce=qbY-cTqB27zcS2-pV9!+)F1}-AMvG<!g;cfl z2aUM=J38weIzifplZ|;>M5a#cJ0LRurkc(WnOnMaAR#t00<gbA+vLkJV)NQBctZ2- z)x!0R7>S7KWU%$5=Br+0b#JqXgjNLOk!BGhlTRrk(}}Idcqb2eiYmm2OlN+icYf4} zO!v94M1CP7GVQYwnPZT5V=;LbeT|;s!bwP>G;t>>aZKFdP$c5+c1f(F!y`sCJ)rsj zk}hr3)lc)RyWlGNAA|{hQWq1Cep+vfaOy@i{iYV^K}tBPNi>s%d(Y5JoAZ{vhcIiY z#S0{5K%&}W0f`!tLBe6?74NQ`sx<(WBqHhGs`Du#X>+Q3zDS^77(bijJrMWAv{Lgu zq?LX@b%Gzt4Dvmonf`+sYonR6Gi!~8W!J2RWtY1BKO61Ti-5?lztK+jq^9P(qM^R1 zLvvd+l;Gn3s);fhYRqV;ZEMp|;!83TDi;$lmQWE3xm<Xwx0{72lBps*-$*23*uuqu zcG^j1U$>?6+)<K$vAi=d1b+`zo)6y+sf33*cB{`wl6L&e)Wpey2TI3J&K!IGVCnk~ z9yxOS#nSU94<0;LdhW=_50*}R{N#xv2f3e_{oc}xFC3oZ{^ao&kEK!r)y|Q4Z(dnL zk~&X)?Bg>h50+*RpPc3Gxs!*fo|{v1Gbc+g9DHf!`Qyh*$7kpCH&v5YD^g7&y9!i= zYle`s>iUFz+BboiD`|epJxx`JHEwl2enlVbjpr5KZ7S$6ubG;YxO`L=9$qJ?-qeI% zNmXYP7wWT5R-xTZP1v7Q@f!J|LTP=l!l4O0p>!DFcFQ|`Z~;nm%8{+H^13wn@Z_`$ zXm2^WHKOxuC^_1vwp1xq)s#((dAw^7mV762s(RdLtf%&+I$>YNftwOpp_^D`U0}l9 z2b;==W#sIq_2E*;IB9j-aHmVD$6*puBTZ`F6<w*$A#SZr$$4J%UHoHZ_K~r{Hj-7o z&u>Fp$kLwO<X+#icXzk9{Jyg}FFmo_jaRR;qutw2?B4NI_Epz}+xqt6-ra80`@;6M zSND=JD*I-8*VmAo-uZ}LnRM^Suis6C?p#N8XQxs()-i5i40i9<gB`jsIk8Aqvr1wP z9eh8FVcK^38R_zFD5ICJ?bDQJ9$n{AY5|BuDo_wF+EB8!{qs9rmh|}DyBd})j&7c? zp{A$f;|KLTnGILMCgZ8K=HlZA!<dq(XnQe~@DuSw$2_DqQ<w(V<?t@g1q0ZRshROh zlG=8qu<sJM>Go`P=e?5J2=;nrZdiIvm92;F;ys+5A6Lre=kf0IV>PFS;Ck}PWZRpe zgrA_)uFw-UO6tsn35q)v-j1ipzrKb+#8V*SPDMg@g9uX~I5k2XUm#GWBANC3E~ybd zB7#Wu!ReI*#@FZZd=vvw7LLbjGkK7qLu*uq69>^^8P2NRrgq^O^(1Eewn`T}lIhQ) zs7C!rwE!LEWQ*USLGgKTV2PPuE@)%=6kPl*Q_SiaoFNhKQlI-VAm}%hY#x<g>Koam zU|yDeQa~M;eS$gxBU`RZ1xxLKDH?BLieNcrSv+TE0mmu(7XRsw;Gw))EDx;?!lO#q ze@Q7Y)QctS%MwcB)gj7kxb|jq2!+ENtHY>DhUGeAS!xTYN=opem{3Tm;JDG|29yz` zhEO`w%il(+QRFjvs-+F}VLj*9)EmuVmvJ^afcj#@y>a>5O=9^GcJ155{0q-8S{`j~ zAVI=tbBM4Jx#%0^!PUXb-++%*4)32NF~&v|qB-Vsz|HvTh*E&y;W^SA+1hinkAS+) z&1sZ*Q#kmX%3-ikWOSp~9%&XC-NY*WBb>Weq?n<}#^xx!->A`izW4H9q9>c0qxH?Q zF-280hRS8kOg%Pc?SZsK>|i|14dUkeozC1i%A8nqSztGbbdlAe=bi1t`*|rUiJ(8p zuDX><{b1_kJYYLD@V6<INvwm*oZo&LGBwS8+?YcJaS(%v21Xf6xwK<NU#fez>e;uc z@lf0|Y)>cF>{;-r=-#!7xNG;Cg9>&pa?Pz{rHnN?UCee+TEwK6>rI_H_<YjA?v3Bk zygW{gw_Gtbd-z>#_I<b8>_^vV7RJo&f)Y2j3%13(pq{Juo$0%otF=vZdZXH~)rnip z_V*_3ADV0AAf#C=`w`q1A8tqH-7qsb6E_7mdE_X8)nttz5jw1!NpoXrzJyd)-iTxt zBeO}SLpmH=)Tsx#*tFaiPYaedb~p@FwN1@>hlEI?1x(JN`kg?_Jm0=e^-FPo3q8|Y zqA%&_e~ZT^O=}InUF=Z`hQXN4sI^8d<wx>)#6HKPQs#CuEG|chw$psgep|H)w6qFQ z<)U)Onjgbo&|^vMT79)E7bA^$dQ(?@XI`CY>AKg(BE{zbV>(&6T=rp7k4p>C8op4e zTr#N!bKfdbM3|WH(PxmvSISN`I&jggP4ve!<fH1>FrjQ0mc3_yO%rO~pVrqlTT&R! zYPL?$M`i2YYMN3~DcC>hOp$0v5|~pw%yB*qd2Q+#Ax51Sg}m*F_RY6recLFfx5vo# z-5AY6sjwfkQ3cay`K>+6<=wKlibZe_zlVq6dc3(f4Bz8PnfE~WR#!7^!nfgcbN>~H z-B#5{Cw4Wl+ZO9zyTHxN!v=4mw7e}@8_o3$#Pd>of}L3y+Ow9na+$&zN!xhF7K}V( z<pGnld0R01R`y^;@6T;{!N>`&kla{>ot4M-Sa}og3|ZOD<t>y&eurdk7|Gn$s6>;E z1>+#PdTe`BvDjyuNYw9w)3zYJLHjRolVU}TDl|uI82~?9C)4cGK%Im;(O%ujkY-gT zD0*rM-pqJZ4&20f=DI=BTN1MU7<3CxW+Y|qg@#nBH{dJxM#b?LBT16I^)7AV?<W3k z<}bfXTb9Q8v_-UDtQWt_SypSB9GlV9U5iU=2*`EiwE4V7qVgg+LPxuFcegGgkenNs zLdm+o$!&(%Z|VzKV>_qGG45g>#ok`qF8eduQ_@p7PiX}uvs?y1JpGfWnEo~HJ0X)? z?{R;ydQRb817nrwt_0e2Dh#|S@&L2J959!14@^wB2|4#!+-&O@l|uPK(`PhA!OmIH z=kT+#F(j%WbAP+-_$WW25xSE))H|MQyuaH>0->7$)Zhv?l1I34e$VvPe4ANmnRdH< z@~}N60io>t%{b{0y*3kh>-ul<dSw0%-EB?v)lbETTc}8;yVxCX@7C2ekKzCe)!A?$ zB0dE2`#Bg97!@3QtL<*OJSVCL%Tv`|*0Hy`<F-nBr(WmgeVY!wB~6HVV`+XM_r9zL zGRFo*n-`>6;~Jh;u`g?K(!RV}NqI8j8s_~J9rYFO%r5@CVQzHB5@6vLO`f34!UVH` zaducp470rhoAubd#;nI{`QfU>*VI|Z_A7V^>*zfevt0yn#_p6_I{n05wA1q(51Qza z;9<9FDVydTYbjmWb+Oy5^JApjZYS>79o{(x0b|%hOgidvr^pO*yvs&nnA2watU_N; z_G8hE#2Cj!xBZyKd0{(d#`2`b(yiAHHcZiL`t5qneTV0zouV!D%6VS;{>$?+`n)b} z{a49fPF7(vYk*ZzR}j|Wc*z1LuHT>F!yUPP%TL}69-|ZH1a5do&s-u#poYApfP4yZ z)$RmdqP2D>a2t8n6WklDcb*gx5`R_0<`;M#JAscA$2|@^k==rErV#m2%AMrL)q$VT zMF=(ehAv;x<!j7}0Wf!H?Hrhem92>pFzeV_m8jyT`lS<W-jkb$3dI3@Cw0wwPHNle z=gvb5j`7yQ@3HbmgdAB}xv+4qvQTz*o5r<aj2`?Q4dAB?a7dpqd*jfGOU3ovbr++p zyn<@SXA=t{&8b2!t45@-=j%!UmWrC}LYs5ADX^n-UWW3^*R4yiNTdXjF{zB*)fG#n z%_HK~2)m}b6KvsqNgt`s>WN!z?=r5RR~N3=2oP7l5>@d8Emg0e7&Q+a0<+cX>zKhS zc3d+0VD3sC%L}I~%QlD-(WDuVS@`>uWeR*(n%tMDjLHl3h54&!R?$_N^3c0cTE|g- z`0Ac1B?TW%H9SRKiRMdcuGl-%DGOa^9xa{nE}&K(ec|!oyBX?LBEFSN$E(lSI|}Yx zH|RBk>D3DPzp&0<S~*`$rGgH9Olk`~XiEZ?QLtq6IbMrH|1hOmuAHe)@T#-KT0<X& z8JSflm4MeSnN`23B=pd!m+YCu{(6*DA8VEZ+~oiSJYrcf5>zL;*ZXRM?hFRa#rRF9 z$DMUEpZ6Hq<GMDCERgUIb)H4-iEeCcN%qbfM4`_0EWh4tHYNpc<{+8kFk4{ToWoL* zHPADo3bJO>?Vw(e>7OKhf%6_u^~H`=9KL<v7VvEy2&UQjrdkmlS;W#|tw_)!dDEPi zaZ3=na7%f7y4x%qjDNy#3%k~Pd2vBuVQm*C&<mT#I7MIr$t<(vEnpcD+GeW%<>6Qw zgkCiB&h;VM3{feSL*944lzzW<;rykNBu#Qbayd0aUMEGkOb_{%u&`8G*Kd9D&BRo7 zO}J@m)&1n{W<A$9dGI^)cm@+B1(Mr`5s8&zh%>hyTDd~tqbt>`B##0$82sK*ij$3K zqqu`={Dq0B<uB(Bj<H6!JiNcBt?Ve&F@#qrrZ&2{TjTIbfN6(Uq%*x1ttM(MNAy}$ z5NQrBeV9Gt_Ddoj9#9wWjB)#q@qtqe2!PC(?_)UB8D1>_7)g=W6sqkiBZn3Rrg<-u zyoa?A|0&l+EEMIs*vP$kV-0KjFwdR@YX?SO<@H|t{xZTVSkBQfyCy9YvDG~iXF_bL zs`VmLXdC>Cco~aBK%{}8HDYm2Q8d7$fdG*PU+zQs=O9wvAW=V)Fi5VPqj>zDCyS}c zT#p5BctLy3vVLoaxOCs&XbK4|-(-KYKX#eC1r?S2Uya3jy4kmp#Ox+#DF!U$!yx_7 zBIa!pOrjBFB#B(4HCSD#&l5<j62%BYNUBwE*q-=t_EiTLsY*9!X=JM=oF(b5F=uyY z$J^xy=oS6i5%|m8xFbM-Nj46KweXA@8Vb@v^q@ZB%{9RNUa~yfF#*RR+m~0B-0QsW zdhz<pl<gm;YSgA5rTpns`N1e6BZ|GfI#eYO<LZ#rLCP}kxxS&fq4uMwNDFw4&*AH} zK}yKWb1(LwO5KJk6@k|od7gdUDN|k4K>EN_*17LkEM&oeRx{}QlYUlrzo1nxaleJ& zl6$y2zcRm_9`1&gaZ#=;pD|)>-p*%h+#U#I&l@vt@r_#>j9YZ;*ZTj<dl%@suJpbS zxOjsg2|h$okI`I#qHsY1AOTV@3Zz7W<P1F&r4gx-M390na4$%Zcu?nFh~y<OPQvkI z>~tn}SL!;A?Ulw&mgB~4TDxiD)vP$FSL51ol4jM7bM2;Xoi=tlZR|YUdb$$#_y6`j z`<!#{1xbxZ<1UvH&OMKP_Wt%hdw=_Te_K&r%!bb?K+&{cFILW7TOme<3HhVHqMLol z{Jo=j1E;6$f0sV%D4;0-u5)zi?bOHJ4GScZz0O%6i02jlYY?FUPELCpK6}6_3aZBf z?QWzNlC}8&LO~O_U+`$Lz&H0sx-&1};(uJXz0RM7XAJ9-j7!ch4?02YVOJzYSn)pf z*e*k^cSQ*lvw>GcS^>pnLJB1A63(Z?-hGR7g3D!W`{O7hW5#J<5Rw$94te0N;WFa3 z>2wp-#pSZgZOA)rp>dLmV10qo8zb2YCEqQQ7bYSBAzpN_OBK{(M2~Vwn8gg_^96B7 za4b&8Bo4#)B403ndv$Gz#1|2peKAtN6bGBikRvJ{5bLC?FX_;TyP=~qfNBm66L^I` zaAxH}>`CaI;?x7Fx4Dc>@|-15!VqM*k)iPNLwOpDf*)9wJPskw(FGw@$s4;3E9J5V z4Rc34in!0*TM<-_FLORI4a|&#M{G)f#aUSTc@&H&O(77#G&9SORu@ZrXh-Y0HXLIu zKv=La*KWcHs8D@i+8C^F1KSutE`)}&++xGX?#nvbGz^z>v}wiX$*i!EC%hUu9ZuxZ zu0<2aS4u(*g(3-{`2+dF#OTO_;I+3t8A{8kEIT)pC$}j+!=unz-_e5B+7Z47JGqft z7pT0IWXnjbWIwU98c5eL@8N*N_jcwo_}iFX;cwZ$W$?Gtjm7rt&bnQiHsvM=nl?0M z;`jz4(W%AT>|Zv*Z{8AaC%bJ5uQ9o6<!CjS8hk>SKGVh@DpZf9=klTw3c^L7zZWKk z6YeF1Z3kZ>CT>j^mL_Z!=KrfmDJ=J+6Pt8EAVmKq`*@I^nB|HQ2qr!8@@XThRIXW6 ztFp846l;T0sqMPVr*;9zT9BXuPb8>7tw@@FcXt-Z;II$vZDb#DJoR79kG+SaooNSc z)8#ag2C~Sf6lvE|;?fMf-kKNiy#OLP^KR*3cBeWJh^bEqaXbSAwa%;GG~!rnfjD-i z;17avBL#oIyqbpkVmw~GThQHiZp%u&15KExXo6E@h<Lf9+yPB!MxWpj@o3%k{@DwN zb}uQKd1ize7RRM%zLeT2o4ar}HhnQ^T7vHk)%_0TDgsRq5S@BgQZch|Zgq8ufJdrT z|Mc6c1xt$jpjL!wKT5T-Gt-Jk(oF=nV2jStpwo#YkSCb>Zvb|ricKzuB~E91q<gIq zw$@EDxD0G#0-0Dq2hz46_b|(#Yq=ivM>3@>7FmB;bZrD_lXf8?L%r<in<BwCN6c{! z@Iq|2CE6QR)>>Jpj<7gR2Oy_!M<B)J(iFeXV&lX0Sht#K<bC;fE=s0dWow#WEfMCi zNRV!PRq`*4l@_m|52!8P8qMEYTB{H=$M0cB{i6@pic3;?L{_;-aSB6~HF-6U0v8$2 zkH4Tuhw)Ze7#_>S&xs2i9Z3o8sc>`Wm3?_apOuVj0{qM8-m)$PU<43BbdJ7|xs$or zr?(Cs6>Yklc`z|Kad=|v@ZrM~ncJC*ebC9KUsNTTC$GHx(u*&QWp3fUvWbG=A-%}< zz<kn=zChB+P<zWhw18i)#+}N(->Mrex{!An8#JtEPo6t}EPp1>N{LX$NOkcFP@k45 zDgVOAXuhCu!pA1C;9Olg_M#hrAaK%V7xv|GF49|`Nm8UeFnNn9R&yM?yr+RSyH1mF z$oAz@oR`E5qHUwL&Do?(TZCeo_U$h2HgA1;^@n3ru6^4=tnG-WY>S;+veO_u63)H* zG$4BkYDOSL0HBpi2ySF4E5Qwsz-<RdT1j}qzUaEW*ByOeVZ}SIS-2nW`DD8{x~JMc zT+;P5yaHA_u}3Eu&`J)w`8bSVO6b#@68by~RL-?pLs8!~8!u$UmL>zl$kGB*KSx36 z2ir&*)G`v@G>St-C;X@eYd7zSPIwwRK`~|!!sPmiHdEUf2JYKIF+`sRpl^=T_|Mdh zv`HdT-N68SAQvtnOl!qz{EYS~n|4NVJxsW(Sz3!{S?>^XtM2}7t@kv^z0!MH$t7M< zn7%&9hJGJVxXX63ZWhIsNXAUX-y_O^VF)84jQ5tTPU*ItibX!P=po7&(Mk!SmAi)c z27NNZ7u)r?o$Pa|z;9OV<{KU<cu9DXes#GRDTJ@p9AgR^F-e2l&J472$!cb&TU?o6 zT4OKD$e_-`@k$8Aj&~_qE4vVL&5g0^8Eb44u9SCG3T5RBCVJ8!#2qezwwh}w62CX> zuLvTF`N=VF{B3IX5hr>RoF>T3g6TzN3S_6f+6{328WK8&0poETco*jx{JZ%N*H)$f zaS{)j0hkoDq>eCia~x7la<_QxI(T(;rCP)nbwOj{zmf&7QrDV#5)Y^BsNY;^38n`x z`Oe;YL1TdAmZ4l)z3qAeQIG=9e<BDF7iHRiLCX{Us=kqt9Z(YNtbo=EyfCFk(-o`e zMLyD{RXsNtTt_#P^7&-)$CaBp1z<k^=2{i9X2leV=P<#<G6N~A63>t2C-UC`oioY) zp6sJGNhBCs&tELdn4@}^)6-?r)Gr$4;|px|v!2hNmVL&X<X6c6GNykA?bvvl+}z|W z^;(vmz)N%j@TLJ%^NG`Qs1p&!D&RD674IU!Th7l%#me<2fPpmr_hJUpeEyZAs&uu2 zJb7`R(~GytOYGs-@)jHx!F2xoDp|$zh2f>uYwIicOUM6`N+*ssRQl2@)bz$8Qhybu zQU_dxxka>b;$!2UY<bG7tBS*h@4ow}70Sl{j=q$sH2tx?t2cya3xD>DXWrsLVo<W4 zGC*;HN<Z6JtcVkC1tGMiz+ELvzm{LSmBNiC5T(`t&b|Z_WS2B1DywewVnjn|q;&qs z$|Cr!n8g838LlaB_&3vlp|d<Rv@=Hnc?*evVPFx*g+gwT_FN+QvK-rE{B4i1QW`Ih zJA7G6&E~n)k~3V=5IZb1YdD$VvISV6m%MC9?zrpPMYDTKOn6eSHCo_U+iw(a6)58% zOp*0WuA61_d^mdWb&?<fGL<gR5+2Ed1?by_QHUpk`z0WOfnpF7k)Zt1$9zL0@$gqd z6oC>e8@j1XoPwnH0X7YM^`=FhNcAim`O{75Rw?K8>Ue2wnNMgnHU|U6-+V%LLGfzW z`KHTV4~bG0fE#0{^}rv?C+nTt48gI@(MGC*@LA-Xo^V7ci^?Az3pgmeFf;thQ3KcG z5zdDmib#e4d*bM3aHnue4ERH94Dhg1$MfnK7%p|+!SBHg_h*J*dPVRX%F@XrBP<m@ z`qE~dNa3*1iAP0+0k}+OUV0^U-#TM3+s(5V=Ea=opMJ${>96vg9MYVYjK<cLZ4T|V z_$-rzT81AoLW<`?)4bkU?L*yvw%Sj$^G-!QpB-4~Mq|w{rY`0<;Z0q(n;^3D!lkpd zT^HgEw2m6kG9mu3#h@3JY9urM5kVj9oFC){Q6KOWhA}A7FRFAaa{+S_dvnF*%`u+O zj8Hrivr9Gg_?nz;>wgWY-kR_G?Sz$)`9S<%KZ$i@LE~^@3l0z~jf4XnrA3taowDf0 zDniBs?dDmH)wcOmBVvZv8|6M`1hSLZke9KuDL$pM8{KxdPbL9(erUaaz3XOs^gpck z+I!bA1Zc;%ITu}ji$Jq>?}zRjAh4^vn7O~vPr&;KF0&_z`t_Flt0UrhMeib4HY0?7 z*lROYXqP!bp7OobKI2ONzUNB&OC1;-^z-KV_u7bMejblzwatW(m$u@5t@o2HjF7eK zx$jn5s4Z1Y7U;9mHVxoy{hTv*Fdn$m8%5x$y}p%tN%FKlV1^1^F!8zQPcv*u=zG48 z!r)`EY(9tfS<O8}A20grD*HEeW;P6pf}hB^%?8Qb5~IJRFTJfLH>(i8(O=d<b-PIS z-mYP<*)=$lc@|+9j83I|0rsfwo+Oi%xchhQskt{2y0zY0Vc!%hRqxlCi>)7>7pRGJ z)8w*Z6aTH|+Z50%ESW4DdT~+QgNV~5G|c6Cb2*r5xhM{Bh7dltt)shhutQ;AdvkJG zBxCoWpO;1;m?>n(*$XDt{(aa(YH|Lwz%#k)i%7J$&I{1^pQJYWSDE9GVNZ9N{ZXtV zll4)HoT5JK4KDQy?UwnboeVh2C2ARPxTj2_Y5%j`kwPdGKL`GDsBJa6UBn2vRK~4} z#53M(0+K%AWW1y_=5Up8o8X7`x-n-$MkM%F#C$?E#ta%X+ZqIv*uJG}<+-Q`6}-5z zuy{wTh&AN6zjsBpidRWB2)}Z3W%c%onT3lF#hdt=an~XP6;A!EgL?y6ZnP+i86T2d zPlu<bnoJTez#$%kvAZd`EPRv^%dT2us8`c<ig1L8l>y}v*70%ravZtLq{L_F@!3(? zJm(SJ8Yjx01$ByHP9Ae`*u5zID%|Ia!4|05V@WQXh1;bwBH^Z{cy&EL$KSk-u*DvQ zT17w%K@ICzmh_rWfZ{qG=Dd)uVI)%pV-l4yK$kz1Iy+|^@_c@k2w%=Tpi;IWOb2qt zX8xR+u=8b&fmZr<W1#P@t{G%}ucgKL#VTN3Q-CV_GA3GAlqa&zS}4^O1~U7}TKBpT zy6s4}>D3j6->hM%L00$v(;iR0t(r0G3O7h*1OcCc#Y42plvwsEg^T4fN=-vB-pAQn zZ)_NyZ*#o}zhYmvn3~Fl2}qcWVTJl)F|MrZ$^3J3_(I0CHArIjveeS_K`e>2ecg!| z&EK%YZRA>+wvj*B%}dg;*9SovU_&roZP2fUu%TvvVWB%k*9}gBqgy(}q9avg->E&e zQxPm@`QwbpCB&&DF{54e8F{1o>{?1W$QcP+lx*<EfV@7rwiqPl;D-KmTPr%lNmJLg zV?5YN(=6%+DVH9N2JDY|Z+5A2eQ|+YJ<}SJJvJn=Rus{pU*}kcQS8oSnBrG51EtZN z=FfDsawj|C)WA+%mvX#ogkcN8BjXz1N_`hh{SCM3yTs2k8p6<GKh4HYlL#KsM6z$o zXqlf@x=49JUQ|oAd(hF^<8fP!K95vl|MVN$lXRNT)rO6dKEBSKQ(RtWDX+fVg-dwH zewmluXOlbACNSyIyMjrbk!PkG{$$wUG9T#0cfx?ei?4^&KAU^M9Two<Vh^|v61aO! z@Qx2$SXHK%YD_q&GzT_W1a&JLY7AX-k28UYNJ|1F+3=!$z=9eb1E#P%?Zl!Q%W6J% zm$#<wI+jOGU+<LMvz9w1JNEyF+Fd4=;Mi6ln2jV*sZKAkebsl&`Y(TB)g`SdyDuf9 zAir?xeaK)h8js&FbxmDdR_Eh&gF|hH=~6_yLN=j!*d9+UFS`#@Skp<^MSm43o%Cgl zj^0}(SPYac{k%^P2^>QrM(EqN&)F}d;+7V6$wrYH8)Mi{{=e~h|FX`T%#&5(qvU%z zo&vY)ff!6BSd{g~1Dy1J0nnqrqk~qGOL3U^=c$DU8I%jqF+pHXdOIQMI(oN~<ggPL zy`J73^E?j!G)AxUXNsMKymRIXB_;gqjQ$>l!k}uM>dz*ZmbbS}sC6(m94cy!6aF$~ zze`Z5Np^)NnkEK#h&4DnD^J}9)r($E&5gutK(Ku=u9d8B2CEu~{}~42qB6uG=^!?` zC{mz5J^dQ2=DVXq6s&#Tw$TU0KM*zKGU0>>2!SB5eOdO7%DB}sNqv}?Ptsa?3vTl3 zlK;8QKf#q))IVZSfG=xo92RDadE8V)o^l~cB#7VA$SEd&lhH=vGx`84X#w@e;x^<E znwec;@Eh$lO3uK}>$dDe$h@w%g?ZhUNIKWzf6s?@q>ZDyAYCE5(2~r9`mjny#EOvA zq@j*pMp|n6k|MI+m21#WPKxO0p;LFIt|{_$oUk;!cMHo;a)ppCQ})xb<)xG{i`Ujx zv5fFakhE{;s|J_Rb>5^xeqPXbCFR(x82NoyKuzBpE|zYP!EL2_+;m*S8*zQK0DPp} zTqUul)z@sm!S=M2PfNbBuxLz7WUoqY>KqmIip!Sb@M|H?Ff=lP_Cr>_!$%~@8rQ*v zybm=H#9ui&Z49ImSSi#0ATt-SyI@YX^enuyd8>J={Q=E}I(#>qEK6ii(%9WZK)ZR% zjSc%K_@TXhN)=-hz%gCMjaUR%iG;};v&1*#qj|IW2aavFmm%>>%6{VAV}--mdC1<) zATW!oY}Ac_8)TN+h#S_S#o5PPgbIoB$n(T87UJpLd7z0j@(~fWfE?z~c2e(+C!vvW z^?o_ey6ItoN5D5m)7j4V4|pN^?>IDXbRzTrjF!HnV))@8&X8zB|J4Tl*9#aXL&=5? z7I;yca<tneB1Mpf9mvXHh*p8n$r1HzL}u_PP@D^q#hft2sP4skvc!PRpsMVj7pT1k zYBzE|u;I2CNGIr-kFk|RsQR1c&q7L(<*yA20qcwsl)-oBj^hNRh>k>OAdwy&KumhS z{TgGBbT9YS98xc6sT<wVXV>9TaO&ar8YX<}xPy4s%04@Q{$1MOGuf8@9Oscm-OAI8 z$cFxVbhe>`e0Q2HHhz-3^&aRaFncAnLz?L6r+E06)NPHBTx$B;hZGYgSKASHUG`wc zcrt(r(egldHXCwP`XK5<ZGCS%)^f1j)<2L<bf?d+f0j)$y(QZ|5WCn~dcw<zwL^EL zz-z_drFmO8VHeXr;FS2rf!j)!C_wr$NoMkhI&hgsbqABau(o78wR<78Q(%!jeee9e z#By|F!=w<pnV1`Iq=Z21>jp?OqDJ9|UUn0=c{E<}BTg#`29rvcC+_8SJpL0iwS~16 zg^YHOQf76f@)Bmzu>R-iU_lk6R8|fn>eb8+FtkAI>e0DTLJy<hk`mmufd%tMFKQo{ zv(138$0^IR1_+!pMr<{M`%p6+NyokkKxT#;AaOdb)>!1BBvdf&)(lFKP!IL4{aMZ9 zKs{}<UMDCm#uxf!RyuqkG3t7URyzpG(Zfx)*jlu$*6PoxIZ&0z<L$1oWPLtB#`~}( zsc!!j)h*zZA!#$8cj4oYu^<)bw)ifUZn_|gtW4+JmCcb8R;3H$Z#0J8D=nJdyBOVd zgqmWp#qk);U^OPmqVfVlLnNMF>}6};B}%fD9}`w7p)Cz864dc#+1LF}f)1+1xixtg zIL&PyJCLH;Pni_fNFB?4glXg2@`}NMpwnc_1~p4?+10xVMv$`o{~N(HJ^}x<B{Nu> zGm~XBB5M(X?76jQsdy`KS_=+Ups~WYC-w(<nuy#25ue2N=VRSkl2w(-gBuCDfaVjg zs#fk)PJN%CH~Zuwxn(3AoavIvGy}1ZHJ;FkX!EC;<%Oh#!=_daj67zKJ@LI(T^(~; z081O6fb4inMzdvIVYo4{&R~D@U<(k(M6=jbZ<f%qU&VRIUre;{JuQ*ns=QRPja7>^ z&sG-^3TITlO$h9j8;fDqqn6FYAyTdebE1~T#)}o}nBUI~(6lxou7>R@iR0hG*N*4G z(=M5(+Tb)2OjX<PY_g`eyUilGv}hq4;U(3EJ!sKN+FZk6I|h9slRvGXFc@*<{KOqJ z^(YgxCUxJp7B9c>#0^onyywT{SbjKZSp#9+<8IPudZc*ZmbGp=XGd=N;dh=`(qvdH zU7P@<uwa^08&n$`Qc<}HCGyM9CKzQeEwNeVkpJ&@yVw5oakl$^p4slVY63Rz_F^Hl z;~RJIuQ<8$kCCqu7lCNu|KJMt03>j2UnfdfNm0r3AEMP)s?#`;J^K7p#8j|*_uGjk zrYEj^j`AN=6<VKImzZhD3cTMx>*U$jkXgcCJb}jlz5-o;jl{8boi4vlT6^jwi&&}s zcpGo`07>p<N9Ct^yGL(EKTmA+KDd&f=l!1aySf&v>3hUe#|j|&x}#~<kq8<GgG^W? zk0k<gPD2$gF-iWq?wT&&Y&dS~(i}j4N@qW#!*e<q$7Asb#NEIG8PA!Rq8p9$vy`lN zu%FjE7umM!eL^dy!D~f6{Y!m5Rjw4kO8q5<$HfVFnjnK>PM?8I-J>`uMDnoD`z@ib zG|zq^&{zAK=qr(Quk%;Qb4b%yNt^(Tyrn&tS$9t~MzP`-c*|C7!ssl3VvScdz6AkH zykxYZ+y;|2<ldA&sjRL=sETnwFG7Feu`yaocIw-k2K>5RniV58!HX0+m``}6g3I-D zyOiu6Zfl8O$?QR{c`$oGNc+GENbyDy$~i^?^J!D%N)zt6w$hrV57#!T?(4}7$>^Lw zE>#tg)AB{Cb9Mv9^#!9)@rsH;EoyPu^vm88*Gp{O1{Nyw;7_*babjjVie>CUMr4z| zPqyy62!<BBnz22WKE${%JDV52wX;&n+$_x^S&8^zK}guh<n#C9@iYc;!;75eg}(Gp zzkzYl#Wkn)_?T?Vr%^b>Y|GAgT*kx7+FW(u^{}qF)>?yZR>4rJ{vDzI3Y!%3zj9#{ z$+a;>dOd|I61{<z*nsLamIxh5Z^t~h!av??d!4@~8AbDwMQ+`8nd}=ZU1HzxPVJmc zpm*UR6gp0;))9ZsrWaC)S%_=`>O=F8*~*DU&ybA<6c$45a*G{MFxjpnCmd&WhP01; zh9lNxv@gYMM^xpT)_YZ#gwXYFS8J?n>&M>v`f6#K$ElGqdC`wi?*R>pO%RYL>3a$4 z@n$+eaF{%jkg1$O6l>QiiVbWLrR2p-MiaqiaxWKMs+3dS4KD+`<b+@y(J$*O{X-p| zrNUUq^;OQJ%k(9>qca79Zv?oDdt(AP*6AwXac356^}fOLmA4$&iC#MlU%NqrWX|@Z ztSwi)iwRe*9!br|ZDD}y(FL$~gX$_#qX^olp6y05BQ<lLSIr_Yq)9<z*B#c5K$cFo zgTKl#4%N1=wB2w2o;H)2vBQ6<cccC802xvk{aG}+D@r;q-?O96%Fp|cNiNY*tWu55 z(bL$@U{u8n)hsQQ=hm)a@=rKS3u5W#>v-PEx=9@yL#0c|eZx&MX;ZksSj$&yDg?uG zh}VWroDjQ!zXeU4yXPk2n7E1!=RJ7to{x?>>-Grt8=}#SQr4QA#q!P!v+R}^^vya! z-^R$$xT8UXy;cUq`Bl-QBzTLh<6A>GH8muon<OZvn13fMWMLZVVVsUU7s_{(J5B~^ zwpXcSrb#Tya1GjY7jE8YZG^QkypFT$eEBVXgp(!@2~W^k0gjS1%$C+<-h}3BR^A4c zf*Xeht8*_H9d;oy3rb&KE)|%>q=&Ppnel7##0{<7hQB+W3dPCh)@bwJ8i?jSu#(yS zhAK-pOE)U{3Smw7<4{^!(BZ~HY;E7PDV{hH=1l8G-Q0mC*|cspP*U3!U>dE6@h?jy z|Komv!>$F2BDdVzNQqLXref2y))3?ij5EAYY2n7rrAo@}WG24l<(Dj6``5!!+IdBV zuZS{c;mY)&4JSVo3{SLO>DVCn8pg%kGghKAdYPv@!8pT(yTdqx+#{G4qjVr98N@pQ z*o|@MT<9dhQG0uv5W;%f*V;C^KnO2`5M(Nhz3oPKdt2>k|E^+_buZ-H8-ENV;rAi& zF;?#WV)uLIbn44>Q?4s6x31^~y%(Ynf!#QPdi!{d^&LLd{!08=_E#9#{p3j8AC2_a zK9!8+ethJ@8akFI*Ghlw@$6$8R=pQ}z(xR<V93?j3o|(RqcpF8am0{|>Rk$uQ;yCF zBs^}Rr0d<ciYKFM6;h3Wmd+vyj~aHBFRSo-D%>7D5m2*s!+Lw|ywLGp&SfqnmSQ&y zL{2`hoaw*XQ;iEX$*xrMJFx@#C#ZxS*qZpYxShC7+k8uucu@_SI_)uBYqzQ??P%X< zA5D^UYtIeZsqf@M);*dck9(ScXoy($xVtVgA`$z<buyJ~7iQMUfFJIYNPhRFmy)M4 zQ%J`C?pgfA1u!fAZ6G$}@Y(W`NE+xD?@m|@BzwteS)ivAk!uBEme68MhH8s3t-ERF zp=n!d<4s)?lJLk|GE|_AW(5OQ#L1?e{itl-WVb`~&{1h^3|26{xm7w5b6PzwyV+>5 zgqB7M`dgB(u^~<0<Bd5soa1sjZLOIXay}<bkuORqkQqL(jL7sod#}Nuz+q)0@xnG@ zGGlL*V9yO+XP+=?5va4HCaVK;lP$fPUu8U_+iWZkZ^vr2wroJf>6lKebrUf?{eT@S z{t8arlnx4=6*3MLQ83Mo&dck{tCxySpJPnT{CtXyX;J6(@*UHRd3NwPk)#z>Ao(^8 zt(`o1?9{1a)6>UJpFVcxOwwldzHhUZ%g;p5GoM}183oZX@r2Zt7RV|3ez1YD;3&eS z1Fv@(jP)K5LcP1RbOD;Bkr+Ki4RbL8*S7UJ2+=2VL4+m3O-t7ZxEq{QQ7Maj`{QJM zlie)@9NO+u$Iag8u*}o6JWHkoRZ5c;95PTdn|T`eo?x?h^0Z?Lo0D6(q8hEYD@`BI z`l>x&VJWlp`?Z+C(_4ziVuG*50w&0qMW>A?Nox7J<#|aY-F3I}-LjWX)mzF~FbI}7 z^y6~Ma9WG=8kj<rB?qh?Y*M0DalB6m{~MRD;)6<Kc#E2IXn5UOT2(x07Q+=gMh9)L zTVfI(lv#2Sk^qm7{M65=gH<RFKWu~G3fYqO%%v8C*1R2T;REOy`s5bAv#c+(w-G(1 za^0e}p%`Lt?urr=R!K(FQHfZ7m)4M`gQg6FX^@Pp+>}oA-{+*dQ`mgb4NvBabNP7$ zKnrr!jn|!9agq&KAJiG?DFB9#YUFC<FiAWT@s}{5G!`x$H?M#j(aVjd>cLrYn97jK zxv-E%2T!{G&_lkllg_wr5ngl^A=i@Ac2JZL<M`M_W-b+%=Ssyq#1(KAsxyZn%_dWn z*`|ZTCvjiuc(%1H?w|t?88r=92xAiOy;7(;i&B;@vfU2ItPZwC<gH(k9Z1J+7T*2# zThDWcg?s`ji-}fpPHGBeV47%gdeIpUV44QH<ab1p<m!Dki8bMzA!=Y3>yKH_&q^1Q z;uF3i{3DTutUZR>YX{Tglh7tD-@Oo+P1-g*b&+4Q9T731jv6+JJJB9VxC;$q?0J?` zj_&d3s{)4Kw%RkT!I*Mi_XHM6n%w8hD`eS<zDo18?!r=eWh8G_rI3Bp)D}(Xa7l;z zI+z66koAx9hGB6A)-X1HfVN7b|1FSOx#)k@xgNWuaWafv6NCtEA;z%@>cr0qDX~oQ z!%%=X6Df!IZep>t-@(QkX@6lO$H3$)foB0^ta#LXZJ}nQ{-A4@1?5Bh^wx!j&49_I z;=e>ikz5C&-_T(jhmnqY`}xSo(Vx}RhVfLnKP70LDUS<ytn_qNLjad9CcBJ`F5_JW zOII%>Z~_|Hy=vEh@5q(96iC~Vgt`N$-Nge`Wec`>$H=-~DP#p$LRbJ#968&#Jpx5x zwCYS)glIh-6kF$j7r>GjiZ9BjGC`8UMOLAqR5>>}m8ZlLxYo;>pjgGh#suEYuj3SS zmXcokl-iG+WkA|^GGL<$!U{;t<IV=~Enn$*u@c3lg1wlqwFbY|BjsJ42lGRgh2B+T zwVKewN=oQ4acp7;fd$#+Eyji2nH<^x)Klg8BGPS#i`~e8HLZ#;G)oQ+(QL6XrmH!< zd&R8?-MaI`G+-66X&I{L6Ul1~M{qt98<yIgzGqd%T~@dJTc=m!WGO0VNeVE5yospD z_6*zDR?NiJwUWV*!jgs|-{QnL4~||R_6(RZCpK0%@x$}*BssZrD605Z+DJGpb8K*_ z%h;<jEB)Mu@X>j!d8$&cF`b!tucaz<<MUEn-R3fL-fz$5(`~m@Z17@Vp=>>eaX`aT z`(Ez<=UQrRG1X3I2FcHhG%me$_mb%9OE@@ac4AjOB|+6v<;3_@oMIO;)3{b!@4rY3 zks*H^FPo8ny{o!_4<m^|JDBedJmW}r$#tNit^YWU6kr!S2HN-LYNQ6O&R>r|?4!UO zFmF#mb8jTio<!Acks((@v!at3H$$QShmffT4ut)6of{APd2al$05W;(R-85Zx4}4v z&lF=*`&4Hs?9h`?l1N+TM*HWCC=Tc<$1`$ZrO*|I`|zrb=<4GC&(W3E?zbOT&AF%| z3HnC5YIw?LT6#oG6&ui}U2GlsnD~+!vNh%&d<NqVGY0i4OjcPnL?^sAWMp~#$l)#B z57_WqgVzq&%ms5XYa3+n9bYl4;CQ}zjMW-FK9{LRX%)yFEHcvg!BTrlRpM0a&;UvX znc$FTb)%7XtZ!j}DrLhH6_Cgl`wH$dg-mwK!{H5~iAzcGzoW(L=tt#?tewx`5lylL zx3xe<$-`Ea$0#P#h5N0#5d9X**<%)d{&_$!LOVa7hH;>?HvaKojG?FnMAzjIozasG z*v`|Fx$<Px8slk;`)dNoq;}in*^lI|Cxi8XIg!|j?7Z`IsU7-}yy{>#a2~s$<Z-!; zwhz0_-U10;i45BtklhG-5d!EO*&VY@#My;f=amn}u0{nWL@jq^CAvowoKzXv@1y>D z&+J?U@4M@cD9$<N;?MG=aj$!q7k?=rY`p1qBXS&Qk97Z1n6<*@qB{+3{~V33w?|JJ zJqhc>RL^}0gZC<kdu2Dk>Ix+7@1mlDWbP91Rk{?NrAv}ybgevR_mo=XGO}xt09{!A z_uS|$byxdLs?mW|qpMP__RC4HL{^SFUt8}c^n{FS`uDcoY$NmpCNS&WuwXrRR;mL! zm(-)QMKW|V$+>_@PVYt^vhhAlVRF&mRhji(CmlJia2G#LSc{(ZKA!z}_8F!$TPe#E z;ON`vQCU6@Enwi^{b5aH{eWQj3+p)@?_PJXRkxG|NG=PM_b~zD$$Qo9#6IAj%fh?f z<;WXJ+;0q)2II09+bFk#QahEaH!js!21)+&Nb+~w?5F1c$SL=1)OIDK=9GQaou(Yz zO>Mn#ZQ1rl9xMI|AJy<@Lg$mgVg6>I<MTxmaEjtyg0@it2!yYmqyXPbJiAQT0_32k z&_*=u5c1OM%C&N(I_Ah^G;iiBA6wK)HUN&72iF2>Ec~#d@-+fIU^7PeSr_WoIa!f2 zq8vG?gJ|ej#8ZTPJ%7&-*jX9pVy`bIVUBk4$fzZcvdp$l?g5Y7m^cG@tK`#k&s<N{ zsQLMf1(75YZDRuHrLiAa>n*|J_z)ESwYZE8BK6G|2`i#bv<zv8JRJWfd6q4O+9i~V z-->I2?0y>o+MR4ICSaC@sHD224?+95yjU}psNZ-+Z$hP)>6X3k>XQ&7zdCmV;4>0r z+pANrOsB`wzd*<?6L|Y>IpMelBvmyfECzx20(}>2dLwTNP=hq6dAyRb*=ItVwxVu{ zv05bu;6h<&iqjMMDGtZ;&mJF2m@q<W@F*<`3$P$Kp0hey#E0Ws%E3Z!n|lQX!+VZq zSgfqB#F5IZ^g*LD99#!214?+q88|h(myH89bc*ICCiD4|Cy!4a$)B1!e)1&eCnhF0 zRd!-{dP;i8<2p=Cx*QTGPlj8QN8BwdG-aiDicoB3*p)gFzvwlN+I;j+zxp$ojzk{X zTJD3vbiAoNLWn2YqZ5>Y#(xYXUvHml+%6>5`PbSm_-(5_Zr>@{^J8&Nka=g?l)BTk zhKYi;ZJQab=B(A|)uid@Uvl26@!yFXZ{3D?DoeEM`eQZt-fUXs?>@Ln?R^5<@4Yri zj{@m8;%aLzp7WujiI%!1jTEvFH^mhO8xgWXcf>dd13#f0>~<mzvWOo(g)zHkYk9#a z!CL3c{>s(BR%x6&_<JPoS6e${V%%>><?eFhFn=!<J;le0+26g5UpZ!JYaJ}3Z?vzs z219Do^|q^nV!~yU(#VGAqCcUIy`Ml6{i_xqUC?|g1<gyrr!v7f4p9pE8>kYsEG}6r z&}4UL0`iE)OHl;?5=ntr&jt|V*`tv%*r26%n8e)YPPYIDZupG*6|B!Cu#W7CG<jU+ zcN6>7b@??Nq`-|#3iw+Zh2PfUU+D0J9+;%S3~2{+?<aL{L<eKTrP_`(yd(YfPHke* zaR#p58*dpzL9393skl_{S}s;@R_Z-`<+;_RN+iKzy+bB8zopuCsUpwA|BlAqdhrgA z{zpyT^PIFjE~ic`XOWBcws+>7+>x*)*w88yS2uTvO@&%qQd2!8f|cDT`8<)V_O=&t z1=Qu;?Sq|}B^xx@&X&!^V=yY1&)^V4@mDEi=r$ou%EgLuM~UW`M`01AsTA1;vo)il zXmGohqzvmUtu&D?v5U7=ty!bzSQlHZP8E~SUowiuA~8W1m_$>Xn~I9;knQjWLcK<p zK}QbhuK9F8lT=ORYHfL42pS-5b4J!61cdvt)?<B|^xIzD8>_w5vLY*k6GVvI!j6G( zOX{p6i=YNXY>6rWKxa>wsB=xdlZmgSUMOCbMTG(%sq=Cj@X**87{sk$a!w$Or$QTq zNKt-dY+N+hdT6TpxGU~88x1$`=0&op(o5j5c|Kx>ti+4K`tb+sf#fKIH$x)h#2F`J z3#BfOZ0>bqZ#hq?<1Q<gjhiSrd*t+U>3Fv!T*eSNX*W2X@s%DafpS_!n98@KkLu*t z7B!c-D`P*?_!bi<ANSGuW?F}kZwdS?3Z;KGfV1j18-ma+H*T(;rg2F>jGce3CM03{ z@woY>j7ZVxXx_vH%sZZtjV`(=8x+T>XiPH|Jk0qh1^^l@o#*)vhj-AUItw*=05KSk z>ObTRHIY_q)jo7ohg}>XOZv4Z{kCp2Nad%w_k6s$wmlm*6A7zC`{;S)0}c`?6D>;G zF3A)S9!tR>ImLR%EDE|3&iXQQB3LCHIyQ6|K1HvWh<}RQqHCqs!t8T~>%O_=!22Vy zSnr(W4=TB@_*L{9HfNJ<$?>Fy16LzbsSq;)4GWRwPzx;9Any#FX|E}Ib$TK)1?j%y z98s%oHnIRP$dy*e+mi;DJMrKv`OjW@<2(ymIrFN;Yf^K&0CrLFw%xF{aC9Y$r}3?! zS_Nf-mxqKAgXlIUCnKefa@1r>m7hc9BVtvM#QkzwGIk^z0>`1N#qoSPrb=MaJzWcz zuW0u178)uua>@-4;}By4`!&TC?Z%mCrtcLi7mZWLF+ZlH5h2KYixFn;Bj_DU7ugE~ zunXDfKa9hbCU3C1wLv2h5RYv;75j7wLKl_XZDHEBw5!6h6D=_r1_%!mJ4yg8YNY6Z zPaAcmt85;@Fey-y+5o2`$}koe35vhqD%H!$e2F`37H8-0#Y1_CZ*X=sN_vvks#e@* z_KH~>0*7XuPbb?rF%w<L8yT~uhuWHP<0^nuPT8zAEzlDYL=lP#e}anhTuj&M%|JHY z;wzD28VtqSNePJZQ*$TskgBEp)Zz)vs;NVZNB|CTmx%JqL}IbYoj5BQ`DTkCUl^Jj z8Xa03YA}FSAaBG+^GkpzsewdQT0xhJ*D#qbUQ4zR+XdLEDAX{h<YrPOY_2W>Yr)l~ z-PWJQGgo!^twgj_RvbWwM=)S<E!uvQ^=RF+^C@$=nc>vP`1?UlD?AAPbUePau-@#z z5&0cX4E!H*e^Zl<qA)B4+G@`>j6pM-f407THZDZqF7Q!(YjT6^9~rm=+eQA&+yWjQ zD`qKBB&T(<hg|e;#Dn}>4r~k!<}eMLf#eViF{qhl)N5<zc}`q2C{m<lMy7t>n!`Q^ zZyA|cPdSZp$AwhW?NJ{?_%I0STbP{K=vTGuu7_=@z4lx@B7Qw4!<KphWv~>#DKnOT zN86qPO5)5U{VEnQ9@*9V&?UcN#D9H&K~1ju3;{_e6aAh>u3?N8Y2ln86NlBdcTij$ zyc#^3h0W_tw6e69Y@xit7Ak2+vWfD6I%>CUjwgE_8D&5Lv7OtnoIcF7*ZI~9)3aTj z1T`k83p_()z!j?qTp}V;5?#1<vlUxeT^TEr9@>Xz2rRqcql50dIuVbIk$}pZBE?MX zW`;-#gy&}U6KgBx`k#E3SZD?9VFA|e(-2Y@Q*t+q=nWpNgm2vy;1g_`chme;M9egh zAc{4JVW-Fr5g(8qn07*>blz`sB#6`M6#pU>H4L(Mq>(t+ZDravL{<2G8z#$Eo`zf7 z5EDeFv7b!KaAnS7BW=`KEaC5=T_yzd3M`!Me?AKEnCe||OC2N`H=?Ln?2LXpOnq)- z@sL73WPyKKNr4{aRmz1IV@^j9vgD9#m=Ov?;kO&dx14g3lNI5I$)&;xbrSEzA`+%9 zoji4d4Iif&YJ;ctyC24)@y;gx#=b-#6e2J4aU9&ci`DCwigT5X4cBzDIJ?=o$F>Fz z+Olk{WUOOjShmQ@1?OZ_jOMR9GN&-KbfZ#QAXwPa%}VLU4R?0)#*K-|Nd(AAXy#<k zv3fV#UuJND8MZ1B5x+nd=NO`ynV0p%HNvxr?86E7l!kdWdBne%!Ma+ZhIKdFbP_kd zhBYNj{ykxNekwH{%}cc2pUgkw5$e5mgSnEysJp1sSqCcI84KGmYLC^u8a3j{B}%Ue z0>R$4TXDgz%v>EiF#g=Z4_+&bd@&C;xJo^l4r|HVa+g|^?F4irqb4EBv}3$F`>?IV zOeOzRJOp-C+kNHA;n!yFymxix@YpNGv4xXkXRjX201)tv1c4SK&Vay}k6li>W5X$( z4wzcUmBV*_Q$l~N47=A>7U!==X1rPNUJ`+R>ycpm_hJ}peSimKFEzjvWO`3#U_zH| zE=`S4nLPV9h0pm!y&ZfrvnPF&z5fRSD7h<FqwnWyM9L!@4RcoSUO|yqE!R7h^~Ms# z1x&4Z8oVe^apBm+?`gwmkr;2LE|tlBuM0;f6MUzty$FJ@cH%rW<rJ=pj7lC}bJs8a zDzG=;Z7-*E1a~alkBU-=8Um129m`)zDxoGm0-+y~=Rx?NVv4TbcF3=C7q;n+8B&7l zPzT=156@g3&Q$1ylX^Q%PFAe7!jNXrReU1y3iCCj(1S-`c=4r|UrA`_P_j5yOG*~! z=7Ij&^+i0|mRDA9eTa&6?W5aw?$%nr`P{7DRU4bX`P{5~_fo*kntkk77Ho44E(bRk z=yXdpMnA#K+SG)~!|vzbfS1#4MuZYRom{}^rm$92L#qi+rPwM4sGzW|1x_i|uBuhr zAZdlO4|`vzBQ)a>D9Tt2Vk`4S<(do6-2P1DxiVQx>7iI@Gs(yo;;aMH_pXc)3?*Vq zx^i{H^C6kqaD>^sMuLf6xkCWa0<YhhoPg`a35sA@#^v(xS)K)OMjR(;7+)_OzO!%N zh80~Rag}7n<``;oQ=ls40`gngSXCG27SVCvjjPB&xH@myWaF*0vDbp}u!r&R(TBkp z#uLRcE5(d_akGVt)Hf;4;kJb&)5|X`wkqCdN_s|*hMBy>j6u0N@1q<@OU~Q$K@I>~ z9+{flOJ&TD@9I5Q!^yGBESK5mvNdJUM-N!Twz?@!L@3MryRuE83=|MjhC5%v(nThU zrB2zP*jbm(N?kJYi4h8BJf_PFwQElSlRTOhPxunFX}YOD%S(;BnsiY=AuOp{JKJgp z-70V1R8x0i#a<*dY1o-<)f89H>Bdj$@EaWJ9iT0gVeQ^F)wXog9ceeWR{3qK?cJ=+ z*8M)hJCClBt9K$hl8tPi6!wM$+!z=j>i&P4>i!c=pv0Y(1DJYN-$vN-Q&5B?D?1~e z>K|)EA=tS0CB-j+QZc77sQcDZk-L9JElJncwzC)i(0tl~ApWZMWwiyT9rles@2EK; zx@WDNSG=u6+dhOnOiboe!g*;_go+PKZbwS0jEqWru;E3QnZrk`^J=Gr7;Z4x7G&DG zckyRYvYFMeD))0{jrfe*MqyvjkYcYC2XDw-s67)C{Ei=yaXBFPHusm9oUc-$i|Ei1 zeU8zrcZyt#zQ8Fol{{RMFIMkEI=Q%TcY1Z{uWB@n7-Jl3&ssBzvT(A>!(_UK^6s1D zT!p*zVT|nZE!anT6G(nCRNFPs5f&Xl*rKz~BVsQ3JR;_be~kj^y*>4Hz%0ukl@{N| zCl~a>M};4iPJhYmHf-@{EG9HOhBKdq7!cE9mQkFS92OPpfrw$H0>iL;(e}wHlUW8< zq~Ym_jlu}#`vz?@LxN!pj8|e6)9BA1J6hpz;eD+*le8)kkgXIY8gsTe7Y?1wUpP6` z<gbOn`VyfF#2^*;a@WUKiYuuq7zcqtP1yja4)wD=CE6<$&1#E=j!Yhf0Xdpi<NO9s zPwtB|;XrG4=8a$URrOE5`qDPVr7`$QTP8whBh3j~A*SxFC5AnjqDGqkx0*#%&{q3Y zs;kMYjKvA@9Ne9nk9KbJQF@BMu9}1$+6FR|y<nZ@&k4#rYf<X(g0jxyW4x1|k?Hwo zSi?dT2qP$uqucnTJcjU;sM(5_ve_s%k7T<~s&p^d8EvZ2IrurxWRbJJ?wBi&`O9=Z z$&3bcX!rt-o}QF@*OU<2qlr#MRKtoS@>t6ZhtK?o#WS9cBD7u1hR-VpFUS*eM=VcM zXVRndz#bqWw{_?ua}fDK(KuY~$y)iA_4yG-Xvod>WZRC`m_Kd?HqLA}os%8=3MGFb zH50W;^iTL#=uqTN<pPJSqw?Lo#GirBv?I~#u!Qf}=)g4fY4{{XojK(VQ?ZAaZ;y{Y zgZgb2=_{DEtN58_>kiK@`A}wlztap{CX$lvae2idHd;<pJ@Ug4B|y5dynUCqz4d|o zna9sbWrjsWsYLQzj6;?jA&dgaIT$$Yk!g&a-2~WH#4lKw7DRVC_t(&_EH9JFVnq}; z6>-egrCzc<5$?qVaMSl7<jJ()Jfb}kj-A{a@vyzAT&k2u6!YT9NTBS^T9Z{_dOTXO z*8G~YY_1xU#H-k{LBV*i0w!L}?hE;Xvs(mEfW=bW^f}&ZPAl1~$2Qw)Hd3B-zHixp zF}BadU2NJUn)?{=e_Y!*d4eyY5vmZUCY$T|@ZtQ#M1B%)=VJcs+5F*R{%|Qj;k@Qz zjKe$0QVexlR7*7fjREd9{RAM2aeFDXgC!eOsBUC)V3+Ual@GlH;+5R5h-W)m#{iMw zHCV%)Cb{7Qfvb|-tlSc~77=@f$(|sl_yORO(k@2Fw=?LNgccqhvldBbd~FFmhdehc zYXsTA>KX$gIh0q{jLW)<c}3__=%h}X)Lsw!oRV5jyfm8E?mqDn7n3i%z?tqI;o`*< zwtvWA&kVouzKml(ckaSxPQUqvPS3viwtmdK_Ooxkeeq1%P5u)Zj2YYV&Q;9p%Wrva zE|9=Hz2)WK&=`Lv9^;E{jM1-~(EcK0%q#CR#;p{9q92UTk=`ebwbzaHG!bPWe?@-; z+W$!|uEEh>-HAOUCYuY;{6CWWTHE*MKE(1N**QGlS?^>WuW<3_c`uq_=Ws=g!ud7s zeIwpiy4z|l%oKPnA(d_wlk+JdYvH65t+%aBTKO>={oS|~f~N0|F-uZ2`0)n?pTY&< zDzz#w?S`3AevwDqHQ=oqsxhkQU`#~1bJnj_Uie39QLJ2Bep^S*LIWvtXLl|PEAN}e z%IG+4qp?QqzC^@k@+@acXKlT?1AQ0Y(TL5DTXDV1k~_j>ZKe|I4OJTn3NRAH>d#>Q zbMzn<ZbZcN!_z${HgEtT$5-)1A|Wt2NVwZs?IL0=@rLkF>cEiZ2jz-_ZmSQcopzjp zwxso5)q(2P>bCU`?waY%IyuH<?J1oYt}kQ&y4J2>COE0|A$#pB^_RBDh=-@R)R?hO z*UFbmTW{=ejx^PsPMAUj-Caqm2wb}Fx1W+rQp?tXZ8u_>?G6eD!$aU0Y=)!ySanZn zhchKA4d{Jh?sftBPQi!1`SH@O(rzfDy^O{a@)J~<8&8%VTenbK7#Q_Xde1{jKkiHS zkVUs^_9>1%9C_C=>h7(*eNLu3qHC^)&`d#~jPZ;Mk0dFoB&(vKWHW@s1QNF*k@2V} zaEkUo>ON+T42o+Vvt!4i155-W@D{Iqqy6|d+7Bu3Uzb+L8D>g`ZP7Hk$e#r$h&3YS zR}gDNo&YnoUfm9FBt)siNPFW6T6=0%HXE|nNLF=VvknRvB`yg|M1TkfYT;Cb(i}oV zgwaOkJ~Xl39lV{Dn2YqjPt))aY1)$lNR=Z^d%6`!u|(+;9hOgrVaZJ$iarB8-)KMP z;~7ouubhZJ;8v|`>JaB6Pp9%*YBzA1`X+Ry*bvbRI=rsKujp`J2QdT|{V3Y1GpVy( zu#!*d><2X5KdH0#bePfMv<^aY_1x@v=YQB`go!hCH=Fgx`645|WKS+$gQu={+*w`{ zhh5Qp!(X*{?IaeW7j!Y;FTOw$*>b%{Gnh|bf6NF6`9)ODGjrcQNxt6sn?yO4zJLM^ zQwXVGJZZLQ#D)N`4fn=Q;y-s2HA6Y^F6DN&@9Dfk%#ZQ*aj<xId$b=g!$hL1Hj$?J zHR+xZBE}?QUvkAfMUBKsEFwPEx-)uEhDgl|aGd=gw_Klait#WmqKrrdO3SEDX$@TZ z-g(G-_>3gQfyHVtt-a-}f+6toB*&5J&9xPO?zA6S)*waMo2}JxG6GjiC*F`nBH5AQ zFyIwn8m6FS$-!}a=z6t!>)4?~!4hQr_TtS&moRIb9ewCTcrtaUcmmnh%|!$S*UD3e zs5T+(_d!@DmRVlkgLPkQV3NjJHg*DH6Z{4@#{c=ru__@l6KcCSTAX$E2kE8?Lx`~g zu}Z+vo3RI2F){eE7e~;@>#@cKp~S(w-3_mX6H)pqC`KyO2OXbM?W>9g4gS9LSM)O5 zsgoxREfY$SywF1$@FB&Sx=jc?Y%WI3Y{o)8`+)ka5A|K&Ke3Jw-5vjPX3m0YJoE($ zcua0%c2{k<;b<b&lW&2V?;)Sv21C1rmJ~mq;-_JaMsKjN3Ncn~+wo`%ulCbc_3vlZ zz4wTV&O$Q#FX5yBw)hSuE3aYcpk-WMR2mr=@$<x1N#?UNc$Vw=1I9yQmRG}g^vrW< z{}?($M6wyHyv$*}E!rtmR5E)u+^!WI4zuU)F~9LIA>9;R<YNPyK3itcpsnuW6eM2b z0LmeiX(RFUB60)~2_{vD1u*mm-E1P64z|Z=2<=@LZ_zN1q}J*<V+>ZtK*lLJ8%BfR zH}4>pn7*fXg!&h;10&=jEy-~SJpkYY!zM7Gfou&FK@Fz)C?)H~3DyzffSoMI_JZty zK`4er5m`$MC|SMXQm=otDrF6H8e<?<ET^Z>ec?nbL7$d%sR=+20;Z&-JTV1j47{y5 zuny?fqt(1iye`fd84LW4wTPT*VNs6M3HaU!H}x)SIOv^m&M}!q5H%%Yr2<2BZRPk7 zCg<0|NC=8zuUvGWf<;KvQlOhtMyyvjaDWcuf~2_5(i&q;M$xc`SWkj(7@^u-?0cQj zp2H&S+cNuQUqP0VKy%>0y`g#K{3RaJG_fUC5ey8CVh<o7x#yt7WXfs*LK_qfqR`ct zjauF?w)FnC=N0mWp_R(SF;^{hg?dS-qeqj+T<xRr7~~!9I?D&mcF3DR7u|Q#-YEO! zg~dB5+h+-j^|5?JDDe0)+L|yw4RG694ez??C0m6G!Q2rq$`YDP@Cy2#!4V$!+Uv+8 zEo(vS4zIm}XrdZ6RQWc&xT9ZE5imqyC#S;#PwPuhr|pe+vR+!vJ9QY~`~5lTefbV^ zk0F(*Wn6J8DXFddHHZj_LJh`-SwDXA!uzvdIC=h^GZ@}GvkUuH4ahICN4s8KR-V#E z!QE78@uL&&<NFc0$P_V)?#x}4%UAE-Djy%ZMwHf}6BGHPd4zuX!&8Tvs>l>B-nvfd z(Ifdu{w78zHYtC?L{-<dPa@)_p;qOZn-b6g&~)bjYLvg0v<3H}F2ZYgB%#T4n29w> zKjFrRX6uC8f+aO=Z8o@N;YK1<qt-Mwj54Q%CIPG74AZud8q1WdQ18c-PN*+fxC^#* zRjyt^_{f$jMJ8$5S_Rj!ZvmIFONRQgl#V7t1Eu3=kksqrsy(5>LO1t;x4mr?OTpHg z!(kHX3&IDCUaNQ#HkP4wb&iT=ZPXuqATwi|tc}#j+Ni-{yRVb9@o@%MbtGdO*Z7D- zo4lMF*(P!>EURRCCb#?wWfg_hWCM30P-z_yBGM9F6jid9gNY6Y3AZArE3`ZdxhBD3 zhcj6DCzOu<CmoFEPZ<AS<6bSMfRGwKn;q;VtXdEk24-7QOo^{}+xdarc~4}})wckM zIO>Xx4*O3)PG`-q-hns<YX&89y+L{;;>eJ4NvV%??n@~NlfS#r;jAANpvR}LsO^dK z2HWZlgh1_Jf_sMve$M)?IGP}@%h6!%rYkHjp9SLR8i#scz_b{pd{wv2ZuYOjiQ*7I z0~f?0_v!2lVvkW%cj>|>el-E51eo_UgyP8C5KH#re!Yid?TJkW^HveE^na%?ut)~# znv&CJWYSO*gtkW`d~j#-B3Ms{CMMyf@earDyC*p1#dBktl9gvTAQ>DW7fAaa0?L<i zikrEB+3b4TV*A%5hv_K(I<MFSySPZ61{{+iFWAx~q7sD=Z+j=>QHHQI!o`q+#-DOn zgMkxlFU9yvdJ3ztw79UaIFCazRIH1)7&ct9mCKMb!eox%`9!xj1M-pgw@~_HZE(*o zRbOR5p1(%S7r)tAMW6U?7vm10Az}Fk?NZaCV+wA2OQFz!q{FV_k*U@9aS&;0oB4!x zDRuKv_7T_B>>^ASe6sziJ_%_5Fm4~U-u)Fv&DXnZGJ<-9POwYwvun}2^}ay$`ny7M zjeEs1uYI?$kT#*V{2*Bp3eghM&w0DSJ%U)6{eoekKgSdK<tQ^Zm<P>+wg9vQUEi0x zv#tni3K#Z$xvMK|7~PgXZwo=fa3i*K9Gwaxw$Z<_WxbCO?QPK|Qf~Bu&ALln`rR0? z`-qU&d&&FPTe*Y2q!*LVZnl#@LR?d_@UhwSQuo%4ZRQ`;xsFC-WBYo4wd+Q=g$XNB zM=yE){+lYA1cfNO-(DqfSG7+y=?Z7%!IdAPlq>&?wbe%$FcN#XH`Zlh8s2hO;mxP5 zRJw#|VSK%(T@R@3vX$G)2vK%@oBMUOt~cE^n0o19pL)3Rb?Z+*{mGH_-1<X}KTcq@ z-s-@8f}vHuMwmAGv(ZZ{y#!d>?ji1VXPG|ckk@NG)yIDl`WU}qBNM;nd*S++F0nl| zc5xqxI28IwS?gnX$NHGL+t5e#7VQ?_a|^v(r*B)T+p60aNWQ{#v_5!aaDB_yFgRQ3 zcjt--y}q4u`{wIir`kT(#+To|(e>fbyO12~U0gf&@`2)M3`q_BHQR#*YFHcIH3FJp z*JV<Ols?DyJ(y5-O{*nl^x=O|80$rLI19Z@>SX0l&R<_d6oA*!U3lF$y;vZ&en(cU zcq(43-~+&8)V@$1lgz|edgZ5GonJ(7^ii2A%mydesw$d^2`G^uv5Lv&?2Yx|lw;7+ zqTO**j7yawC-ssOM2R6r8e{bkV|tayB{j#XizRm5Tu@QW#T3iZth{`Z4-*obs6+g| z?=y*KDrI>OSdvoc0z`Tv&MekyyMU<}R*=r!Iano?lsGT|EfO^G98-0SokRwTI*0hA zvgQT&-mcRPJpu<RH><qyyb|>_TH2H?tnynZHvrm&v~#vC%Vn(jR~9RHi{p0*fGgES znULlom?AnW*KD6?j-Lb+Psi|CK&{A~63LQGgU)E98B2Wu#B1i)P3_DTNkf)bF%P2b z;(Tmv73A+LSm^lgNhPbd&NC*QXlO*W#ljppc#2~zE17o~z~pl<p*||(wP!y2_5t!~ zi2O`{)xB?(N<5_o08c~i-@#8?{lN@$ZTS-BqX<20hMs4>p424uS(u&W9ugHk4autg z+tvdc4=Pv9iM%^mU!m)9H(cymNAk#HBusYiq!YVk*bHV7u!d#7#nk3A7W3zwX>ht0 zrd<rbx_Jbto^{Jaa&Anm@3%=JNN<B4S0fDAac=;rN|6{&Y;&CFMEqHgAbDYk;^JeO zM%8^EN>9VAg1+Y(c#kCV1^Mm770@2to4_W=qD~wM1kG5(M^Hahzt0;1)O-eRxIj#y z^2GoeHQQ$t#u4g43KbBJq+)T8!uKMA<AR)jQlJ^?ByNEmKv!?sWEg+@+-E*}37Hlm z+vMi?GiNXPAn3G97G{Nsa1$m5+-_xs<1s`MiXwYSHJtiHPJ-c}O%G#IBwxsWz-&uW zX62X57U0l1C*@a{7pu&rkym4v*Yq1HC}=K@lM&A#>8RW?jcprQE+!eHute-gOI)zJ zR6TNxRR^Z;HCVwOSXdcBfZ2%6vZWFyrzPNIa8o_k><!GEZ7>uG_`Kk4kdIH_yNG~Q zlfE!q7#>M#j2>L0+o>K}<%m^j9d0(E-zWW!zCpZiurwAxx?}MGA{OT3gJnULng&d9 zCY)0VM2k{hJ9%yxP}$fi0nG6P*UUOq#kk^gl}oYJXn2F*l_HK?y|Ku4UKQsYxh;|D zo17SAF<XHiH`#_{Xlg*LBc!m(lMFAaVkWe$tHSUY5)4*(W)Y2KUnw{zf#C!BL&IQM zAq2nVw7NDad@w)u@WMWLh9C)GC0*Ox4)cYBM-IFg-ms2vYoy`c*yPyQ#6+eTa^6vl zj+d5BuPxs?ZgEf?VrvqoWt*6p!Af!XATQ5=z=scT^5Ruor$gn1hW2NYH;!CQ-bh|( z0FLtZDJE4|-^5)`OsExg@Io{P%VP=pYCZcwxghac-~Ng}weXU)*WG4g2>y7o)5QLm z7zG*95#o*a^z61{Zeq0;1J;h;baZ23g3s@$#(ZItb1I@OqbUnVMrxDU_xz54#l93; zEzrH(5Zf<|>~I0QzYc%rVkQ1ALN6B_@eACmcWRnNve0v;D^KZWm!W%S5o5M27UJRm z)|(cH@jit{cGP=gs;J)W=o!40KpXW=AsEZgg4a0)(`VRvT|h<Is6?mB3wl9!k;#Du z?$)<uX%7>ok%*AbU}8L8Q|SrWxaefkB`LIeJ34@>K{k35`2LdkU3IbTI1v>Q>+R(~ zvexiN)N%fEkr?~ipU){G<DT}Xv3VIF;)k9*&7I5>%ZN^Xbjs|s8fr&}3a=fT`C#bE z%9ZHKm8<Jq4GoRx=gJj(a_8#$owQFnSwjzeqkX96iJgoiZE1B)7|(1?Dz&4-R>5$p zYK*iWTJ><ts(qLxU-bcJ&Vpf)wkAgp_!7*w3>fwHwb~vzz^`IpD?bok@ZMQLY#>Q; z4}a7ARep&1A&D_;`CwJnKVth3VczV8B`wG|js#D+)lmr$bjIDh%cg^vAQ$}w&Uwe3 z6LBnevk!3qMw9Cu+uIcNTp=%IGKr|cGV+KSHq%FPyvg)&BS)O{{u^8FH<Y$AJ+2Jw zX>R3?ul=8e+6NTGWjm41V7RH%&blp9c(x_tt^1aanmMO`?;&p?gz#_mGA_mrSGSsY z#d^s&%pqHcEfy5jK_uy&rx3iH;tGhi3nKMZjPJ^GnUbVUYE_DOY&%L@G-4qKX(yuN zf#MhYHf5NN4%9bxjEW(#thYC7*P@bXllB&phCSmL;PBUlp~8@D;zJ|+Vg@DR)zc#| zjaK}vX6{NgvlWXia!mwhY@?)6?Hcps5NnFQp|uU@xeVi+kOwJ}$!#SB9Cx9u+=)8- zs11#L+=iS(Rx{lO4+DQ7ipQ~V>8>$;3GH?P!XP2ppm4A%6T)jzrJkuX@#v*K5QD#j zp$(WcQ+XN-(1;BW>UL)Z;n^gS@bXj@#|*thWIgRjd{6iTanyWY7o*ucf_y)$rZQkU zR?7(^@b|AO-o4C3lI)|Y*zs|VbLHyoGA0%Y&{iKhp~L_pc507JM;!1nkr8au_mYuH z#lC}owE1mO5Mnlv7cc-2ccAtOxo3^VgGgs%GvF{u#EkKZ&t9m(fsL~u^$ZVC`gdJD zE#KD|YBKY=@Xud^$LF>5*U(O01R%@D+Ax|(jAA>PWpp%)j=qk^y5i9}A5kixHx=KG z%5?sQtb2Uqe<!-Rl&njA=kxc{Fkl=b0|?PO8NS)AXtQu~qg-;dECVlxM&kHS-?M3( z@W1gK*;GShfmgj+*^$CSW|jn{t#Kv_qlN3$C&(`>tup#<lS(Pr3H-D)o33Zt<v%SX z_XzdsV<Wn(kPw+l;w{=w|BM}gPk0w29SntTp#nNMJPV;{=P>tnnUweJehXH_JqZ=l zeX6zi#w_g&m<L^}Nu}rCI{EhK+Z=cUC%!_=ykW{y7)cvOXhWWr82|+xViaB|4BrFb z;SCPS5;$H+e^;y&<}X(7E|nP|1y^ST0;Kb^fipWUG?a$5Fr*KJ8D}W%hAlq&u3%&Y zyOsJd@pJckFs~kB3K~8|yv$vWT*eBjcjhV<6r5JfYSe~f(^kVk#5NbnU?$xeccW3r z_B_-XPAYJx^W=vYwbN{nqv^O<nO!ZF!~^E<jO6b%kA`<*FWlKb$*vS?R`<OnS87Bu zk5wmQK3iSIlHpFlX8Uy=Teic(EZ9?Jdl)9I==0C#-8BgyhF>AHaSPzobPS-TxvPFm zr&KZ02(XH8AjAZ(KBTgV!v`DdJE{6I9dy-YZY4vKHV_hm)J&9wGxZTO7Qv}c)zVyM zXn#R7afB^zzghH*RAl~p4R8JZ1^tdxhVuKZ8NULWI8^to$>+f;@vp)}a-}tPXE+rR zEctAWrS<((+(tTnr8XXKFzH>|k=GUlJl<76&=opy!37ubakZeZ?Vo<(Se-$MtQTbB zO1^uPcCxtlsZ-mdpW+c}!_7RKuHorWp$J|Y2_k9s90_(T-=b!3#La%IE57wfRa}iL zuD#jn^D(C^TLr2hq`V>u;t%Tf(3rkS5k_pfW+#nhjH7K$+K?0&*%=w9ZZT!*d?Lra z>sv?S(Ids?iWIpsTH~`ghZK1lIscT$bta{*<LbwBc2ozsn2dCZ{}#zz?{*Zi5_TI= z7yV5MLcXk$4LtSR+}p2VP&IAG#6^p17EdjHc_6pfY+E|HLt?Dl9y=<IW`FyE+;hro z2%~QQ1i1oB=(-~NrX-HYMu(j%vt{o_r=5$r>m@0cf(I!9E81a2goNGeR<29^-5>z9 zSfm@>C2320{5_&batB>2`cqd59WHlZz({f>hO-BqG5&AsJ+N7AXkB~6fN^ejoi2F2 zPrn=eu$I2`W+hb$Pd~i*1gYLali5#uTP(iZK(YT3n6JjHN{D&bs9j`=IYPqRMDUz8 z%C>OAvUW8ciKlU`AX5;nptgB44|aw+BmmSd2Yp#8Z_bX{`xoQaMO<W=4r@jXhmX02 zY&SG!6mka7Gt<$N$!^{W{5{{}dd59#&Al-uMF$YmHqo@ba?IP!%WqmDb@)W6c{GRk z#rWcGcmQEO>q(8y#Z$=vymw)|&RHAf(kYE+ib)J?SuqZQ=Cx^=?s(##i0<NOj8ey* zDh0PELgK#Ajk(oTVw+i^IQw_3#&Mr2#u~|(l<z9fE`)WaZE-kCNx~30J>aWosw^IX zNn4HVb~W-zOfg^z$<X_>nh5!H!fd)^S&kY!Db5N@q!ehLKSC=_t%`skE#>q*E5WyN z(=0ZyZdL|}4sW2TXgYtgP|IxJC)46&O9yrMaH{*Cp^B4}sT<jgBjL%ZaHdvHohlSZ z=SJr<O`STGZp#%rS;!PYMK@PWm$Dn__U%T}>~v`MbU0JZEa~OKozc4uwTmImm#-07 zJ39)Zl=v4c%yl6GDIwKUbB!UHnQ$^}m8(>j6_Wd`i_1|+k@qQuM~2Nwu{a6wEc)v- z8~{}nh5&O2qCHi?LC?^@m*`0#=L6gB==tOg668`&A|d-dmSPdqRLsl7v;UOVWkG#` zl}YeHBYX>h=Qt~)<P6}0cIqlj^*%Cd=FG@wxb#l|nEy&#Spv3T&h{|Nu((=BeBToA zd}~uv`9i3DJw1Tysn}A<Yw*voDwg!BH7v(9+P={+!|ao*DL)7cFnOt(GVP{DWO=o; zwiLL?H$(mvRhKG;93Pj_2-^#I(&Uv)WFoEZq!;0haa51c%S=KIa}$9LHO<T#PAkI{ zTO#xeWg1FLsOOpvBcyFhJsLiiElEPR2}|sj$q0A&Fhn;T<;?JBREJ9dN18a@8$KE5 ziz7)KcaqALQ!cq`0p+Poff&r9nwZmJ{*eF%19^yT81loXPARm8@3i`xS1$#<@Q{_& znFpIQ1H1wD=``%ar_)z0dLqn}E)utXM?JXvDBbXt=7)vI67a(}3w;ne(?IK=<BS72 zC=*2ep|5e_lh6*p&yWwaD;kvjxby{FD`)~)e-$YbL&5K`b7Do_?8HDVCs{Y)e6doO zM!`ae$MN@w9a*L7+IH-sh<3Xa%in5)Vzn^uDnnARqegdKEGPwpBF@D><;R8P+o!W< z-QC2}Ts#%z^IAltJ&en@q%f5uon>NP-;NR2{LQy$;+$c!Ulavx`ET0?+LQxKny7*H z+VdIYm#|<BueTnwNm^pa(u0I~J_9rK73GtI4#vK2AU#NCmQTcE8<=fw94c#b$tYmo z{wlRb+r(S6?0a+u`W@c#EI+9ZZ!?H5uFbjr{*wADUxPN+*IaG?gL)d?Yu!<KeQrKG zzS6dOG|Z6rTr;G-a>{qULo<Xyfq`guz6pMII2G@98;KPx`5cgLLd=R~N>2!lhf96X zm`{3>LD_19@{X_dS2ZTi<-pAWxF@n9JZN0vS8KVxe7*bJh0|v)T(VFO_1<?bxXaqM zxB^GHjcjpz;$s4~S6p4U4swij%%TMw(4vb>#oMo^|ANEFmio>tWhV~6edj}(4xiB% z|Evz@bRc|LTl5{A)jQuhbLQ=O_d5n&y}Pn(FM6K{n<wUWah*25OJndfCv6u7dIx$2 zdUnG%?&QDD_FQfhZR^wMY-{^wh`u|2c#LD|MIBz&>4Hud-08yA+T$uzoY0fG1rDW` z^!TN#wcPBnT94eHaDA%ny$0>da$mlcUzw}8kaqbZNtkNgC#Igy4-MA_o-e%i))Y$s zh4hK&Uo#T5+{ml7ozBR_r4n*ao5U8=^uxZW<!^*bHIA>n_O`c6wM`MZehA0r;~~b} zgQY35y5%Zs<}i@@i;;^_3d)iwiMP?>VEw&qR*qt43{av3MgI$}*Sj5Pn+SWZQsn>A zkkcz9N44FDt{gBO^MR}DI(zmI%IR9}z@ggqX{bm<#IXvZwtec^v9Xyel`9vo9(ZkR z>_lzApw+0*WGy#-pf-R;#f%uScPiI*96Dr5@GC3pGap=8xk|<ThYp4Mc1#~U*w94B zJ}TKAbExUo>COfF5cxjL+i9|R4rYV93am1(zQq5eg?^pC%8yaL+;+LW)OMMGke55k zon_em%ia7UI=I|h?kghzxUogS-){_*VgE00<=!^CCy~K`-XQq|&o6H;4=Vf)r77o2 z?<ns;<S<Z{$vT3A<O%`A76~9O?=0`Uv8zN#9%+5s+sZr3JIcGuyCn#?@z{N?ooL~d z%467mc~5!Ija}u(t?XcFtF<S1tc}ZifdRv8$_|EmPn4f1?>$A^)bZr~w#!dZW`~v8 z8Ol6OuRc}U1%%J&NO+ws1lei7{AtQQW@YzqmFJ3<dA66UXUor)o+v+yhW*Lih%mVO z6nBS!KE8iK_v!gF)SKLW&E2&(KFu5Z%KL6SSIWmDP<pnUw`W5<+h2aZJXGEf^!scC z_L&xcONrmh!$9+#L9?H$LV2Y0dTF>+_!1iM%LlkRSvpWUXjca*Icg=xcs9z_xLqCM zYK*JHb~VA(c=?cx`e7YUwOyW|p2^Y?eVfaZz;dK~v~*ND|MCm>+obtt++HjlExqtn zLN(FHmr5_XuuBFfqs^$i#Jew-U*YMo8?W+3Uq01Vdb#w<S2d@$l#cOqsytHeEWPSR zfa~LSJr%A`l#U~*Jr&(z&KCcZ#ExA;1^y~>_w|?ugX=M8^_z$Xy(ZF|HX{GAR30lh zOfTOWgWr#m&;*!u$Ygl+mey-<l}Ay9WB$BE2I!+PMub+EX<KE=pPWDoc>W$S3zjNV zI=bu1{Gt#IPGZsxo8V=Nd&GlQ3C{+gUT3Ky6*+$o<*^A-BrQrfD;fy~cqhCb0Ha#8 zzu4X9i5V#sEtn9n-Z(iuwOpK^^*0?9=id70=+xq^kB&Coeo?nyOl}8=&Ru--<rfc6 z022I482~D)x|ZIsOi%*}<J}|DgqJf<bt3`t{JnSHId^($ZEdlXzG=8=EY?kz%u->> zZqA0Av$6~GFJT0MX2op?iIur@wa8jz^n7Xcockb25P;0nv(klb^6WHydcY%fDEnB_ z>RWN9uk53>TMC<V$uhHMpOgr#l6huaQ?v9Zm>S3CnodW$xd9^4UD&jlhEiW^VtMmw zxhZ2upiBiQ%_R#X)F}yKF&9;iK2($m-v-M$k&zx@pWJxkVB?J=;}b_GUU(%_%ZuZO zC(DzGl!uD*6XmgqtRM&hO`2<t1M$Q?Uij8@+4SET=o)+Q2iQj+jZ`?~L7$dl{&Qx9 zk&Qh$dp6V2hYhf(Bm7?<)bfHa)6njr?3Wxna_H#CX?c0^PGWlepysV0ai#s5&$N*h zGfq4Vq=|<BiRHBnCxoLyGfk^dPw|n@#Al8}LKf_y5M9bhqIC_M#-81mZQs_7PpHD` zIdXJNsa2A*IN3@7STERD*GZH3=v#mz(lc&`i<H4}W*N=sD)lgfHX2@R#2_>NM(XuO zgfe3{4w5V?k?>{_%#2;89zR;=v)H1sx8vz9HTO63xT(jPr{AtVx56BmUQND`j&Peo zATz|l%?w}jDon4rnZx7h;+e%ZGj@3VrSwx`u?YjTSlG#;mWV#g>u<WH?5dxcXoMrP z+~ehxEU@G(eilHQ(Mm52$M=(x$yxktc*JQN>OG!JtZmVE@fT4KVt`uj%)zm%uU#n} ztZj3i8R4<QTGo5x(a*5aJV}M}H){rL8W3YWC5r~1oXg}@PAKE03Y%Fr{1jpjXW8&X z6W$5|F_jFfHWY&+YQud?-<z@cNo{M~qbuWAN(X9NQbbAZVEn8wQ$BMwzF4=CnOh^T zjntk?z3KS;76f(eQ*kX<#u>%~4YkyJJUJ2l2=LeY6H>bNxx(ZNn4G_Gb$ybbqm~lw z>iWcMme}gv#OUP4Na4!(!wZevJF-z55S1Mh<F&z*DLXYC-Kgus$38dFlYGD56c1k8 zArFu|@4gtn>w@iHgJZAdjvcG*bY^|&60K*#9;%Zaxw1{Kx1EMxgYWFP>E=Utg)wlJ z1pK=A8EsehY#>6uL9h~;PDi;?TPBWam68__aEkS+_s<%`fP|(R{W>7}fX&fAquxdn z2xZFo`<hs4lhCH4n@+7nfIAh3I*s}nA|w~eT)Byq=3ZPsziqXiW5*Ww$AGz6nI16v zIAMTm$I>5Xa-%SFY<%o0`Ex@;ynEclF<~NmYvkV1joKDCtoTcPqj&%NWBZrK_LrK5 zSL@RPIj4*@kjt|+JBq)|xCLaAiZ;k(w_tfD{)(kvGVt;|j+jDwhNM6xy^{gzeJ=~r zU2!YpI!RC{%u^Ajbu6@rj(q{mCr9}dn?f8L9Ph;^+uyhzTEGqz);gv89*X;niFeXQ zGan;5L>0xJVND-D%~BH1^VVIj`_ha07hY~8yP9eWJm6{CE2L;JRpZoZNo6*I7tKGT zFf{SXE3bgH$Bs-4rCw_ypH$C`stBW7(3^Ox;ed8z!XtT=$_V0RP-JSF^PJq>ZPHGJ zY)=qH5%ChK<1P1J2RSXywv$G_y{)!KDZLQc<HW)8Mfm=1+xrOKOFaEz$9qJ$Av2&B zbZoNL9ciM~d*csP?-Z2I6zW-?L_P|6gB~XLkpld5FbPtsi0=81s<R6#|5Pj1sUUI~ zB_UQGfAD}Oi`P|PRe~2j0JLaU2fz8)4O8=M&3v(6R*M!{WBWi??U@I+_Kn@~{JXUO zv&Z(oacuv^@%;-QYyIs4rG&Nc&96UO7!O{9Dw3>`PiP&c$Kg@dWc86&q|NkJtJ1yx z@z$g&+hkq(>NZ)GmnM%Kd*K!SA7{CJ%q41#rk5%1qWB@cz_QgJ6&^l(_@PVpvs$|N zXQ3DjOV^gIPetRGt!YtNypOhQyKLD;Gg=&Gwz&CPjjmFN4bT>k*%+EqNbBm~q*v;o zR_f$~*N%PD5b5lZSL=?<YE>owXJ*9?J-pT0OHvlyB~I~)D<!tk5w_Pc-9qeHz0SQW zL<01;O2xbG1{C0H?A%@wDa2O$azizZb=Y;NVCGW(s$L-ArP`&9W7g*43L#;Aqjtwd z<+M8xe9(|;dgL_~uGUUmUKfF>_m4qeQp;<#!8BAFk(wyTIG^slmp2My>1#R+iI}-H zF}YFi6eAIK48EvQX4Cu{>ELNHn|7ul%N2Xls0(}&grYL?bLpa-=FP&<THdMK<vF%? zjQ>mz<qR4VoYZ>X#vNTEPWOspH~S1<I8H4iU$p4m0fTDW`?kjOwgyY1RboschL-n7 z5)HX9bm?@;UdoEfJKiE|Q?^>dDCpwN#aowF3$B8u2$xN>*~TIk_lAI#)Z;413`FL_ zksj61e#Q>S;&i(piurxYZadr*2t7ao@8d(8CsECfO^C^Ir{g4lI$sT!;pj`uA)Y1M zz5@L<(C787nT~CPe{lNFtu6N8Ows6nc0_rsYmDAz?wWqxs~T&&O_m?W1%cm}EI(}0 zz+&e3Hq)iqcLpqE`Vwu^egWd)k8}57IZTEGG3DAmcEx*u_W?}B{<va6B48tNW0`Y8 zS-Coj`gzUeefiTW`XA`<U+JKPE-n}LV8Ec~oR*^AW#Xp#w(!6d6p<xRxTN>Y+~B^> zF497DR%h?(Y=pDAmlOnk@{*qXsJ^ioC&+Z6zSa1kP(+LruIA_mAQ!y~D*8vfLRRZF z1^$TMQ6(>`p%--c0+;oHwAv_oU$=JR`n0s<_&~2_s_&XLE;VyA`irW3*Q^I4rDt*} z9aMEtJ=M3Qv{unkV2!?0;LJH7Qrf5bV486d?yYx9mJ_`qpkLOZq&LetnCZV6_p@X9 z%o2w=t8X=31FD)^@-U4~>FJCPzoMsZ`ZlPdq6Ixat%L2u$-#DHvB!^VUzF8N?{~HJ zbmn@ydb@UaJlV0kV<@*RH<ato?e5s!Imq?ij%^*=a0i$qxaGF?r@6|t4?Lzn?(-k6 z^V>VyUv7V<W03QD?<_ed7FT9xu@WII-F&s)Dcp|9#&glHFjmavU)SfwEn#VGd8HEl zyY^iT^Hg*fOMsP9@pF_32x^}~M@Tc|-f_;t((9F0754=zkT|GFc*V7yKY;X(tYa77 zzc~Kh`<E}jpX???)n!OYq@f^R_)scz=Fr76=g&-EB3!q5@L&#I$tw@EcB~;+W0LmU zm5p1l+DG#zPfe$rh{HvAxaGQpmA@)?jK4t0`-*&o^U#BfHhTG!Cr3}68l9f@9l2W> zFA*C)-AFKncVpO8!D#*znVqxmkLE9F%qG+IEUq}~@GLyA-rg>Lp}4pdDu2&I*Q)Yt zrF>DmS&;$wPrFHluDjV+9XzSQd*HkI4?g%ny}XmZ*fdJD#F9EKSk6etGqUhT(RZV4 zKP$(t<-@?Ft4|54Yf0RdSm2t7V3V`>S*VWXqJ0B|u8oXT65x4)$FwVn!Vl{KXTNSZ zyuM|2*2juv@of(mmq0t*=%1Y}uHjP>&CW(Y!i)8u+vVa-V!ub!+ZO%04nio=AJyTv zSd`J9&|!hc(J$z1T8E+ze@h2&7M09aNtID7MdFF;Th5t!>P!@^M)f}T1W6F4lB*bK zni{V%UYwhc6kH;bqfjKlV)VDE@A4L04T(cWR!MM1572_RXCp->sSm{cQtFlHJJtI0 zy5F;0yi*|vUi5;1l>8v7bEtRBUymZ?26ub2wi9Rcd0cPxMi@;%j+R`+lb=y_uj%k7 zRc=OyD>|%j?{YUyAT+Lb-?41$F7r1dJ-0^s0--re@53Icwe4&wS5?<f2$-MN;UDVo z13LVi4*x!f`t~B*+TyGQ$rlcYZ&*$Z-Ee!G?XI?++Ab#(K9{At&&V~cV3&c&vbcR( z)jzAlJ{|V!P|)FLba;+~x_%Anh7I&p-IJ^*I;X=$!Thcc@9S_;_o_O3UT5Pvn0et7 zI<rmcDGl!(71^zO%KIJR1;w!GV8ns8|7chT^Jvp%7JWs1Aah(>1mV&a*;Y5Ivx7Pu z(Lpw^(U1-j?L-Qk9PQO%n+|y$26cE+hyOzLJ*BgwI{Xb?{)`SrTpZ9n^OgI1x_3yI zBI2Cu+*X~9=^%5(sHDRw9Zu-*8|vHVb@rAH@2Y}#bT+NSq7FB7Skl2rAoJ1toG!mZ zhj|_5bhyu<J}_IZ5H6uydJDe<)~CPvZ28VKCV<I}H|MK%W6P|I-eMR1v$7L>ySRc5 z-m*{a(C`;k`I|a?pu-g%jFL;X|NScWh8}3Iw<xpG^SZaJ%P;6~SeFwz+|=c}I=rsK zcj_>sLs<v82}aj-cu9x%b$CSwBV>MAXMa+Mw^Y^d>Fl@;S9Lh1!)J65TNusi?4%B_ z>F`+{F6$s7FS@M?rgV8rhaco{d5hbA&06JhpEh+nt#_G@<Z{2;BrdQBFGHw`ve5Z? zCVTu$@f9xj*&b=dwuVzH)#sv`UHts{=!igE77#{e8Y%mcF2(=0BB<)U2nXbKaYA3e z@^w1Vnd@xlKg?Yfbg1#afm{w5$hP*Kxg0@>IOE7UXM^qTIM}80ZJ1W~+fipSCwEu6 z%X!C6j!M~OZFM}|!C9{Nu}<3CMm>^<4(9gcdiw`E1}Nj8*pnN4dGImn-!<4f*gyDP zZSj9S{kh()y#u}dy&d-7Qv<K3p2np<;;k)%+XtWTB-P{K$-&15cMcw>Tz>Ez$Ns_3 z3?3Qm8GLf^nZezZ+R5?p!CQmp2j3h#J-9yj22b*X&kyb!{PbWC!JA$mtPFmBu#-AR zf$1bq2YW{cb`5;Gx3BkU{_7n$*Sl|Ee{WCk6V9BTBkrg&Czdnn;au-t;N8Z5qXQiS z9lf9G-Nl=)_2vflb*sO*J-0eL_CUQ3Q2v?R-pkt}#x9rVPNBWO>*<c2Jl)xm@95-A tV}H0k-(|htt$<Mdxj|an%`eB?P)FyU-duN2ZwG(5?v7r*?oLMG{{=M=cgp|( literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6919bd063755c81d7fd666f1255e5b195573fda GIT binary patch literal 24502 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/appdirs.py b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/appdirs.py new file mode 100644 index 0000000..ae67001 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/appdirs.py @@ -0,0 +1,608 @@ +#!/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: + import win32com.shell + _get_win_folder = _get_win_folder_with_pywin32 + except ImportError: + try: + from ctypes import windll + _get_win_folder = _get_win_folder_with_ctypes + except ImportError: + try: + import com.sun.jna + _get_win_folder = _get_win_folder_with_jna + except ImportError: + _get_win_folder = _get_win_folder_from_registry + + +#---- self test code + +if __name__ == "__main__": + appname = "MyApp" + appauthor = "MyCompany" + + props = ("user_data_dir", + "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/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__about__.py b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__about__.py new file mode 100644 index 0000000..95d330e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__about__.py @@ -0,0 +1,21 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "16.8" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD or Apache License, Version 2.0" +__copyright__ = "Copyright 2014-2016 %s" % __author__ diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__init__.py b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__init__.py new file mode 100644 index 0000000..5ee6220 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__init__.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +from .__about__ import ( + __author__, __copyright__, __email__, __license__, __summary__, __title__, + __uri__, __version__ +) + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53c4ae34133fb59836da616e68b24d5ba632c656 GIT binary patch literal 741 zcmYk3&2AGh5XX13X_IW4HbB+0sl*`?jgvMMgb*sUM}#UBaabW)&W?9u#cQwp5t_a8 z9$a}6uAFm49C!sz*o{!J<)3D(zsK`&HW;M8zJCAoqZLIzqyJXd+ZX<rYY&JZ7Eu*v zan;INRgxuf1T9FQ4Lh(49q2-@>}G99vmNMXyResaV32iTKkLCkmclUW!voekin2X; zcoU5t{q|9#QL;IpbEAZ_jPR;f+HShQSKM$VH~Y2b(vrf-+y=i#h~-u=LN<LujH@cD z*WT$6;xymhu9yyQy^|6`on0vHZU2&0l#8uK@SI5#!VCz>RlU}{T-YG1X}+W-mt}K& zsWd~*a=|TU1{F%9>$MLj(N@Gv^LSxxZC+wra=UQzajq&{uWO3$!?dU8;}^~7N=YgJ z-B?!?7EuX^%TOjbDp0PZ)qL)((xw^0o%F)oNyl6@$8T@0kpKOSkGf#!-8T8B=;O9h zbUL0iN0<MqK&O-G?8M_7Ju&Y`gV2V;S*Lxu+K)KWNkH2p^o<JN6TK6zb^|&AVe+~c zkOuSv_B_5tdKm10KVPt)&Wc)wS5)Id3Gn&ge2J}?7W3N`%*=E0ET6BJ)3c)aT;&tL zN{K(<n%5^>8teZ)nN_R-b8E0+*40)iVQ{@HiDpJQoil^Uib+uVzNgq{Jy*`pYh154 b-B*<YC)n#ykva4@Owu?_+Ogj)zXRjHJ>}z3 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5975cf53ed2505e9d9639583f4d7415de41ca4e4 GIT binary patch literal 579 zcmYk2&2H2%5XYTlH=mm#Bp!l26jQZ`3qm{r7kaXgM%ma&t+nIGAEDbb55kov;T>{C z9Qq2J7<VO9Oa5ubn)%P)bKSP}pC7-zCMhAm$+J^p{0XnSMR39sMRdXvow8JCEK3Ma zd8Rgc%eFdaxh`0tOIGTNRk~)iZdjvtY=?ClzU4VDc*!eX^JXkr%XeSMzI{Yxvd`8R z-N6|Zya1_ZWBpokxkx9?v|h|sP9BCZ^&a!bBzBZ*4bTODXDq<l0`z7+SvlT$Oe+AP zJE<^i0F>;-<it5~LF>+*&P85&72gYhVCA`B5jIW*uno?!b;K^BjmRV7T5J_jAU^Le zqL(4~U{TEC5{b<sHi+n@JD7mB&dssqnZlF))1?1HqMc5m`JcqTjMWi;zf)Yp(s@Cb z&eFjsjz(#Jq+VSOhx>)!xcBg`Kb($N*Tcg%-M_^%PV|<}a=w(4^Qd`wqs0Sv_l`Q@ z!|aVwj?TvstZ*jSUN{Pin7FZY?)qal%4wtka+2u(&3szR58Cjc#K-tI7q{^$eVy0I EKik5hDgXcg literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f16d96d4adf5c94a8017e7ff09af2e3dd3fae735 GIT binary patch literal 1026 zcmah{&2AGh5cbce*@iSdP*vjR5H3hLG)rj_m#RVniCcvPLSj|Pa@O8-oBhM~rcG2% zsnk9OSDu7-@D*|BD{x}$Kq%tCNHaS#_I~rtjQ2J+I^REkJwB!geM7f|fd2wizXv0b zz&R>#j0+Nzg2oiP9La+?kilt7pnFKr35nNMQ2<d}w$&>crZ`?N*JQ_iMN6z*qWF#= zZ_%KA1K4Ol?Is`TDsPNrSy5NY*idBCOlMVTd$r0+!_uZq48%t_j@S*bMG1C)gSemt z+6L8+!MsLS=nAJqU_mZJL9X$Fej)~);tL{ZiZZkapnNcoI(?9rN^&Fnyg%Yv_LH1z z-9O9B31kXsxK9lI%>=+#;>tSF_rXXMV}W9FyKqbe^<^G8H1-GUAg>ah>%-wHl>{CN zA@_B97gTq_T;mITjV|cILE)n>K-<zJ*ET45A#KN;WSTkR+F~&vwzc#F2d&&hek>vw z;S@TIrd&m7l?$nKluRO%@1~>kso2-g*|TIco9ynT^Rps(0x~Y6cTt_yJ6Wj>&-0!A zLe7Og*O8W{sZCYoI;tmQrlhVKl}H`2sVqgMqM9cYKF-Q<#FDD0xf#|o+h(kkXN)~` zeYq7PJRkgbEW=-a9YNC}_|P$9w!>Iai6(b`m$8ox&zC1^6L5Xg1ESpU)W+|G>Vaq1 zR|9_lq301|<z{U+jdV|ss~PhPhfxM*R!fgLpi3l=>8}4<#N+q=?r6&u@tbXLQ?(7z zpzGMDjcF9HS8fo>y(8srS*mB+cBil&c<C%F)5_8}AD%k12Zu)4E*O|BbIi2u_+9&q fNB6958P6#^SPtvZmC!D=MMB!cy&%9LS))GzcMc0E literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67febc9009e66fa99fe9dd241ff61aa91f9ae650 GIT binary patch literal 2883 zcmcIm&5qkP5GEyCmc8CxZ?b8U77dV7A)p)O7YUFe*rG*?UVQ1Ei~@vKq`k_@l0s5W z*2v8PlE=t3Pm*`gwdkR*&{JpVRcbG!%1Ij<<WL%t-^_64v+iwg_x^bM{<k-6LVhPJ ztp)Q#=;}upIN>xVQ#ztkYh+FBkxj|Zgj?KxMYt_m3wzWS?FAXN;cbhz;ceTzb%X<N z9q#-}yw0C+67lR}H#k;loNK|NX_iV|xICIgDoT@LCzDa4**H%^4bLI&D4PY7L+I)V z20=!Ylaa+Kw_cHv&28QS3E12L+2$SYf^>M7_ds^|7Vm>}`8MAH+2y-@0J6vT_$82A z{4!X$U%0;{<0y&rSx5l{8%pdyKvx(PPGO}rln^lTj(D_aDG`sQ1CM6->$ML~%mOX^ zSs?v!8gn6)AD;R;zB4|4G2{2uL-rs%K0Cd0Z#;iK4R1r6B>s_~McF}=C>_M{!TqV2 zbM->`O6WY(X&Ng(JDo5oRGQ0BD4)$l!c*yIL3kQWqGaMTrDY!K9M;^*&I*^o>P#}$ zMcXlagwFR$4{w#)HCJs|WL)jTL=#P4k_BC$%XH{jMe8I`Cq)a7^{DK?ntvRZE<7SA zu3-!hr~+MTLt_psL0J{wpUlCYWk8B{s!xQxh~+RAYsPk0kakzxL*2*W$Za^P3Pmt> zsSX8nYbX~&_!2_+lrF3?ggwY~yyGMkMHjZlfl`c}J6dOec*fY38Us*QZNLuf(4;h= zPtHw{1N3qah6dCGT)S3-in=w_s!Kdty~H}-CU8w()u5p6e?kF!Z`7fnFK9nDlxx1| z^SIGsFcgzOM>A0-SxpUe7)!*2v72yISptJ{57eDe4!u4WOA<^0z34GEO?e*UywBLP zJcySXiN!0im?U1O#AKJ4i}ErK`#4}`$g4PfV4>v<E7A}ZR;t2XuI1Y6Kcf#p^`T)& z9zy?&L@U35^Xo%?&aw0EK^e7WB2`k3iI9i(8cw0}>ld%-Q>ae%;6%9vL-i$_EBUqo zbwjReEE99}{tDRD3Kut`yJjd%u)9rASTH8qun^_HbKXXTW0Lwo1MuhJI#WuI8lX2K zytRL=D#9}b`?vvWBi3t%LRxsz1hpCU8Iq_e1SFpCS75GH<Yviu68}!*bsWCL;Xjib z^2j&P>&OlDL$8DUI?nOS2)=qSVI^j)#P7MnNsph3P#YHwFIBN<;eNN|=O?&FA+he; JgRdRve*+!a3BCXT literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6959efef13a38d96b6d6aa347984442161ef62a6 GIT binary patch literal 8906 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3888ad2ac68f65724b90008c0078c637f4b709c GIT binary patch literal 3902 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 WSqapVUP5^-=o#>_(wNkX#{U3M@9O{n literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ee3e239d64516bd0d22ae3268488a025a57e3f5 GIT binary patch literal 19845 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 E4OlPT%>V!Z literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a0b60e146f85b0f9941c8201f0adcb79e54167a GIT binary patch literal 510 zcmY*V&2AGh5VpOWGzyd-!AnFaHKj#d5JKv`7dR~-%dwr66aUHfZqtYhN*{y^2cCp? z@D*|36?$UaQyFPKkH<6qX1=rI<N2TOzdrxK2>nL)j6nPzJiP*tNMeI5?yw~tu}#<D znj@y|TGehQvN_;xDqA_ZLEVugAJAg@7y8hmDUbOoc{60iv<*JyGLw4LNqbiwg{WO- z>%oZ(_sjkC(~_Nhc_Cn!JF8~{egU4I0A#em5`RSpvLOcqH01IYFM;J56Wn>H1vh%H zSX8~*l_m|VGBN&2#RV>{<5vAdaSs37extxW@~r5{BVBtVRZLWDX*Q?p)ozsM=?!}= zR@d9pv-SSUikD!$qaSI|VX0lp+?eILRePCsi6)hYki9pFhHVe@$q!MeMA@jE^pOTG zw!GJ_r$g2zorLT1^uLMga1ZO6Rd_^VjTf^rXCO}=qGBx8mssV9EkGerl_TM8&_=~+ eP1l~g_3pugS~`1cy&Q~sR~u8UeNJZ0y!i+BWsA-L literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..117894a02c24690075a74e5c913d2798e59683ea GIT binary patch literal 10620 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_compat.py b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_compat.py new file mode 100644 index 0000000..210bb80 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_compat.py @@ -0,0 +1,30 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import sys + + +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +# flake8: noqa + +if PY3: + string_types = str, +else: + string_types = basestring, + + +def with_metaclass(meta, *bases): + """ + Create a base class with a metaclass. + """ + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_structures.py b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_structures.py new file mode 100644 index 0000000..ccc2786 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_structures.py @@ -0,0 +1,68 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + + +class Infinity(object): + + def __repr__(self): + return "Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return False + + def __le__(self, other): + return False + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return True + + def __ge__(self, other): + return True + + def __neg__(self): + return NegativeInfinity + +Infinity = Infinity() + + +class NegativeInfinity(object): + + def __repr__(self): + return "-Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return True + + def __le__(self, other): + return True + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return False + + def __ge__(self, other): + return False + + def __neg__(self): + return Infinity + +NegativeInfinity = NegativeInfinity() diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/markers.py b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/markers.py new file mode 100644 index 0000000..892e578 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/markers.py @@ -0,0 +1,301 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import operator +import os +import platform +import sys + +from pkg_resources.extern.pyparsing import ParseException, ParseResults, stringStart, stringEnd +from pkg_resources.extern.pyparsing import ZeroOrMore, Group, Forward, QuotedString +from pkg_resources.extern.pyparsing import Literal as L # noqa + +from ._compat import string_types +from .specifiers import Specifier, InvalidSpecifier + + +__all__ = [ + "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName", + "Marker", "default_environment", +] + + +class InvalidMarker(ValueError): + """ + An invalid marker was found, users should refer to PEP 508. + """ + + +class UndefinedComparison(ValueError): + """ + An invalid operation was attempted on a value that doesn't support it. + """ + + +class UndefinedEnvironmentName(ValueError): + """ + A name was attempted to be used that does not exist inside of the + environment. + """ + + +class Node(object): + + def __init__(self, value): + self.value = value + + def __str__(self): + return str(self.value) + + def __repr__(self): + return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) + + def serialize(self): + raise NotImplementedError + + +class Variable(Node): + + def serialize(self): + return str(self) + + +class Value(Node): + + def serialize(self): + return '"{0}"'.format(self) + + +class Op(Node): + + def serialize(self): + return str(self) + + +VARIABLE = ( + L("implementation_version") | + L("platform_python_implementation") | + L("implementation_name") | + L("python_full_version") | + L("platform_release") | + L("platform_version") | + L("platform_machine") | + L("platform_system") | + L("python_version") | + L("sys_platform") | + L("os_name") | + L("os.name") | # PEP-345 + L("sys.platform") | # PEP-345 + L("platform.version") | # PEP-345 + L("platform.machine") | # PEP-345 + L("platform.python_implementation") | # PEP-345 + L("python_implementation") | # undocumented setuptools legacy + L("extra") +) +ALIASES = { + 'os.name': 'os_name', + 'sys.platform': 'sys_platform', + 'platform.version': 'platform_version', + 'platform.machine': 'platform_machine', + 'platform.python_implementation': 'platform_python_implementation', + 'python_implementation': 'platform_python_implementation' +} +VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) + +VERSION_CMP = ( + L("===") | + L("==") | + L(">=") | + L("<=") | + L("!=") | + L("~=") | + L(">") | + L("<") +) + +MARKER_OP = VERSION_CMP | L("not in") | L("in") +MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) + +MARKER_VALUE = QuotedString("'") | QuotedString('"') +MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) + +BOOLOP = L("and") | L("or") + +MARKER_VAR = VARIABLE | MARKER_VALUE + +MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) +MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) + +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() + +MARKER_EXPR = Forward() +MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) +MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) + +MARKER = stringStart + MARKER_EXPR + stringEnd + + +def _coerce_parse_result(results): + if isinstance(results, ParseResults): + return [_coerce_parse_result(i) for i in results] + else: + return results + + +def _format_marker(marker, first=True): + assert isinstance(marker, (list, tuple, string_types)) + + # Sometimes we have a structure like [[...]] which is a single item list + # where the single item is itself it's own list. In that case we want skip + # the rest of this function so that we don't get extraneous () on the + # outside. + if (isinstance(marker, list) and len(marker) == 1 and + isinstance(marker[0], (list, tuple))): + return _format_marker(marker[0]) + + if isinstance(marker, list): + inner = (_format_marker(m, first=False) for m in marker) + if first: + return " ".join(inner) + else: + return "(" + " ".join(inner) + ")" + elif isinstance(marker, tuple): + return " ".join([m.serialize() for m in marker]) + else: + return marker + + +_operators = { + "in": lambda lhs, rhs: lhs in rhs, + "not in": lambda lhs, rhs: lhs not in rhs, + "<": operator.lt, + "<=": operator.le, + "==": operator.eq, + "!=": operator.ne, + ">=": operator.ge, + ">": operator.gt, +} + + +def _eval_op(lhs, op, rhs): + try: + spec = Specifier("".join([op.serialize(), rhs])) + except InvalidSpecifier: + pass + else: + return spec.contains(lhs) + + oper = _operators.get(op.serialize()) + if oper is None: + raise UndefinedComparison( + "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) + ) + + return oper(lhs, rhs) + + +_undefined = object() + + +def _get_env(environment, name): + value = environment.get(name, _undefined) + + if value is _undefined: + raise UndefinedEnvironmentName( + "{0!r} does not exist in evaluation environment.".format(name) + ) + + return value + + +def _evaluate_markers(markers, environment): + groups = [[]] + + for marker in markers: + assert isinstance(marker, (list, tuple, string_types)) + + if isinstance(marker, list): + groups[-1].append(_evaluate_markers(marker, environment)) + elif isinstance(marker, tuple): + lhs, op, rhs = marker + + if isinstance(lhs, Variable): + lhs_value = _get_env(environment, lhs.value) + rhs_value = rhs.value + else: + lhs_value = lhs.value + rhs_value = _get_env(environment, rhs.value) + + groups[-1].append(_eval_op(lhs_value, op, rhs_value)) + else: + assert marker in ["and", "or"] + if marker == "or": + groups.append([]) + + return any(all(item) for item in groups) + + +def format_full_version(info): + version = '{0.major}.{0.minor}.{0.micro}'.format(info) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + +def default_environment(): + if hasattr(sys, 'implementation'): + iver = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + iver = '0' + implementation_name = '' + + return { + "implementation_name": implementation_name, + "implementation_version": iver, + "os_name": os.name, + "platform_machine": platform.machine(), + "platform_release": platform.release(), + "platform_system": platform.system(), + "platform_version": platform.version(), + "python_full_version": platform.python_version(), + "platform_python_implementation": platform.python_implementation(), + "python_version": platform.python_version()[:3], + "sys_platform": sys.platform, + } + + +class Marker(object): + + def __init__(self, marker): + try: + self._markers = _coerce_parse_result(MARKER.parseString(marker)) + except ParseException as e: + err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( + marker, marker[e.loc:e.loc + 8]) + raise InvalidMarker(err_str) + + def __str__(self): + return _format_marker(self._markers) + + def __repr__(self): + return "<Marker({0!r})>".format(str(self)) + + def evaluate(self, environment=None): + """Evaluate a marker. + + Return the boolean from evaluating the given marker against the + environment. environment is an optional argument to override all or + part of the determined environment. + + The environment is determined from the current Python process. + """ + current_environment = default_environment() + if environment is not None: + current_environment.update(environment) + + return _evaluate_markers(self._markers, current_environment) diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/requirements.py b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/requirements.py new file mode 100644 index 0000000..0c8c4a3 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/requirements.py @@ -0,0 +1,127 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import string +import re + +from pkg_resources.extern.pyparsing import stringStart, stringEnd, originalTextFor, ParseException +from pkg_resources.extern.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine +from pkg_resources.extern.pyparsing import Literal as L # noqa +from pkg_resources.extern.six.moves.urllib import parse as urlparse + +from .markers import MARKER_EXPR, Marker +from .specifiers import LegacySpecifier, Specifier, SpecifierSet + + +class InvalidRequirement(ValueError): + """ + An invalid requirement was found, users should refer to PEP 508. + """ + + +ALPHANUM = Word(string.ascii_letters + string.digits) + +LBRACKET = L("[").suppress() +RBRACKET = L("]").suppress() +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() +COMMA = L(",").suppress() +SEMICOLON = L(";").suppress() +AT = L("@").suppress() + +PUNCTUATION = Word("-_.") +IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) +IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) + +NAME = IDENTIFIER("name") +EXTRA = IDENTIFIER + +URI = Regex(r'[^ ]+')("url") +URL = (AT + URI) + +EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) +EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") + +VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) +VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) + +VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY +VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), + joinString=",", adjacent=False)("_raw_spec") +_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) +_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '') + +VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") +VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) + +MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") +MARKER_EXPR.setParseAction( + lambda s, l, t: Marker(s[t._original_start:t._original_end]) +) +MARKER_SEPERATOR = SEMICOLON +MARKER = MARKER_SEPERATOR + MARKER_EXPR + +VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) +URL_AND_MARKER = URL + Optional(MARKER) + +NAMED_REQUIREMENT = \ + NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) + +REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd + + +class Requirement(object): + """Parse a requirement. + + Parse a given requirement string into its parts, such as name, specifier, + URL, and extras. Raises InvalidRequirement on a badly-formed requirement + string. + """ + + # TODO: Can we test whether something is contained within a requirement? + # If so how do we do that? Do we need to test against the _name_ of + # the thing as well as the version? What about the markers? + # TODO: Can we normalize the name and extra name? + + def __init__(self, requirement_string): + try: + req = REQUIREMENT.parseString(requirement_string) + except ParseException as e: + raise InvalidRequirement( + "Invalid requirement, parse error at \"{0!r}\"".format( + requirement_string[e.loc:e.loc + 8])) + + self.name = req.name + if req.url: + parsed_url = urlparse.urlparse(req.url) + if not (parsed_url.scheme and parsed_url.netloc) or ( + not parsed_url.scheme and not parsed_url.netloc): + raise InvalidRequirement("Invalid URL given") + self.url = req.url + else: + self.url = None + self.extras = set(req.extras.asList() if req.extras else []) + self.specifier = SpecifierSet(req.specifier) + self.marker = req.marker if req.marker else None + + def __str__(self): + parts = [self.name] + + if self.extras: + parts.append("[{0}]".format(",".join(sorted(self.extras)))) + + if self.specifier: + parts.append(str(self.specifier)) + + if self.url: + parts.append("@ {0}".format(self.url)) + + if self.marker: + parts.append("; {0}".format(self.marker)) + + return "".join(parts) + + def __repr__(self): + return "<Requirement({0!r})>".format(str(self)) diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/specifiers.py b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/specifiers.py new file mode 100644 index 0000000..7f5a76c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/specifiers.py @@ -0,0 +1,774 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import abc +import functools +import itertools +import re + +from ._compat import string_types, with_metaclass +from .version import Version, LegacyVersion, parse + + +class InvalidSpecifier(ValueError): + """ + An invalid specifier was found, users should refer to PEP 440. + """ + + +class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): + + @abc.abstractmethod + def __str__(self): + """ + Returns the str representation of this Specifier like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self): + """ + Returns a hash value for this Specifier like object. + """ + + @abc.abstractmethod + def __eq__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are equal. + """ + + @abc.abstractmethod + def __ne__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are not equal. + """ + + @abc.abstractproperty + def prereleases(self): + """ + Returns whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @prereleases.setter + def prereleases(self, value): + """ + Sets whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @abc.abstractmethod + def contains(self, item, prereleases=None): + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter(self, iterable, prereleases=None): + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class _IndividualSpecifier(BaseSpecifier): + + _operators = {} + + def __init__(self, spec="", prereleases=None): + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) + + self._spec = ( + match.group("operator").strip(), + match.group("version").strip(), + ) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<{0}({1!r}{2})>".format( + self.__class__.__name__, + str(self), + pre, + ) + + def __str__(self): + return "{0}{1}".format(*self._spec) + + def __hash__(self): + return hash(self._spec) + + def __eq__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec == other._spec + + def __ne__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec != other._spec + + def _get_operator(self, op): + return getattr(self, "_compare_{0}".format(self._operators[op])) + + def _coerce_version(self, version): + if not isinstance(version, (LegacyVersion, Version)): + version = parse(version) + return version + + @property + def operator(self): + return self._spec[0] + + @property + def version(self): + return self._spec[1] + + @property + def prereleases(self): + return self._prereleases + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version or LegacyVersion, this allows us to have + # a shortcut for ``"2.0" in Specifier(">=2") + item = self._coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + return self._get_operator(self.operator)(item, self.version) + + def filter(self, iterable, prereleases=None): + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = self._coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later incase nothing + # else matches this specifier. + if (parsed_version.is_prerelease and not + (prereleases or self.prereleases)): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the begining. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +class LegacySpecifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(==|!=|<=|>=|<|>)) + \s* + (?P<version> + [^,;\s)]* # Since this is a "legacy" specifier, and the version + # string can be just about anything, we match everything + # except for whitespace, a semi-colon for marker support, + # a closing paren since versions can be enclosed in + # them, and a comma since it's a version separator. + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + } + + def _coerce_version(self, version): + if not isinstance(version, LegacyVersion): + version = LegacyVersion(str(version)) + return version + + def _compare_equal(self, prospective, spec): + return prospective == self._coerce_version(spec) + + def _compare_not_equal(self, prospective, spec): + return prospective != self._coerce_version(spec) + + def _compare_less_than_equal(self, prospective, spec): + return prospective <= self._coerce_version(spec) + + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= self._coerce_version(spec) + + def _compare_less_than(self, prospective, spec): + return prospective < self._coerce_version(spec) + + def _compare_greater_than(self, prospective, spec): + return prospective > self._coerce_version(spec) + + +def _require_version_compare(fn): + @functools.wraps(fn) + def wrapped(self, prospective, spec): + if not isinstance(prospective, Version): + return False + return fn(self, prospective, spec) + return wrapped + + +class Specifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(~=|==|!=|<=|>=|<|>|===)) + (?P<version> + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s]* # We just match everything, except for whitespace + # since we are only testing for strict identity. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + + # You cannot use a wild card and a dev or local version + # together so group them with a | and make them optional. + (?: + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + | + \.\* # Wild card syntax of .* + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?<!==|!=|~=) # We have special cases for these + # operators so we want to make sure they + # don't match here. + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "~=": "compatible", + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + @_require_version_compare + def _compare_compatible(self, prospective, spec): + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore post and dev releases and we want to treat the pre-release as + # it's own separate segment. + prefix = ".".join( + list( + itertools.takewhile( + lambda x: (not x.startswith("post") and not + x.startswith("dev")), + _version_split(spec), + ) + )[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return (self._get_operator(">=")(prospective, spec) and + self._get_operator("==")(prospective, prefix)) + + @_require_version_compare + def _compare_equal(self, prospective, spec): + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + prospective = Version(prospective.public) + # Split the spec out by dots, and pretend that there is an implicit + # dot in between a release segment and a pre-release segment. + spec = _version_split(spec[:-2]) # Remove the trailing .* + + # Split the prospective version out by dots, and pretend that there + # is an implicit dot in between a release segment and a pre-release + # segment. + prospective = _version_split(str(prospective)) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + prospective = prospective[:len(spec)] + + # Pad out our two sides with zeros so that they both equal the same + # length. + spec, prospective = _pad_version(spec, prospective) + else: + # Convert our spec string into a Version + spec = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec.local: + prospective = Version(prospective.public) + + return prospective == spec + + @_require_version_compare + def _compare_not_equal(self, prospective, spec): + return not self._compare_equal(prospective, spec) + + @_require_version_compare + def _compare_less_than_equal(self, prospective, spec): + return prospective <= Version(spec) + + @_require_version_compare + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= Version(spec) + + @_require_version_compare + def _compare_less_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + @_require_version_compare + def _compare_greater_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is techincally greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective, spec): + return str(prospective).lower() == str(spec).lower() + + @property + def prereleases(self): + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "==="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if parse(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version): + result = [] + for item in version.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _pad_version(left, right): + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split[0]):]) + right_split.append(right[len(right_split[0]):]) + + # Insert our padding + left_split.insert( + 1, + ["0"] * max(0, len(right_split[0]) - len(left_split[0])), + ) + right_split.insert( + 1, + ["0"] * max(0, len(left_split[0]) - len(right_split[0])), + ) + + return ( + list(itertools.chain(*left_split)), + list(itertools.chain(*right_split)), + ) + + +class SpecifierSet(BaseSpecifier): + + def __init__(self, specifiers="", prereleases=None): + # Split on , to break each indidivual specifier into it's own item, and + # strip each item to remove leading/trailing whitespace. + specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Parsed each individual specifier, attempting first to make it a + # Specifier and falling back to a LegacySpecifier. + parsed = set() + for specifier in specifiers: + try: + parsed.add(Specifier(specifier)) + except InvalidSpecifier: + parsed.add(LegacySpecifier(specifier)) + + # Turn our parsed specifiers into a frozen set and save them for later. + self._specs = frozenset(parsed) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<SpecifierSet({0!r}{1})>".format(str(self), pre) + + def __str__(self): + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self): + return hash(self._specs) + + def __and__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __ne__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs != other._specs + + def __len__(self): + return len(self._specs) + + def __iter__(self): + return iter(self._specs) + + @property + def prereleases(self): + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Ensure that our item is a Version or LegacyVersion instance. + if not isinstance(item, (LegacyVersion, Version)): + item = parse(item) + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if not prereleases and item.is_prerelease: + return False + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all( + s.contains(item, prereleases=prereleases) + for s in self._specs + ) + + def filter(self, iterable, prereleases=None): + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=bool(prereleases)) + return iterable + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases, and which will filter out LegacyVersion in general. + else: + filtered = [] + found_prereleases = [] + + for item in iterable: + # Ensure that we some kind of Version class for this item. + if not isinstance(item, (LegacyVersion, Version)): + parsed_version = parse(item) + else: + parsed_version = item + + # Filter out any item which is parsed as a LegacyVersion + if isinstance(parsed_version, LegacyVersion): + continue + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return found_prereleases + + return filtered diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/utils.py b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/utils.py new file mode 100644 index 0000000..942387c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/utils.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import re + + +_canonicalize_regex = re.compile(r"[-_.]+") + + +def canonicalize_name(name): + # This is taken from PEP 503. + return _canonicalize_regex.sub("-", name).lower() diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/version.py b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/version.py new file mode 100644 index 0000000..83b5ee8 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/version.py @@ -0,0 +1,393 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import collections +import itertools +import re + +from ._structures import Infinity + + +__all__ = [ + "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN" +] + + +_Version = collections.namedtuple( + "_Version", + ["epoch", "release", "dev", "pre", "post", "local"], +) + + +def parse(version): + """ + Parse the given version string and return either a :class:`Version` object + or a :class:`LegacyVersion` object depending on if the given version is + a valid PEP 440 version or a legacy version. + """ + try: + return Version(version) + except InvalidVersion: + return LegacyVersion(version) + + +class InvalidVersion(ValueError): + """ + An invalid version was found, users should refer to PEP 440. + """ + + +class _BaseVersion(object): + + def __hash__(self): + return hash(self._key) + + def __lt__(self, other): + return self._compare(other, lambda s, o: s < o) + + def __le__(self, other): + return self._compare(other, lambda s, o: s <= o) + + def __eq__(self, other): + return self._compare(other, lambda s, o: s == o) + + def __ge__(self, other): + return self._compare(other, lambda s, o: s >= o) + + def __gt__(self, other): + return self._compare(other, lambda s, o: s > o) + + def __ne__(self, other): + return self._compare(other, lambda s, o: s != o) + + def _compare(self, other, method): + if not isinstance(other, _BaseVersion): + return NotImplemented + + return method(self._key, other._key) + + +class LegacyVersion(_BaseVersion): + + def __init__(self, version): + self._version = str(version) + self._key = _legacy_cmpkey(self._version) + + def __str__(self): + return self._version + + def __repr__(self): + return "<LegacyVersion({0})>".format(repr(str(self))) + + @property + def public(self): + return self._version + + @property + def base_version(self): + return self._version + + @property + def local(self): + return None + + @property + def is_prerelease(self): + return False + + @property + def is_postrelease(self): + return False + + +_legacy_version_component_re = re.compile( + r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE, +) + +_legacy_version_replacement_map = { + "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@", +} + + +def _parse_version_parts(s): + for part in _legacy_version_component_re.split(s): + part = _legacy_version_replacement_map.get(part, part) + + if not part or part == ".": + continue + + if part[:1] in "0123456789": + # pad for numeric comparison + yield part.zfill(8) + else: + yield "*" + part + + # ensure that alpha/beta/candidate are before final + yield "*final" + + +def _legacy_cmpkey(version): + # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch + # greater than or equal to 0. This will effectively put the LegacyVersion, + # which uses the defacto standard originally implemented by setuptools, + # as before all PEP 440 versions. + epoch = -1 + + # This scheme is taken from pkg_resources.parse_version setuptools prior to + # it's adoption of the packaging library. + parts = [] + for part in _parse_version_parts(version.lower()): + if part.startswith("*"): + # remove "-" before a prerelease tag + if part < "*final": + while parts and parts[-1] == "*final-": + parts.pop() + + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == "00000000": + parts.pop() + + parts.append(part) + parts = tuple(parts) + + return epoch, parts + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +VERSION_PATTERN = r""" + v? + (?: + (?:(?P<epoch>[0-9]+)!)? # epoch + (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment + (?P<pre> # pre-release + [-_\.]? + (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) + [-_\.]? + (?P<pre_n>[0-9]+)? + )? + (?P<post> # post release + (?:-(?P<post_n1>[0-9]+)) + | + (?: + [-_\.]? + (?P<post_l>post|rev|r) + [-_\.]? + (?P<post_n2>[0-9]+)? + ) + )? + (?P<dev> # dev release + [-_\.]? + (?P<dev_l>dev) + [-_\.]? + (?P<dev_n>[0-9]+)? + )? + ) + (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version +""" + + +class Version(_BaseVersion): + + _regex = re.compile( + r"^\s*" + VERSION_PATTERN + r"\s*$", + re.VERBOSE | re.IGNORECASE, + ) + + def __init__(self, version): + # Validate the version and parse it into pieces + match = self._regex.search(version) + if not match: + raise InvalidVersion("Invalid version: '{0}'".format(version)) + + # Store the parsed out pieces of the version + self._version = _Version( + epoch=int(match.group("epoch")) if match.group("epoch") else 0, + release=tuple(int(i) for i in match.group("release").split(".")), + pre=_parse_letter_version( + match.group("pre_l"), + match.group("pre_n"), + ), + post=_parse_letter_version( + match.group("post_l"), + match.group("post_n1") or match.group("post_n2"), + ), + dev=_parse_letter_version( + match.group("dev_l"), + match.group("dev_n"), + ), + local=_parse_local_version(match.group("local")), + ) + + # Generate a key which will be used for sorting + self._key = _cmpkey( + self._version.epoch, + self._version.release, + self._version.pre, + self._version.post, + self._version.dev, + self._version.local, + ) + + def __repr__(self): + return "<Version({0})>".format(repr(str(self))) + + def __str__(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + # Pre-release + if self._version.pre is not None: + parts.append("".join(str(x) for x in self._version.pre)) + + # Post-release + if self._version.post is not None: + parts.append(".post{0}".format(self._version.post[1])) + + # Development release + if self._version.dev is not None: + parts.append(".dev{0}".format(self._version.dev[1])) + + # Local version segment + if self._version.local is not None: + parts.append( + "+{0}".format(".".join(str(x) for x in self._version.local)) + ) + + return "".join(parts) + + @property + def public(self): + return str(self).split("+", 1)[0] + + @property + def base_version(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + return "".join(parts) + + @property + def local(self): + version_string = str(self) + if "+" in version_string: + return version_string.split("+", 1)[1] + + @property + def is_prerelease(self): + return bool(self._version.dev or self._version.pre) + + @property + def is_postrelease(self): + return bool(self._version.post) + + +def _parse_letter_version(letter, number): + if letter: + # We consider there to be an implicit 0 in a pre-release if there is + # not a numeral associated with it. + if number is None: + number = 0 + + # We normalize any letters to their lower case form + letter = letter.lower() + + # We consider some words to be alternate spellings of other words and + # in those cases we want to normalize the spellings to our preferred + # spelling. + if letter == "alpha": + letter = "a" + elif letter == "beta": + letter = "b" + elif letter in ["c", "pre", "preview"]: + letter = "rc" + elif letter in ["rev", "r"]: + letter = "post" + + return letter, int(number) + if not letter and number: + # We assume if we are given a number, but we are not given a letter + # then this is using the implicit post release syntax (e.g. 1.0-1) + letter = "post" + + return letter, int(number) + + +_local_version_seperators = re.compile(r"[\._-]") + + +def _parse_local_version(local): + """ + Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). + """ + if local is not None: + return tuple( + part.lower() if not part.isdigit() else int(part) + for part in _local_version_seperators.split(local) + ) + + +def _cmpkey(epoch, release, pre, post, dev, local): + # When we compare a release version, we want to compare it with all of the + # trailing zeros removed. So we'll use a reverse the list, drop all the now + # leading zeros until we come to something non zero, then take the rest + # re-reverse it back into the correct order and make it a tuple and use + # that for our sorting key. + release = tuple( + reversed(list( + itertools.dropwhile( + lambda x: x == 0, + reversed(release), + ) + )) + ) + + # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. + # We'll do this by abusing the pre segment, but we _only_ want to do this + # if there is not a pre or a post segment. If we have one of those then + # the normal sorting rules will handle this case correctly. + if pre is None and post is None and dev is not None: + pre = -Infinity + # Versions without a pre-release (except as noted above) should sort after + # those with one. + elif pre is None: + pre = Infinity + + # Versions without a post segment should sort before those with one. + if post is None: + post = -Infinity + + # Versions without a development segment should sort after those with one. + if dev is None: + dev = Infinity + + if local is None: + # Versions without a local segment should sort before those with one. + local = -Infinity + else: + # Versions with a local segment need that segment parsed to implement + # the sorting rules in PEP440. + # - Alpha numeric segments sort before numeric segments + # - Alpha numeric segments sort lexicographically + # - Numeric segments sort numerically + # - Shorter versions sort before longer versions when the prefixes + # match exactly + local = tuple( + (i, "") if isinstance(i, int) else (-Infinity, i) + for i in local + ) + + return epoch, release, pre, post, dev, local diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/pyparsing.py b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/pyparsing.py new file mode 100644 index 0000000..cf75e1e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/pyparsing.py @@ -0,0 +1,5742 @@ +# module pyparsing.py +# +# Copyright (c) 2003-2018 Paul T. McGuire +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__doc__ = \ +""" +pyparsing module - Classes and methods to define and execute parsing grammars +============================================================================= + +The pyparsing module is an alternative approach to creating and executing simple grammars, +vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you +don't need to learn a new syntax for defining grammars or matching expressions - the parsing module +provides a library of classes that you use to construct the grammar directly in Python. + +Here is a program to parse "Hello, World!" (or any greeting of the form +C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements +(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to +L{Literal} expressions):: + + from pyparsing import Word, alphas + + # define grammar of a greeting + greet = Word(alphas) + "," + Word(alphas) + "!" + + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + +The program outputs the following:: + + Hello, World! -> ['Hello', ',', 'World', '!'] + +The Python representation of the grammar is quite readable, owing to the self-explanatory +class names, and the use of '+', '|' and '^' operators. + +The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an +object with named attributes. + +The pyparsing module handles some of the problems that are typically vexing when writing text parsers: + - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) + - quoted strings + - embedded comments + + +Getting Started - +----------------- +Visit the classes L{ParserElement} and L{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 L{Literal} and L{CaselessLiteral} classes + - construct character word-group expressions using the L{Word} class + - see how to create repetitive expressions using L{ZeroOrMore} and L{OneOrMore} classes + - use L{'+'<And>}, L{'|'<MatchFirst>}, L{'^'<Or>}, and L{'&'<Each>} operators to combine simple expressions into more complex ones + - associate names with your parsed results using L{ParserElement.setResultsName} + - find some helpful expression short-cuts like L{delimitedList} and L{oneOf} + - find more useful common expressions in the L{pyparsing_common} namespace class +""" + +__version__ = "2.2.1" +__versionTime__ = "18 Sep 2018 00:49 UTC" +__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" + +import string +from weakref import ref as wkref +import copy +import sys +import warnings +import re +import sre_constants +import collections +import pprint +import traceback +import types +from datetime import datetime + +try: + from _thread import RLock +except ImportError: + from threading import RLock + +try: + # 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 + +#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) + +__all__ = [ +'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', +'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', +'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', +'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', +'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', +'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', +'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', +'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', +'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', +'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', +'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', +'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', +'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', +'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', +'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', +'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', +'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', +'CloseMatch', 'tokenMap', 'pyparsing_common', +] + +system_version = tuple(sys.version_info)[:3] +PY_3 = system_version[0] == 3 +if PY_3: + _MAX_INT = sys.maxsize + basestring = str + unichr = chr + _ustr = str + + # build list of single arg builtins, that can be used as parse actions + singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] + +else: + _MAX_INT = sys.maxint + range = xrange + + def _ustr(obj): + """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries + str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It + then < returns the unicode object | encodes it with the default encoding | ... >. + """ + if isinstance(obj,unicode): + return obj + + try: + # If this works, then _ustr(obj) has the same behaviour as str(obj), so + # it won't break any existing code. + return str(obj) + + except UnicodeEncodeError: + # Else encode it + ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') + xmlcharref = Regex(r'&#\d+;') + xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) + return xmlcharref.transformString(ret) + + # build list of single arg builtins, tolerant of Python version, that can be used as parse actions + singleArgBuiltins = [] + import __builtin__ + for fname in "sum len sorted reversed list tuple set any all min max".split(): + try: + singleArgBuiltins.append(getattr(__builtin__,fname)) + except AttributeError: + continue + +_generatorType = type((y for y in range(1))) + +def _xml_escape(data): + """Escape &, <, >, ", ', etc. in a string of data.""" + + # ampersand must be replaced first + from_symbols = '&><"\'' + to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) + for from_,to_ in zip(from_symbols, to_symbols): + data = data.replace(from_, to_) + return data + +class _Constants(object): + pass + +alphas = string.ascii_uppercase + string.ascii_lowercase +nums = "0123456789" +hexnums = nums + "ABCDEFabcdef" +alphanums = alphas + nums +_bslash = chr(92) +printables = "".join(c for c in string.printable if c not in string.whitespace) + +class ParseBaseException(Exception): + """base exception class for all parsing runtime exceptions""" + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, pstr, loc=0, msg=None, elem=None ): + self.loc = loc + if msg is None: + self.msg = pstr + self.pstr = "" + else: + self.msg = msg + self.pstr = pstr + self.parserElement = elem + self.args = (pstr, loc, msg) + + @classmethod + def _from_exception(cls, pe): + """ + internal factory method to simplify creating one type of ParseException + from another - avoids having __init__ signature conflicts among subclasses + """ + return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) + + def __getattr__( self, aname ): + """supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + """ + if( aname == "lineno" ): + return lineno( self.loc, self.pstr ) + elif( aname in ("col", "column") ): + return col( self.loc, self.pstr ) + elif( aname == "line" ): + return line( self.loc, self.pstr ) + else: + raise AttributeError(aname) + + def __str__( self ): + return "%s (at char %d), (line:%d, col:%d)" % \ + ( self.msg, self.loc, self.lineno, self.column ) + def __repr__( self ): + return _ustr(self) + def markInputline( self, markerString = ">!<" ): + """Extracts the exception line from the input string, and marks + the location of the exception with a special symbol. + """ + line_str = self.line + line_column = self.column - 1 + if markerString: + line_str = "".join((line_str[:line_column], + markerString, line_str[line_column:])) + return line_str.strip() + def __dir__(self): + return "lineno col line".split() + dir(type(self)) + +class ParseException(ParseBaseException): + """ + Exception thrown when parse expressions don't match class; + supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + + Example:: + try: + Word(nums).setName("integer").parseString("ABC") + except ParseException as pe: + print(pe) + print("column: {}".format(pe.col)) + + prints:: + Expected integer (at char 0), (line:1, col:1) + column: 1 + """ + pass + +class ParseFatalException(ParseBaseException): + """user-throwable exception thrown when inconsistent parse content + is found; stops all parsing immediately""" + pass + +class ParseSyntaxException(ParseFatalException): + """just like L{ParseFatalException}, but thrown internally when an + L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop + immediately because an unbacktrackable syntax error has been found""" + pass + +#~ class ReparseException(ParseBaseException): + #~ """Experimental class - parse actions can raise this exception to cause + #~ pyparsing to reparse the input string: + #~ - with a modified input string, and/or + #~ - with a modified start location + #~ Set the values of the ReparseException in the constructor, and raise the + #~ exception in a parse action to cause pyparsing to use the new string/location. + #~ Setting the values as None causes no change to be made. + #~ """ + #~ def __init_( self, newstring, restartLoc ): + #~ self.newParseText = newstring + #~ self.reparseLoc = restartLoc + +class RecursiveGrammarException(Exception): + """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive""" + def __init__( self, parseElementList ): + self.parseElementTrace = parseElementList + + def __str__( self ): + return "RecursiveGrammarException: %s" % self.parseElementTrace + +class _ParseResultsWithOffset(object): + def __init__(self,p1,p2): + self.tup = (p1,p2) + def __getitem__(self,i): + return self.tup[i] + def __repr__(self): + return repr(self.tup[0]) + def setOffset(self,i): + self.tup = (self.tup[0],i) + +class ParseResults(object): + """ + Structured parse results, to provide multiple means of access to the parsed data: + - as a list (C{len(results)}) + - by list index (C{results[0], results[1]}, etc.) + - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName}) + + Example:: + integer = Word(nums) + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + # equivalent form: + # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + # parseString returns a ParseResults object + result = date_str.parseString("1999/12/31") + + def test(s, fn=repr): + print("%s -> %s" % (s, fn(eval(s)))) + test("list(result)") + test("result[0]") + test("result['month']") + test("result.day") + test("'month' in result") + test("'minutes' in result") + test("result.dump()", str) + prints:: + list(result) -> ['1999', '/', '12', '/', '31'] + result[0] -> '1999' + result['month'] -> '12' + result.day -> '31' + 'month' in result -> True + 'minutes' in result -> False + result.dump() -> ['1999', '/', '12', '/', '31'] + - day: 31 + - month: 12 + - year: 1999 + """ + def __new__(cls, toklist=None, name=None, asList=True, modal=True ): + if isinstance(toklist, cls): + return toklist + retobj = object.__new__(cls) + retobj.__doinit = True + return retobj + + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): + if self.__doinit: + self.__doinit = False + self.__name = None + self.__parent = None + self.__accumNames = {} + self.__asList = asList + self.__modal = modal + if toklist is None: + toklist = [] + if isinstance(toklist, list): + self.__toklist = toklist[:] + elif isinstance(toklist, _generatorType): + self.__toklist = list(toklist) + else: + self.__toklist = [toklist] + self.__tokdict = dict() + + if name is not None and name: + if not modal: + self.__accumNames[name] = 0 + if isinstance(name,int): + name = _ustr(name) # will always return a str, but use _ustr for consistency + self.__name = name + if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): + if isinstance(toklist,basestring): + toklist = [ toklist ] + if asList: + if isinstance(toklist,ParseResults): + self[name] = _ParseResultsWithOffset(toklist.copy(),0) + else: + self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) + self[name].__name = name + else: + try: + self[name] = toklist[0] + except (KeyError,TypeError,IndexError): + self[name] = toklist + + def __getitem__( self, i ): + if isinstance( i, (int,slice) ): + return self.__toklist[i] + else: + if i not in self.__accumNames: + return self.__tokdict[i][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[i] ]) + + def __setitem__( self, k, v, isinstance=isinstance ): + if isinstance(v,_ParseResultsWithOffset): + self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] + sub = v[0] + elif isinstance(k,(int,slice)): + self.__toklist[k] = v + sub = v + else: + self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] + sub = v + if isinstance(sub,ParseResults): + sub.__parent = wkref(self) + + def __delitem__( self, i ): + if isinstance(i,(int,slice)): + mylen = len( self.__toklist ) + del self.__toklist[i] + + # convert int to slice + if isinstance(i, int): + if i < 0: + i += mylen + i = slice(i, i+1) + # get removed indices + removed = list(range(*i.indices(mylen))) + removed.reverse() + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for j in removed: + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) + else: + del self.__tokdict[i] + + def __contains__( self, k ): + return k in self.__tokdict + + def __len__( self ): return len( self.__toklist ) + def __bool__(self): return ( not not self.__toklist ) + __nonzero__ = __bool__ + def __iter__( self ): return iter( self.__toklist ) + def __reversed__( self ): return iter( self.__toklist[::-1] ) + def _iterkeys( self ): + if hasattr(self.__tokdict, "iterkeys"): + return self.__tokdict.iterkeys() + else: + return iter(self.__tokdict) + + def _itervalues( self ): + return (self[k] for k in self._iterkeys()) + + def _iteritems( self ): + return ((k, self[k]) for k in self._iterkeys()) + + if PY_3: + keys = _iterkeys + """Returns an iterator of all named result keys (Python 3.x only).""" + + values = _itervalues + """Returns an iterator of all named result values (Python 3.x only).""" + + items = _iteritems + """Returns an iterator of all named result key-value tuples (Python 3.x only).""" + + else: + iterkeys = _iterkeys + """Returns an iterator of all named result keys (Python 2.x only).""" + + itervalues = _itervalues + """Returns an iterator of all named result values (Python 2.x only).""" + + iteritems = _iteritems + """Returns an iterator of all named result key-value tuples (Python 2.x only).""" + + def keys( self ): + """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iterkeys()) + + def values( self ): + """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.itervalues()) + + def items( self ): + """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iteritems()) + + def haskeys( self ): + """Since keys() returns an iterator, this method is helpful in bypassing + code that looks for the existence of any defined results names.""" + return bool(self.__tokdict) + + def pop( self, *args, **kwargs): + """ + Removes and returns item at specified index (default=C{last}). + Supports both C{list} and C{dict} semantics for C{pop()}. If passed no + argument or an integer argument, it will use C{list} semantics + and pop tokens from the list of parsed tokens. If passed a + non-integer argument (most likely a string), it will use C{dict} + semantics and pop the corresponding value from any defined + results names. A second default return value argument is + supported, just as in C{dict.pop()}. + + Example:: + def remove_first(tokens): + tokens.pop(0) + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] + + label = Word(alphas) + patt = label("LABEL") + OneOrMore(Word(nums)) + print(patt.parseString("AAB 123 321").dump()) + + # Use pop() in a parse action to remove named result (note that corresponding value is not + # removed from list form of results) + def remove_LABEL(tokens): + tokens.pop("LABEL") + return tokens + patt.addParseAction(remove_LABEL) + print(patt.parseString("AAB 123 321").dump()) + prints:: + ['AAB', '123', '321'] + - LABEL: AAB + + ['AAB', '123', '321'] + """ + if not args: + args = [-1] + for k,v in kwargs.items(): + if k == 'default': + args = (args[0], v) + else: + raise TypeError("pop() got an unexpected keyword argument '%s'" % k) + if (isinstance(args[0], int) or + len(args) == 1 or + args[0] in self): + index = args[0] + ret = self[index] + del self[index] + return ret + else: + defaultvalue = args[1] + return defaultvalue + + def get(self, key, defaultValue=None): + """ + Returns named result matching the given key, or if there is no + such name, then returns the given C{defaultValue} or C{None} if no + C{defaultValue} is specified. + + Similar to C{dict.get()}. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString("1999/12/31") + print(result.get("year")) # -> '1999' + print(result.get("hour", "not specified")) # -> 'not specified' + print(result.get("hour")) # -> None + """ + if key in self: + return self[key] + else: + return defaultValue + + def insert( self, index, insStr ): + """ + Inserts new element at location index in the list of parsed tokens. + + Similar to C{list.insert()}. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to insert the parse location in the front of the parsed results + def insert_locn(locn, tokens): + tokens.insert(0, locn) + print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] + """ + self.__toklist.insert(index, insStr) + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) + + def append( self, item ): + """ + Add single element to end of ParseResults list of elements. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to compute the sum of the parsed integers, and add it to the end + def append_sum(tokens): + tokens.append(sum(map(int, tokens))) + print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] + """ + self.__toklist.append(item) + + def extend( self, itemseq ): + """ + Add sequence of elements to end of ParseResults list of elements. + + Example:: + patt = OneOrMore(Word(alphas)) + + # use a parse action to append the reverse of the matched strings, to make a palindrome + def make_palindrome(tokens): + tokens.extend(reversed([t[::-1] for t in tokens])) + return ''.join(tokens) + print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' + """ + if isinstance(itemseq, ParseResults): + self += itemseq + else: + self.__toklist.extend(itemseq) + + def clear( self ): + """ + Clear all elements and results names. + """ + del self.__toklist[:] + self.__tokdict.clear() + + def __getattr__( self, name ): + try: + return self[name] + except KeyError: + return "" + + if name in self.__tokdict: + if name not in self.__accumNames: + return self.__tokdict[name][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[name] ]) + else: + return "" + + def __add__( self, other ): + ret = self.copy() + ret += other + return ret + + def __iadd__( self, other ): + if other.__tokdict: + offset = len(self.__toklist) + addoffset = lambda a: offset if a<0 else a+offset + otheritems = other.__tokdict.items() + otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) + for (k,vlist) in otheritems for v in vlist] + for k,v in otherdictitems: + self[k] = v + if isinstance(v[0],ParseResults): + v[0].__parent = wkref(self) + + self.__toklist += other.__toklist + self.__accumNames.update( other.__accumNames ) + return self + + def __radd__(self, other): + if isinstance(other,int) and other == 0: + # useful for merging many ParseResults using sum() builtin + return self.copy() + else: + # this may raise a TypeError - so be it + return other + self + + def __repr__( self ): + return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) + + def __str__( self ): + return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' + + def _asStringList( self, sep='' ): + out = [] + for item in self.__toklist: + if out and sep: + out.append(sep) + if isinstance( item, ParseResults ): + out += item._asStringList() + else: + out.append( _ustr(item) ) + return out + + def asList( self ): + """ + Returns the parse results as a nested list of matching tokens, all converted to strings. + + Example:: + patt = OneOrMore(Word(alphas)) + result = patt.parseString("sldkj lsdkj sldkj") + # even though the result prints in string-like form, it is actually a pyparsing ParseResults + print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] + + # Use asList() to create an actual list + result_list = result.asList() + print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] + """ + return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] + + def asDict( self ): + """ + Returns the named parse results as a nested dictionary. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) + + result_dict = result.asDict() + print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} + + # even though a ParseResults supports dict-like access, sometime you just need to have a dict + import json + print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable + print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} + """ + if PY_3: + item_fn = self.items + else: + item_fn = self.iteritems + + def toItem(obj): + if isinstance(obj, ParseResults): + if obj.haskeys(): + return obj.asDict() + else: + return [toItem(v) for v in obj] + else: + return obj + + return dict((k,toItem(v)) for k,v in item_fn()) + + def copy( self ): + """ + Returns a new copy of a C{ParseResults} object. + """ + ret = ParseResults( self.__toklist ) + ret.__tokdict = self.__tokdict.copy() + ret.__parent = self.__parent + ret.__accumNames.update( self.__accumNames ) + ret.__name = self.__name + return ret + + def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): + """ + (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. + """ + nl = "\n" + out = [] + namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() + for v in vlist) + nextLevelIndent = indent + " " + + # collapse out indents if formatting is not desired + if not formatted: + indent = "" + nextLevelIndent = "" + nl = "" + + selfTag = None + if doctag is not None: + selfTag = doctag + else: + if self.__name: + selfTag = self.__name + + if not selfTag: + if namedItemsOnly: + return "" + else: + selfTag = "ITEM" + + out += [ nl, indent, "<", selfTag, ">" ] + + for i,res in enumerate(self.__toklist): + if isinstance(res,ParseResults): + if i in namedItems: + out += [ res.asXML(namedItems[i], + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + out += [ res.asXML(None, + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + # individual token, see if there is a name for it + resTag = None + if i in namedItems: + resTag = namedItems[i] + if not resTag: + if namedItemsOnly: + continue + else: + resTag = "ITEM" + xmlBodyText = _xml_escape(_ustr(res)) + out += [ nl, nextLevelIndent, "<", resTag, ">", + xmlBodyText, + "</", resTag, ">" ] + + out += [ nl, indent, "</", selfTag, ">" ] + return "".join(out) + + def __lookup(self,sub): + for k,vlist in self.__tokdict.items(): + for v,loc in vlist: + if sub is v: + return k + return None + + def getName(self): + r""" + Returns the results name for this token expression. Useful when several + different expressions might match at a particular location. + + Example:: + integer = Word(nums) + ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") + house_number_expr = Suppress('#') + Word(nums, alphanums) + user_data = (Group(house_number_expr)("house_number") + | Group(ssn_expr)("ssn") + | Group(integer)("age")) + user_info = OneOrMore(user_data) + + result = user_info.parseString("22 111-22-3333 #221B") + for item in result: + print(item.getName(), ':', item[0]) + prints:: + age : 22 + ssn : 111-22-3333 + house_number : 221B + """ + if self.__name: + return self.__name + elif self.__parent: + par = self.__parent() + if par: + return par.__lookup(self) + else: + return None + elif (len(self) == 1 and + len(self.__tokdict) == 1 and + next(iter(self.__tokdict.values()))[0][1] in (0,-1)): + return next(iter(self.__tokdict.keys())) + else: + return None + + def dump(self, indent='', depth=0, full=True): + """ + Diagnostic method for listing out the contents of a C{ParseResults}. + Accepts an optional C{indent} argument so that this string can be embedded + in a nested display of other data. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(result.dump()) + prints:: + ['12', '/', '31', '/', '1999'] + - day: 1999 + - month: 31 + - year: 12 + """ + out = [] + NL = '\n' + out.append( indent+_ustr(self.asList()) ) + if full: + if self.haskeys(): + items = sorted((str(k), v) for k,v in self.items()) + for k,v in items: + if out: + out.append(NL) + out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) + if isinstance(v,ParseResults): + if v: + out.append( v.dump(indent,depth+1) ) + else: + out.append(_ustr(v)) + else: + out.append(repr(v)) + elif any(isinstance(vv,ParseResults) for vv in self): + v = self + for i,vv in enumerate(v): + if isinstance(vv,ParseResults): + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) + else: + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) + + return "".join(out) + + def pprint(self, *args, **kwargs): + """ + Pretty-printer for parsed results as a list, using the C{pprint} module. + Accepts additional positional or keyword args as defined for the + C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint}) + + Example:: + ident = Word(alphas, alphanums) + num = Word(nums) + func = Forward() + term = ident | num | Group('(' + func + ')') + func <<= ident + Group(Optional(delimitedList(term))) + result = func.parseString("fna a,b,(fnb c,d,200),100") + result.pprint(width=40) + prints:: + ['fna', + ['a', + 'b', + ['(', 'fnb', ['c', 'd', '200'], ')'], + '100']] + """ + pprint.pprint(self.asList(), *args, **kwargs) + + # add support for pickle protocol + def __getstate__(self): + return ( self.__toklist, + ( self.__tokdict.copy(), + self.__parent is not None and self.__parent() or None, + self.__accumNames, + self.__name ) ) + + def __setstate__(self,state): + self.__toklist = state[0] + (self.__tokdict, + par, + inAccumNames, + self.__name) = state[1] + self.__accumNames = {} + self.__accumNames.update(inAccumNames) + if par is not None: + self.__parent = wkref(par) + else: + self.__parent = None + + def __getnewargs__(self): + return self.__toklist, self.__name, self.__asList, self.__modal + + def __dir__(self): + return (dir(type(self)) + list(self.keys())) + +MutableMapping.register(ParseResults) + +def col (loc,strg): + """Returns current column within a string, counting newlines as line separators. + The first column is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + s = strg + return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) + +def lineno(loc,strg): + """Returns current line number within a string, counting newlines as line separators. + The first line is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + return strg.count("\n",0,loc) + 1 + +def line( loc, strg ): + """Returns the line of text containing loc within a string, counting newlines as line separators. + """ + lastCR = strg.rfind("\n", 0, loc) + nextCR = strg.find("\n", loc) + if nextCR >= 0: + return strg[lastCR+1:nextCR] + else: + return strg[lastCR+1:] + +def _defaultStartDebugAction( instring, loc, expr ): + print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) + +def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): + print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) + +def _defaultExceptionDebugAction( instring, loc, expr, exc ): + print ("Exception raised:" + _ustr(exc)) + +def nullDebugAction(*args): + """'Do-nothing' debug action, to suppress debugging output during parsing.""" + pass + +# Only works on Python 3.x - nonlocal is toxic to Python 2 installs +#~ 'decorator to trim function calls to match the arity of the target' +#~ def _trim_arity(func, maxargs=3): + #~ if func in singleArgBuiltins: + #~ return lambda s,l,t: func(t) + #~ limit = 0 + #~ foundArity = False + #~ def wrapper(*args): + #~ nonlocal limit,foundArity + #~ while 1: + #~ try: + #~ ret = func(*args[limit:]) + #~ foundArity = True + #~ return ret + #~ except TypeError: + #~ if limit == maxargs or foundArity: + #~ raise + #~ limit += 1 + #~ continue + #~ return wrapper + +# this version is Python 2.x-3.x cross-compatible +'decorator to trim function calls to match the arity of the target' +def _trim_arity(func, maxargs=2): + if func in singleArgBuiltins: + return lambda s,l,t: func(t) + limit = [0] + foundArity = [False] + + # traceback return data structure changed in Py3.5 - normalize back to plain tuples + if system_version[:2] >= (3,5): + def extract_stack(limit=0): + # special handling for Python 3.5.0 - extra deep call stack by 1 + offset = -3 if system_version == (3,5,0) else -2 + frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] + return [frame_summary[: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 = ParserElement.DEFAULT_WHITE_CHARS + self.copyDefaultWhiteChars = True + self.mayReturnEmpty = False # used when checking for left-recursion + self.keepTabs = False + self.ignoreExprs = list() + self.debug = False + self.streamlined = False + self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index + self.errmsg = "" + self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) + self.debugActions = ( None, None, None ) #custom debug actions + self.re = None + self.callPreparse = True # used to avoid redundant calls to preParse + self.callDuringTry = False + + def copy( self ): + """ + Make a copy of this C{ParserElement}. Useful for defining different parse actions + for the same parsing pattern, using copies of the original parse element. + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") + integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + + print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) + prints:: + [5120, 100, 655360, 268435456] + Equivalent form of C{expr.copy()} is just C{expr()}:: + integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + """ + cpy = copy.copy( self ) + cpy.parseAction = self.parseAction[:] + cpy.ignoreExprs = self.ignoreExprs[:] + if self.copyDefaultWhiteChars: + cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + return cpy + + def setName( self, name ): + """ + Define name for this expression, makes debugging and exception messages clearer. + + Example:: + Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) + Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) + """ + self.name = name + self.errmsg = "Expected " + self.name + if hasattr(self,"exception"): + self.exception.msg = self.errmsg + return self + + def setResultsName( self, name, listAllMatches=False ): + """ + Define name for referencing matching tokens as a nested attribute + of the returned parse results. + NOTE: this returns a *copy* of the original C{ParserElement} object; + this is so that the client can define a basic element, such as an + integer, and reference it in multiple places with different names. + + You can also set results names using the abbreviated syntax, + C{expr("name")} in place of C{expr.setResultsName("name")} - + see L{I{__call__}<__call__>}. + + Example:: + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + + # equivalent form: + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + """ + newself = self.copy() + if name.endswith("*"): + name = name[:-1] + listAllMatches=True + newself.resultsName = name + newself.modalResults = not listAllMatches + return newself + + def setBreak(self,breakFlag = True): + """Method to invoke the Python pdb debugger when this element is + about to be parsed. Set C{breakFlag} to True to enable, False to + disable. + """ + if breakFlag: + _parseMethod = self._parse + def breaker(instring, loc, doActions=True, callPreParse=True): + import pdb + pdb.set_trace() + return _parseMethod( instring, loc, doActions, callPreParse ) + breaker._originalParseMethod = _parseMethod + self._parse = breaker + else: + if hasattr(self._parse,"_originalParseMethod"): + self._parse = self._parse._originalParseMethod + return self + + def setParseAction( self, *fns, **kwargs ): + """ + Define one or more actions to perform when successfully matching parse element definition. + Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, + C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: + - s = the original string being parsed (see note below) + - loc = the location of the matching substring + - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object + If the functions in fns modify the tokens, they can return them as the return + value from fn, and the modified list of tokens will replace the original. + Otherwise, fn does not need to return any value. + + Optional keyword arguments: + - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{parseString}<parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + + Example:: + integer = Word(nums) + date_str = integer + '/' + integer + '/' + integer + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + # use parse action to convert to ints at parse time + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + date_str = integer + '/' + integer + '/' + integer + + # note that integer fields are now ints, not strings + date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] + """ + self.parseAction = list(map(_trim_arity, list(fns))) + self.callDuringTry = kwargs.get("callDuringTry", False) + return self + + def addParseAction( self, *fns, **kwargs ): + """ + Add one or more parse actions to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}. + + See examples in L{I{copy}<copy>}. + """ + self.parseAction += list(map(_trim_arity, list(fns))) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def addCondition(self, *fns, **kwargs): + """Add a boolean predicate function to expression's list of parse actions. See + L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, + functions passed to C{addCondition} need to return boolean success/fail of the condition. + + Optional keyword arguments: + - message = define a custom message to be used in the raised exception + - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + year_int = integer.copy() + year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") + date_str = year_int + '/' + integer + '/' + integer + + result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) + """ + msg = kwargs.get("message", "failed user-defined condition") + exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException + for fn in fns: + def pa(s,l,t): + if not bool(_trim_arity(fn)(s,l,t)): + raise exc_type(s,l,msg) + self.parseAction.append(pa) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def setFailAction( self, fn ): + """Define action to perform if parsing fails at this expression. + Fail acton fn is a callable function that takes the arguments + C{fn(s,loc,expr,err)} where: + - s = string being parsed + - loc = location where expression match was attempted and failed + - expr = the parse expression that failed + - err = the exception thrown + The function returns no value. It may throw C{L{ParseFatalException}} + if it is desired to stop parsing immediately.""" + self.failAction = fn + return self + + def _skipIgnorables( self, instring, loc ): + exprsFound = True + while exprsFound: + exprsFound = False + for e in self.ignoreExprs: + try: + while 1: + loc,dummy = e._parse( instring, loc ) + exprsFound = True + except ParseException: + pass + return loc + + def preParse( self, instring, loc ): + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + + if self.skipWhitespace: + wt = self.whiteChars + instrlen = len(instring) + while loc < instrlen and instring[loc] in wt: + loc += 1 + + return loc + + def parseImpl( self, instring, loc, doActions=True ): + return loc, [] + + def postParse( self, instring, loc, tokenlist ): + return tokenlist + + #~ @profile + def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): + debugging = ( self.debug ) #and doActions ) + + if debugging or self.failAction: + #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) + if (self.debugActions[0] ): + self.debugActions[0]( instring, loc, self ) + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + try: + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + except ParseBaseException as err: + #~ print ("Exception raised:", err) + if self.debugActions[2]: + self.debugActions[2]( instring, tokensStart, self, err ) + if self.failAction: + self.failAction( instring, tokensStart, self, err ) + raise + else: + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + if self.mayIndexError or 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: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + except ParseBaseException as err: + #~ print "Exception raised in user parse action:", err + if (self.debugActions[2] ): + self.debugActions[2]( instring, tokensStart, self, err ) + raise + else: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + if debugging: + #~ print ("Matched",self,"->",retTokens.asList()) + if (self.debugActions[1] ): + self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) + + return loc, retTokens + + def tryParse( self, instring, loc ): + try: + return self._parse( instring, loc, doActions=False )[0] + except ParseFatalException: + raise ParseException( instring, loc, self.errmsg, self) + + def canParseNext(self, instring, loc): + try: + self.tryParse(instring, loc) + except (ParseException, IndexError): + return False + else: + return True + + class _UnboundedCache(object): + def __init__(self): + cache = {} + self.not_in_cache = not_in_cache = object() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + if _OrderedDict is not None: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = _OrderedDict() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(cache) > size: + try: + cache.popitem(False) + except KeyError: + pass + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + else: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = {} + key_fifo = collections.deque([], size) + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(key_fifo) > size: + cache.pop(key_fifo.popleft(), None) + key_fifo.append(key) + + def clear(self): + cache.clear() + key_fifo.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + # argument cache for optimizing repeated calls when backtracking through recursive expressions + packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail + packrat_cache_lock = RLock() + packrat_cache_stats = [0, 0] + + # this method gets repeatedly called during backtracking with the same arguments - + # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression + def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): + HIT, MISS = 0, 1 + lookup = (self, instring, loc, callPreParse, doActions) + with ParserElement.packrat_cache_lock: + cache = ParserElement.packrat_cache + value = cache.get(lookup) + if value is cache.not_in_cache: + ParserElement.packrat_cache_stats[MISS] += 1 + try: + value = self._parseNoCache(instring, loc, doActions, callPreParse) + except ParseBaseException as pe: + # cache a copy of the exception, without the traceback + cache.set(lookup, pe.__class__(*pe.args)) + raise + else: + cache.set(lookup, (value[0], value[1].copy())) + return value + else: + ParserElement.packrat_cache_stats[HIT] += 1 + if isinstance(value, Exception): + raise value + return (value[0], value[1].copy()) + + _parse = _parseNoCache + + @staticmethod + def resetCache(): + ParserElement.packrat_cache.clear() + ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) + + _packratEnabled = False + @staticmethod + def enablePackrat(cache_size_limit=128): + """Enables "packrat" parsing, which adds memoizing to the parsing logic. + Repeated parse attempts at the same string location (which happens + often in many complex grammars) can immediately return a cached value, + instead of re-executing parsing/validating code. Memoizing is done of + both valid results and parsing exceptions. + + Parameters: + - cache_size_limit - (default=C{128}) - if an integer value is provided + will limit the size of the packrat cache; if None is passed, then + the cache size will be unbounded; if 0 is passed, the cache will + be effectively disabled. + + This speedup may break existing programs that use parse actions that + have side-effects. For this reason, packrat parsing is disabled when + you first import pyparsing. To activate the packrat feature, your + program must call the class method C{ParserElement.enablePackrat()}. If + your program uses C{psyco} to "compile as you go", you must call + C{enablePackrat} before calling C{psyco.full()}. If you do not do this, + Python will crash. For best results, call C{enablePackrat()} immediately + after importing pyparsing. + + Example:: + import pyparsing + pyparsing.ParserElement.enablePackrat() + """ + if not ParserElement._packratEnabled: + ParserElement._packratEnabled = True + if cache_size_limit is None: + ParserElement.packrat_cache = ParserElement._UnboundedCache() + else: + ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) + ParserElement._parse = ParserElement._parseCache + + def parseString( self, instring, parseAll=False ): + """ + Execute the parse expression with the given string. + This is the main interface to the client code, once the complete + expression has been built. + + If you want the grammar to require that the entire input string be + successfully parsed, then set C{parseAll} to True (equivalent to ending + the grammar with C{L{StringEnd()}}). + + Note: C{parseString} implicitly calls C{expandtabs()} on the input string, + in order to report proper column numbers in parse actions. + If the input string contains tabs and + the grammar uses parse actions that use the C{loc} argument to index into the + string being parsed, you can ensure you have a consistent view of the input + string by: + - calling C{parseWithTabs} on your grammar before calling C{parseString} + (see L{I{parseWithTabs}<parseWithTabs>}) + - define your parse action using the full C{(s,loc,toks)} signature, and + reference the input string using the parse action's C{s} argument + - explictly expand the tabs in your input string before calling + C{parseString} + + Example:: + Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] + Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text + """ + ParserElement.resetCache() + if not self.streamlined: + self.streamline() + #~ self.saveAsList = True + for e in self.ignoreExprs: + e.streamline() + if not self.keepTabs: + instring = instring.expandtabs() + try: + loc, tokens = self._parse( instring, 0 ) + if parseAll: + loc = self.preParse( instring, loc ) + se = Empty() + StringEnd() + se._parse( instring, loc ) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + else: + return tokens + + def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): + """ + Scan the input string for expression matches. Each match will return the + matching tokens, start location, and end location. May be called with optional + C{maxMatches} argument, to clip scanning after 'n' matches are found. If + C{overlap} is specified, then overlapping matches will be reported. + + Note that the start and end locations are reported relative to the string + being parsed. See L{I{parseString}<parseString>} for more information on parsing + strings with embedded tabs. + + Example:: + source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" + print(source) + for tokens,start,end in Word(alphas).scanString(source): + print(' '*start + '^'*(end-start)) + print(' '*start + tokens[0]) + + prints:: + + sldjf123lsdjjkf345sldkjf879lkjsfd987 + ^^^^^ + sldjf + ^^^^^^^ + lsdjjkf + ^^^^^^ + sldkjf + ^^^^^^ + lkjsfd + """ + if not self.streamlined: + self.streamline() + for e in self.ignoreExprs: + e.streamline() + + if not self.keepTabs: + instring = _ustr(instring).expandtabs() + instrlen = len(instring) + loc = 0 + preparseFn = self.preParse + parseFn = self._parse + ParserElement.resetCache() + matches = 0 + try: + while loc <= instrlen and matches < maxMatches: + try: + preloc = preparseFn( instring, loc ) + nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) + except ParseException: + loc = preloc+1 + else: + if nextLoc > loc: + matches += 1 + yield tokens, preloc, nextLoc + if overlap: + nextloc = preparseFn( instring, loc ) + if nextloc > loc: + loc = nextLoc + else: + loc += 1 + else: + loc = nextLoc + else: + loc = preloc+1 + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def transformString( self, instring ): + """ + Extension to C{L{scanString}}, to modify matching text with modified tokens that may + be returned from a parse action. To use C{transformString}, define a grammar and + attach a parse action to it that modifies the returned token list. + Invoking C{transformString()} on a target string will then scan for matches, + and replace the matched text patterns according to the logic in the parse + action. C{transformString()} returns the resulting transformed string. + + Example:: + wd = Word(alphas) + wd.setParseAction(lambda toks: toks[0].title()) + + print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) + Prints:: + Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. + """ + out = [] + lastE = 0 + # force preservation of <TAB>s, to minimize unwanted transformation of string, and to + # keep string locs straight between transformString and scanString + self.keepTabs = True + try: + for t,s,e in self.scanString( instring ): + out.append( instring[lastE:s] ) + if t: + if isinstance(t,ParseResults): + out += t.asList() + elif isinstance(t,list): + out += t + else: + out.append(t) + lastE = e + out.append(instring[lastE:]) + out = [o for o in out if o] + return "".join(map(_ustr,_flatten(out))) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def searchString( self, instring, maxMatches=_MAX_INT ): + """ + Another extension to C{L{scanString}}, simplifying the access to the tokens found + to match the given parse expression. May be called with optional + C{maxMatches} argument, to clip searching after 'n' matches are found. + + Example:: + # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters + cap_word = Word(alphas.upper(), alphas.lower()) + + print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) + + # the sum() builtin can be used to merge results into a single ParseResults object + print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))) + prints:: + [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] + ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] + """ + try: + return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): + """ + Generator method to split a string using the given expression as a separator. + May be called with optional C{maxsplit} argument, to limit the number of splits; + and the optional C{includeSeparators} argument (default=C{False}), if the separating + matching text should be included in the split results. + + Example:: + punc = oneOf(list(".,;:/-!?")) + print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) + prints:: + ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] + """ + splits = 0 + last = 0 + for t,s,e in self.scanString(instring, maxMatches=maxsplit): + yield instring[last:s] + if includeSeparators: + yield t[0] + last = e + yield instring[last:] + + def __add__(self, other ): + """ + Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement + converts them to L{Literal}s by default. + + Example:: + greet = Word(alphas) + "," + Word(alphas) + "!" + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + Prints:: + Hello, World! -> ['Hello', ',', 'World', '!'] + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return And( [ self, other ] ) + + def __radd__(self, other ): + """ + Implementation of + operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other + self + + def __sub__(self, other): + """ + Implementation of - operator, returns C{L{And}} with error stop + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return self + And._ErrorStop() + other + + def __rsub__(self, other ): + """ + Implementation of - operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other - self + + def __mul__(self,other): + """ + Implementation of * operator, allows use of C{expr * 3} in place of + C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer + tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples + may also include C{None} as in: + - C{expr*(n,None)} or C{expr*(n,)} is equivalent + to C{expr*n + L{ZeroOrMore}(expr)} + (read as "at least n instances of C{expr}") + - C{expr*(None,n)} is equivalent to C{expr*(0,n)} + (read as "0 to n instances of C{expr}") + - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} + - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} + + Note that C{expr*(None,n)} does not raise an exception if + more than n exprs exist in the input stream; that is, + C{expr*(None,n)} does not enforce a maximum number of expr + occurrences. If this behavior is desired, then write + C{expr*(None,n) + ~expr} + """ + if isinstance(other,int): + minElements, optElements = other,0 + elif isinstance(other,tuple): + other = (other + (None, None))[:2] + if other[0] is None: + other = (0, other[1]) + if isinstance(other[0],int) and other[1] is None: + if other[0] == 0: + return ZeroOrMore(self) + if other[0] == 1: + return OneOrMore(self) + else: + return self*other[0] + ZeroOrMore(self) + elif isinstance(other[0],int) and isinstance(other[1],int): + minElements, optElements = other + optElements -= minElements + else: + raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) + else: + raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) + + if minElements < 0: + raise ValueError("cannot multiply ParserElement by negative value") + if optElements < 0: + raise ValueError("second tuple value must be greater or equal to first tuple value") + if minElements == optElements == 0: + raise ValueError("cannot multiply ParserElement by 0 or (0,0)") + + if (optElements): + def makeOptionalList(n): + if n>1: + return Optional(self + makeOptionalList(n-1)) + else: + return Optional(self) + if minElements: + if minElements == 1: + ret = self + makeOptionalList(optElements) + else: + ret = And([self]*minElements) + makeOptionalList(optElements) + else: + ret = makeOptionalList(optElements) + else: + if minElements == 1: + ret = self + else: + ret = And([self]*minElements) + return ret + + def __rmul__(self, other): + return self.__mul__(other) + + def __or__(self, other ): + """ + Implementation of | operator - returns C{L{MatchFirst}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return MatchFirst( [ self, other ] ) + + def __ror__(self, other ): + """ + Implementation of | operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other | self + + def __xor__(self, other ): + """ + Implementation of ^ operator - returns C{L{Or}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Or( [ self, other ] ) + + def __rxor__(self, other ): + """ + Implementation of ^ operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other ^ self + + def __and__(self, other ): + """ + Implementation of & operator - returns C{L{Each}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Each( [ self, other ] ) + + def __rand__(self, other ): + """ + Implementation of & operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other & self + + def __invert__( self ): + """ + Implementation of ~ operator - returns C{L{NotAny}} + """ + return NotAny( self ) + + def __call__(self, name=None): + """ + Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}. + + If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be + passed as C{True}. + + If C{name} is omitted, same as calling C{L{copy}}. + + Example:: + # these are equivalent + userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") + userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") + """ + if name is not None: + return self.setResultsName(name) + else: + return self.copy() + + def suppress( self ): + """ + Suppresses the output of this C{ParserElement}; useful to keep punctuation from + cluttering up returned output. + """ + return Suppress( self ) + + def leaveWhitespace( self ): + """ + Disables the skipping of whitespace before matching the characters in the + C{ParserElement}'s defined pattern. This is normally only used internally by + the pyparsing module, but may be needed in some whitespace-sensitive grammars. + """ + self.skipWhitespace = False + return self + + def setWhitespaceChars( self, chars ): + """ + Overrides the default whitespace chars + """ + self.skipWhitespace = True + self.whiteChars = chars + self.copyDefaultWhiteChars = False + return self + + def parseWithTabs( self ): + """ + Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string. + Must be called before C{parseString} when the input grammar contains elements that + match C{<TAB>} characters. + """ + self.keepTabs = True + return self + + def ignore( self, other ): + """ + Define expression to be ignored (e.g., comments) while doing pattern + matching; may be called repeatedly, to define multiple comment or other + ignorable patterns. + + Example:: + patt = OneOrMore(Word(alphas)) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] + + patt.ignore(cStyleComment) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] + """ + if isinstance(other, basestring): + other = Suppress(other) + + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + self.ignoreExprs.append(other) + else: + self.ignoreExprs.append( Suppress( other.copy() ) ) + return self + + def setDebugActions( self, startAction, successAction, exceptionAction ): + """ + Enable display of debugging messages while doing pattern matching. + """ + self.debugActions = (startAction or _defaultStartDebugAction, + successAction or _defaultSuccessDebugAction, + exceptionAction or _defaultExceptionDebugAction) + self.debug = True + return self + + def setDebug( self, flag=True ): + """ + Enable display of debugging messages while doing pattern matching. + Set C{flag} to True to enable, False to disable. + + Example:: + wd = Word(alphas).setName("alphaword") + integer = Word(nums).setName("numword") + term = wd | integer + + # turn on debugging for wd + wd.setDebug() + + OneOrMore(term).parseString("abc 123 xyz 890") + + prints:: + Match alphaword at loc 0(1,1) + Matched alphaword -> ['abc'] + Match alphaword at loc 3(1,4) + Exception raised:Expected alphaword (at char 4), (line:1, col:5) + Match alphaword at loc 7(1,8) + Matched alphaword -> ['xyz'] + Match alphaword at loc 11(1,12) + Exception raised:Expected alphaword (at char 12), (line:1, col:13) + Match alphaword at loc 15(1,16) + Exception raised:Expected alphaword (at char 15), (line:1, col:16) + + The output shown is that produced by the default debug actions - custom debug actions can be + specified using L{setDebugActions}. Prior to attempting + to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"} + is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"} + message is shown. Also note the use of L{setName} to assign a human-readable name to the expression, + which makes debugging and exception messages easier to understand - for instance, the default + name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}. + """ + if flag: + self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) + else: + self.debug = False + return self + + def __str__( self ): + return self.name + + def __repr__( self ): + return _ustr(self) + + def streamline( self ): + self.streamlined = True + self.strRepr = None + return self + + def checkRecursion( self, parseElementList ): + pass + + def validate( self, validateTrace=[] ): + """ + Check defined expressions for valid structure, check for infinite recursive definitions. + """ + self.checkRecursion( [] ) + + def parseFile( self, file_or_filename, parseAll=False ): + """ + Execute the parse expression on the given file or filename. + If a filename is specified (instead of a file object), + the entire file is opened, read, and closed before parsing. + """ + try: + file_contents = file_or_filename.read() + except AttributeError: + with open(file_or_filename, "r") as f: + file_contents = f.read() + try: + return self.parseString(file_contents, parseAll) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def __eq__(self,other): + if isinstance(other, ParserElement): + return self is other or vars(self) == vars(other) + elif isinstance(other, basestring): + return self.matches(other) + else: + return super(ParserElement,self)==other + + def __ne__(self,other): + return not (self == other) + + def __hash__(self): + return hash(id(self)) + + def __req__(self,other): + return self == other + + def __rne__(self,other): + return not (self == other) + + def matches(self, testString, parseAll=True): + """ + Method for quick testing of a parser against a test string. Good for simple + inline microtests of sub expressions while building up larger parser. + + Parameters: + - testString - to test against this expression for a match + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + + Example:: + expr = Word(nums) + assert expr.matches("100") + """ + try: + self.parseString(_ustr(testString), parseAll=parseAll) + return True + except ParseBaseException: + return False + + def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False): + """ + Execute the parse expression on a series of test strings, showing each + test, the parsed results or where the parse failed. Quick and easy way to + run a parse expression against a list of sample strings. + + Parameters: + - tests - a list of separate test strings, or a multiline string of test strings + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + - comment - (default=C{'#'}) - expression for indicating embedded comments in the test + string; pass None to disable comment filtering + - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline; + if False, only dump nested list + - printResults - (default=C{True}) prints test output to stdout + - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing + + Returns: a (success, results) tuple, where success indicates that all tests succeeded + (or failed if C{failureTests} is True), and the results contain a list of lines of each + test's output + + Example:: + number_expr = pyparsing_common.number.copy() + + result = number_expr.runTests(''' + # unsigned integer + 100 + # negative integer + -100 + # float with scientific notation + 6.02e23 + # integer with scientific notation + 1e-12 + ''') + print("Success" if result[0] else "Failed!") + + result = number_expr.runTests(''' + # stray character + 100Z + # missing leading digit before '.' + -.100 + # too many '.' + 3.14.159 + ''', failureTests=True) + print("Success" if result[0] else "Failed!") + prints:: + # unsigned integer + 100 + [100] + + # negative integer + -100 + [-100] + + # float with scientific notation + 6.02e23 + [6.02e+23] + + # integer with scientific notation + 1e-12 + [1e-12] + + Success + + # stray character + 100Z + ^ + FAIL: Expected end of text (at char 3), (line:1, col:4) + + # missing leading digit before '.' + -.100 + ^ + FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) + + # too many '.' + 3.14.159 + ^ + FAIL: Expected end of text (at char 4), (line:1, col:5) + + Success + + Each test string must be on a single line. If you want to test a string that spans multiple + lines, create a test like this:: + + expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") + + (Note that this is a raw string literal, you must include the leading 'r'.) + """ + if isinstance(tests, basestring): + tests = list(map(str.strip, tests.rstrip().splitlines())) + if isinstance(comment, basestring): + comment = Literal(comment) + allResults = [] + comments = [] + success = True + for t in tests: + if comment is not None and comment.matches(t, False) or comments and not t: + comments.append(t) + continue + if not t: + continue + out = ['\n'.join(comments), t] + comments = [] + try: + t = t.replace(r'\n','\n') + result = self.parseString(t, parseAll=parseAll) + out.append(result.dump(full=fullDump)) + success = success and not failureTests + except ParseBaseException as pe: + fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" + if '\n' in t: + out.append(line(pe.loc, t)) + out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) + else: + out.append(' '*pe.loc + '^' + fatal) + out.append("FAIL: " + str(pe)) + success = success and failureTests + result = pe + except Exception as exc: + out.append("FAIL-EXCEPTION: " + str(exc)) + success = success and failureTests + result = exc + + if printResults: + if fullDump: + out.append('') + print('\n'.join(out)) + + allResults.append((t, result)) + + return success, allResults + + +class Token(ParserElement): + """ + Abstract C{ParserElement} subclass, for defining atomic matching patterns. + """ + def __init__( self ): + super(Token,self).__init__( savelist=False ) + + +class Empty(Token): + """ + An empty token, will always match. + """ + def __init__( self ): + super(Empty,self).__init__() + self.name = "Empty" + self.mayReturnEmpty = True + self.mayIndexError = False + + +class NoMatch(Token): + """ + A token that will never match. + """ + def __init__( self ): + super(NoMatch,self).__init__() + self.name = "NoMatch" + self.mayReturnEmpty = True + self.mayIndexError = False + self.errmsg = "Unmatchable token" + + def parseImpl( self, instring, loc, doActions=True ): + raise ParseException(instring, loc, self.errmsg, self) + + +class Literal(Token): + """ + Token to exactly match a specified string. + + Example:: + Literal('blah').parseString('blah') # -> ['blah'] + Literal('blah').parseString('blahfooblah') # -> ['blah'] + Literal('blah').parseString('bla') # -> Exception: Expected "blah" + + For case-insensitive matching, use L{CaselessLiteral}. + + For keyword matching (force word break before and after the matched string), + use L{Keyword} or L{CaselessKeyword}. + """ + def __init__( self, matchString ): + super(Literal,self).__init__() + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Literal; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.__class__ = Empty + self.name = '"%s"' % _ustr(self.match) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + + # Performance tuning: this routine gets called a *lot* + # if this is a single character match string and the first character matches, + # short-circuit as quickly as possible, and avoid calling startswith + #~ @profile + def parseImpl( self, instring, loc, doActions=True ): + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) +_L = Literal +ParserElement._literalStringClass = Literal + +class Keyword(Token): + """ + Token to exactly match a specified string as a keyword, that is, it must be + immediately followed by a non-keyword character. Compare with C{L{Literal}}: + - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}. + - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} + Accepts two optional constructor arguments in addition to the keyword string: + - C{identChars} is a string of characters that would be valid identifier characters, + defaulting to all alphanumerics + "_" and "$" + - C{caseless} allows case-insensitive matching, default is C{False}. + + Example:: + Keyword("start").parseString("start") # -> ['start'] + Keyword("start").parseString("starting") # -> Exception + + For case-insensitive matching, use L{CaselessKeyword}. + """ + DEFAULT_KEYWORD_CHARS = alphanums+"_$" + + def __init__( self, matchString, identChars=None, caseless=False ): + super(Keyword,self).__init__() + if identChars is None: + identChars = Keyword.DEFAULT_KEYWORD_CHARS + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Keyword; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.name = '"%s"' % self.match + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + self.caseless = caseless + if caseless: + self.caselessmatch = matchString.upper() + identChars = identChars.upper() + self.identChars = set(identChars) + + def parseImpl( self, instring, loc, doActions=True ): + if self.caseless: + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and + (loc == 0 or instring[loc-1].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + else: + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and + (loc == 0 or instring[loc-1] not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + + def copy(self): + c = super(Keyword,self).copy() + c.identChars = Keyword.DEFAULT_KEYWORD_CHARS + return c + + @staticmethod + def setDefaultKeywordChars( chars ): + """Overrides the default Keyword chars + """ + Keyword.DEFAULT_KEYWORD_CHARS = chars + +class CaselessLiteral(Literal): + """ + Token to match a specified string, ignoring case of letters. + Note: the matched results will always be in the case of the given + match string, NOT the case of the input text. + + Example:: + OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] + + (Contrast with example for L{CaselessKeyword}.) + """ + def __init__( self, matchString ): + super(CaselessLiteral,self).__init__( matchString.upper() ) + # Preserve the defining literal. + self.returnString = matchString + self.name = "'%s'" % self.returnString + self.errmsg = "Expected " + self.name + + def parseImpl( self, instring, loc, doActions=True ): + if instring[ loc:loc+self.matchLen ].upper() == self.match: + return loc+self.matchLen, self.returnString + raise ParseException(instring, loc, self.errmsg, self) + +class CaselessKeyword(Keyword): + """ + Caseless version of L{Keyword}. + + Example:: + OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] + + (Contrast with example for L{CaselessLiteral}.) + """ + def __init__( self, matchString, identChars=None ): + super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) + + def parseImpl( self, instring, loc, doActions=True ): + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + +class CloseMatch(Token): + """ + A variation on L{Literal} which matches "close" matches, that is, + strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters: + - C{match_string} - string to be matched + - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match + + The results from a successful parse will contain the matched text from the input string and the following named results: + - C{mismatches} - a list of the positions within the match_string where mismatches were found + - C{original} - the original match_string used to compare against the input string + + If C{mismatches} is an empty list, then the match was an exact match. + + Example:: + patt = CloseMatch("ATCATCGAATGGA") + patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) + patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) + + # exact match + patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) + + # close match allowing up to 2 mismatches + patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) + patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) + """ + def __init__(self, match_string, maxMismatches=1): + super(CloseMatch,self).__init__() + self.name = match_string + self.match_string = match_string + self.maxMismatches = maxMismatches + self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) + self.mayIndexError = False + self.mayReturnEmpty = False + + def parseImpl( self, instring, loc, doActions=True ): + start = loc + instrlen = len(instring) + maxloc = start + len(self.match_string) + + if maxloc <= instrlen: + match_string = self.match_string + match_stringloc = 0 + mismatches = [] + maxMismatches = self.maxMismatches + + for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): + src,mat = s_m + if src != mat: + mismatches.append(match_stringloc) + if len(mismatches) > maxMismatches: + break + else: + loc = match_stringloc + 1 + results = ParseResults([instring[start:loc]]) + results['original'] = self.match_string + results['mismatches'] = mismatches + return loc, results + + raise ParseException(instring, loc, self.errmsg, self) + + +class Word(Token): + """ + Token for matching words composed of allowed character sets. + Defined with string containing all allowed initial characters, + an optional string containing allowed body characters (if omitted, + defaults to the initial character set), and an optional minimum, + maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. An optional + C{excludeChars} parameter can list characters that might be found in + the input C{bodyChars} string; useful to define a word of all printables + except for one or two characters, for instance. + + L{srange} is useful for defining custom character set strings for defining + C{Word} expressions, using range notation from regular expression character sets. + + A common mistake is to use C{Word} to match a specific literal string, as in + C{Word("Address")}. Remember that C{Word} uses the string argument to define + I{sets} of matchable characters. This expression would match "Add", "AAA", + "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'. + To match an exact literal string, use L{Literal} or L{Keyword}. + + pyparsing includes helper strings for building Words: + - L{alphas} + - L{nums} + - L{alphanums} + - L{hexnums} + - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.) + - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.) + - L{printables} (any non-whitespace character) + + Example:: + # a word composed of digits + integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) + + # a word with a leading capital, and zero or more lowercase + capital_word = Word(alphas.upper(), alphas.lower()) + + # hostnames are alphanumeric, with leading alpha, and '-' + hostname = Word(alphas, alphanums+'-') + + # roman numeral (not a strict parser, accepts invalid mix of characters) + roman = Word("IVXLCDM") + + # any string of non-whitespace characters, except for ',' + csv_value = Word(printables, excludeChars=",") + """ + def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): + super(Word,self).__init__() + if excludeChars: + initChars = ''.join(c for c in initChars if c not in excludeChars) + if bodyChars: + bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) + self.initCharsOrig = initChars + self.initChars = set(initChars) + if bodyChars : + self.bodyCharsOrig = bodyChars + self.bodyChars = set(bodyChars) + else: + self.bodyCharsOrig = initChars + self.bodyChars = set(initChars) + + self.maxSpecified = max > 0 + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.asKeyword = asKeyword + + if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): + if self.bodyCharsOrig == self.initCharsOrig: + self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) + elif len(self.initCharsOrig) == 1: + self.reString = "%s[%s]*" % \ + (re.escape(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + else: + self.reString = "[%s][%s]*" % \ + (_escapeRegexRangeChars(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + if self.asKeyword: + self.reString = r"\b"+self.reString+r"\b" + try: + self.re = re.compile( self.reString ) + except Exception: + self.re = None + + def parseImpl( self, instring, loc, doActions=True ): + if self.re: + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + return loc, result.group() + + if not(instring[ loc ] in self.initChars): + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + instrlen = len(instring) + bodychars = self.bodyChars + maxloc = start + self.maxLen + maxloc = min( maxloc, instrlen ) + while loc < maxloc and instring[loc] in bodychars: + loc += 1 + + throwException = False + if loc - start < self.minLen: + throwException = True + if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: + throwException = True + if self.asKeyword: + if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): + throwException = True + + if throwException: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(Word,self).__str__() + except Exception: + pass + + + if self.strRepr is None: + + def charsAsStr(s): + if len(s)>4: + return s[:4]+"..." + else: + return s + + if ( self.initCharsOrig != self.bodyCharsOrig ): + self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) + else: + self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) + + return self.strRepr + + +class Regex(Token): + r""" + Token for matching strings that match a given regular expression. + Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. + If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as + named parse results. + + Example:: + realnum = Regex(r"[+-]?\d+\.\d*") + date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') + # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression + roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") + """ + compiledREtype = type(re.compile("[A-Z]")) + def __init__( self, pattern, flags=0): + """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.""" + super(Regex,self).__init__() + + if isinstance(pattern, basestring): + if not pattern: + warnings.warn("null string passed to Regex; use Empty() instead", + SyntaxWarning, stacklevel=2) + + self.pattern = pattern + self.flags = flags + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % pattern, + SyntaxWarning, stacklevel=2) + raise + + elif isinstance(pattern, Regex.compiledREtype): + self.re = pattern + self.pattern = \ + self.reString = str(pattern) + self.flags = flags + + else: + raise ValueError("Regex may only be constructed with a string or a compiled RE object") + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + d = result.groupdict() + ret = ParseResults(result.group()) + if d: + for k in d: + ret[k] = d[k] + return loc,ret + + def __str__( self ): + try: + return super(Regex,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "Re:(%s)" % repr(self.pattern) + + return self.strRepr + + +class QuotedString(Token): + r""" + Token for matching strings that are delimited by quoting characters. + + Defined with the following parameters: + - quoteChar - string of one or more characters defining the quote delimiting string + - escChar - character to escape quotes, typically backslash (default=C{None}) + - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None}) + - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) + - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) + - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) + - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True}) + + Example:: + qs = QuotedString('"') + print(qs.searchString('lsjdf "This is the quote" sldjf')) + complex_qs = QuotedString('{{', endQuoteChar='}}') + print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) + sql_qs = QuotedString('"', escQuote='""') + print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) + prints:: + [['This is the quote']] + [['This is the "quote"']] + [['This is the quote with "embedded" quotes']] + """ + def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): + super(QuotedString,self).__init__() + + # remove white space from quote chars - wont work anyway + quoteChar = quoteChar.strip() + if not quoteChar: + warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + if endQuoteChar is None: + endQuoteChar = quoteChar + else: + endQuoteChar = endQuoteChar.strip() + if not endQuoteChar: + warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + self.quoteChar = quoteChar + self.quoteCharLen = len(quoteChar) + self.firstQuoteChar = quoteChar[0] + self.endQuoteChar = endQuoteChar + self.endQuoteCharLen = len(endQuoteChar) + self.escChar = escChar + self.escQuote = escQuote + self.unquoteResults = unquoteResults + self.convertWhitespaceEscapes = convertWhitespaceEscapes + + if multiline: + self.flags = re.MULTILINE | re.DOTALL + self.pattern = r'%s(?:[^%s%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + else: + self.flags = 0 + self.pattern = r'%s(?:[^%s\n\r%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + if len(self.endQuoteChar) > 1: + self.pattern += ( + '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), + _escapeRegexRangeChars(self.endQuoteChar[i])) + for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' + ) + if escQuote: + self.pattern += (r'|(?:%s)' % re.escape(escQuote)) + if escChar: + self.pattern += (r'|(?:%s.)' % re.escape(escChar)) + self.escCharReplacePattern = re.escape(self.escChar)+"(.)" + self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, + SyntaxWarning, stacklevel=2) + raise + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result.group() + + if self.unquoteResults: + + # strip off quotes + ret = ret[self.quoteCharLen:-self.endQuoteCharLen] + + if isinstance(ret,basestring): + # replace escaped whitespace + if '\\' in ret and self.convertWhitespaceEscapes: + ws_map = { + r'\t' : '\t', + r'\n' : '\n', + r'\f' : '\f', + r'\r' : '\r', + } + for wslit,wschar in ws_map.items(): + ret = ret.replace(wslit, wschar) + + # replace escaped characters + if self.escChar: + ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret) + + # replace escaped quotes + if self.escQuote: + ret = ret.replace(self.escQuote, self.endQuoteChar) + + return loc, ret + + def __str__( self ): + try: + return super(QuotedString,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) + + return self.strRepr + + +class CharsNotIn(Token): + """ + Token for matching words composed of characters I{not} in a given set (will + include whitespace in matched characters if not listed in the provided exclusion set - see example). + Defined with string containing all disallowed characters, and an optional + minimum, maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. + + Example:: + # define a comma-separated-value as anything that is not a ',' + csv_value = CharsNotIn(',') + print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) + prints:: + ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] + """ + def __init__( self, notChars, min=1, max=0, exact=0 ): + super(CharsNotIn,self).__init__() + self.skipWhitespace = False + self.notChars = notChars + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = ( self.minLen == 0 ) + self.mayIndexError = False + + def parseImpl( self, instring, loc, doActions=True ): + if instring[loc] in self.notChars: + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + notchars = self.notChars + maxlen = min( start+self.maxLen, len(instring) ) + while loc < maxlen and \ + (instring[loc] not in notchars): + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(CharsNotIn, self).__str__() + except Exception: + pass + + if self.strRepr is None: + if len(self.notChars) > 4: + self.strRepr = "!W:(%s...)" % self.notChars[:4] + else: + self.strRepr = "!W:(%s)" % self.notChars + + return self.strRepr + +class White(Token): + """ + Special matching class for matching whitespace. Normally, whitespace is ignored + by pyparsing grammars. This class is included when some whitespace structures + are significant. Define with a string containing the whitespace characters to be + matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, + as defined for the C{L{Word}} class. + """ + whiteStrs = { + " " : "<SPC>", + "\t": "<TAB>", + "\n": "<LF>", + "\r": "<CR>", + "\f": "<FF>", + } + def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): + super(White,self).__init__() + self.matchWhite = ws + self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) + #~ self.leaveWhitespace() + self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) + self.mayReturnEmpty = True + self.errmsg = "Expected " + self.name + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + def parseImpl( self, instring, loc, doActions=True ): + if not(instring[ loc ] in self.matchWhite): + raise ParseException(instring, loc, self.errmsg, self) + start = loc + loc += 1 + maxloc = start + self.maxLen + maxloc = min( maxloc, len(instring) ) + while loc < maxloc and instring[loc] in self.matchWhite: + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + +class _PositionToken(Token): + def __init__( self ): + super(_PositionToken,self).__init__() + self.name=self.__class__.__name__ + self.mayReturnEmpty = True + self.mayIndexError = False + +class GoToColumn(_PositionToken): + """ + Token to advance to a specific column of input text; useful for tabular report scraping. + """ + def __init__( self, colno ): + super(GoToColumn,self).__init__() + self.col = colno + + def preParse( self, instring, loc ): + if col(loc,instring) != self.col: + instrlen = len(instring) + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : + loc += 1 + return loc + + def parseImpl( self, instring, loc, doActions=True ): + thiscol = col( loc, instring ) + if thiscol > self.col: + raise ParseException( instring, loc, "Text not in expected column", self ) + newloc = loc + self.col - thiscol + ret = instring[ loc: newloc ] + return newloc, ret + + +class LineStart(_PositionToken): + """ + Matches if current position is at the beginning of a line within the parse string + + Example:: + + test = '''\ + AAA this line + AAA and this line + AAA but not this one + B AAA and definitely not this one + ''' + + for t in (LineStart() + 'AAA' + restOfLine).searchString(test): + print(t) + + Prints:: + ['AAA', ' this line'] + ['AAA', ' and this line'] + + """ + def __init__( self ): + super(LineStart,self).__init__() + self.errmsg = "Expected start of line" + + def parseImpl( self, instring, loc, doActions=True ): + if col(loc, instring) == 1: + return loc, [] + raise ParseException(instring, loc, self.errmsg, self) + +class LineEnd(_PositionToken): + """ + Matches if current position is at the end of a line within the parse string + """ + def __init__( self ): + super(LineEnd,self).__init__() + self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) + self.errmsg = "Expected end of line" + + def parseImpl( self, instring, loc, doActions=True ): + if loc<len(instring): + if instring[loc] == "\n": + return loc+1, "\n" + else: + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class StringStart(_PositionToken): + """ + Matches if current position is at the beginning of the parse string + """ + def __init__( self ): + super(StringStart,self).__init__() + self.errmsg = "Expected start of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc != 0: + # see if entire string up to here is just whitespace and ignoreables + if loc != self.preParse( instring, 0 ): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class StringEnd(_PositionToken): + """ + Matches if current position is at the end of the parse string + """ + def __init__( self ): + super(StringEnd,self).__init__() + self.errmsg = "Expected end of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc < len(instring): + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + elif loc > len(instring): + return loc, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class WordStart(_PositionToken): + """ + Matches if the current position is at the beginning of a Word, and + is not preceded by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of + the string being parsed, or at the beginning of a line. + """ + def __init__(self, wordChars = printables): + super(WordStart,self).__init__() + self.wordChars = set(wordChars) + self.errmsg = "Not at the start of a word" + + def parseImpl(self, instring, loc, doActions=True ): + if loc != 0: + if (instring[loc-1] in self.wordChars or + instring[loc] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class WordEnd(_PositionToken): + """ + Matches if the current position is at the end of a Word, and + is not followed by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of + the string being parsed, or at the end of a line. + """ + def __init__(self, wordChars = printables): + super(WordEnd,self).__init__() + self.wordChars = set(wordChars) + self.skipWhitespace = False + self.errmsg = "Not at the end of a word" + + def parseImpl(self, instring, loc, doActions=True ): + instrlen = len(instring) + if instrlen>0 and loc<instrlen: + if (instring[loc] in self.wordChars or + instring[loc-1] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + +class ParseExpression(ParserElement): + """ + Abstract subclass of ParserElement, for combining and post-processing parsed tokens. + """ + def __init__( self, exprs, savelist = False ): + super(ParseExpression,self).__init__(savelist) + if isinstance( exprs, _generatorType ): + exprs = list(exprs) + + if isinstance( exprs, basestring ): + self.exprs = [ ParserElement._literalStringClass( exprs ) ] + elif isinstance( exprs, Iterable ): + exprs = list(exprs) + # if sequence of strings provided, wrap with Literal + if all(isinstance(expr, basestring) for expr in exprs): + exprs = map(ParserElement._literalStringClass, exprs) + self.exprs = list(exprs) + else: + try: + self.exprs = list( exprs ) + except TypeError: + self.exprs = [ exprs ] + self.callPreparse = False + + def __getitem__( self, i ): + return self.exprs[i] + + def append( self, other ): + self.exprs.append( other ) + self.strRepr = None + return self + + def leaveWhitespace( self ): + """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on + all contained expressions.""" + self.skipWhitespace = False + self.exprs = [ e.copy() for e in self.exprs ] + for e in self.exprs: + e.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + else: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + return self + + def __str__( self ): + try: + return super(ParseExpression,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) + return self.strRepr + + def streamline( self ): + super(ParseExpression,self).streamline() + + for e in self.exprs: + e.streamline() + + # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) + # but only if there are no parse actions or resultsNames on the nested And's + # (likewise for Or's and MatchFirst's) + if ( len(self.exprs) == 2 ): + other = self.exprs[0] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = other.exprs[:] + [ self.exprs[1] ] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + other = self.exprs[-1] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = self.exprs[:-1] + other.exprs[:] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + self.errmsg = "Expected " + _ustr(self) + + return self + + def setResultsName( self, name, listAllMatches=False ): + ret = super(ParseExpression,self).setResultsName(name,listAllMatches) + return ret + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + for e in self.exprs: + e.validate(tmp) + self.checkRecursion( [] ) + + def copy(self): + ret = super(ParseExpression,self).copy() + ret.exprs = [e.copy() for e in self.exprs] + return ret + +class And(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found in the given order. + Expressions may be separated by whitespace. + May be constructed using the C{'+'} operator. + May also be constructed using the C{'-'} operator, which will suppress backtracking. + + Example:: + integer = Word(nums) + name_expr = OneOrMore(Word(alphas)) + + expr = And([integer("id"),name_expr("name"),integer("age")]) + # more easily written as: + expr = integer("id") + name_expr("name") + integer("age") + """ + + class _ErrorStop(Empty): + def __init__(self, *args, **kwargs): + super(And._ErrorStop,self).__init__(*args, **kwargs) + self.name = '-' + self.leaveWhitespace() + + def __init__( self, exprs, savelist = True ): + super(And,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.setWhitespaceChars( self.exprs[0].whiteChars ) + self.skipWhitespace = self.exprs[0].skipWhitespace + self.callPreparse = True + + def parseImpl( self, instring, loc, doActions=True ): + # pass False as last arg to _parse for first element, since we already + # pre-parsed the string as part of our And pre-parsing + loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) + errorStop = False + for e in self.exprs[1:]: + if isinstance(e, And._ErrorStop): + errorStop = True + continue + if errorStop: + try: + loc, exprtokens = e._parse( instring, loc, doActions ) + except ParseSyntaxException: + raise + except ParseBaseException as pe: + pe.__traceback__ = None + raise ParseSyntaxException._from_exception(pe) + except IndexError: + raise ParseSyntaxException(instring, len(instring), self.errmsg, self) + else: + loc, exprtokens = e._parse( instring, loc, doActions ) + if exprtokens or exprtokens.haskeys(): + resultlist += exprtokens + return loc, resultlist + + def __iadd__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #And( [ self, other ] ) + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + if not e.mayReturnEmpty: + break + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + +class Or(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the expression that matches the longest string will be used. + May be constructed using the C{'^'} operator. + + Example:: + # construct Or using '^' operator + + number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) + prints:: + [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(Or,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + matches = [] + for e in self.exprs: + try: + loc2 = e.tryParse( instring, loc ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + else: + # save match among all matches, to retry longest to shortest + matches.append((loc2, e)) + + if matches: + matches.sort(key=lambda x: -x[0]) + for _,e in matches: + try: + return e._parse( instring, loc, doActions ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + + def __ixor__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #Or( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class MatchFirst(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the first one listed is the one that will match. + May be constructed using the C{'|'} operator. + + Example:: + # construct MatchFirst using '|' operator + + # watch the order of expressions to match + number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] + + # put more selective expression first + number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) + print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(MatchFirst,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + for e in self.exprs: + try: + ret = e._parse( instring, loc, doActions ) + return ret + except ParseException as err: + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + + # only got here if no expression matched, raise exception for match that made it the furthest + else: + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + def __ior__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #MatchFirst( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class Each(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found, but in any order. + Expressions may be separated by whitespace. + May be constructed using the C{'&'} operator. + + Example:: + color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") + shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") + integer = Word(nums) + shape_attr = "shape:" + shape_type("shape") + posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") + color_attr = "color:" + color("color") + size_attr = "size:" + integer("size") + + # use Each (using operator '&') to accept attributes in any order + # (shape and posn are required, color and size are optional) + shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) + + shape_spec.runTests(''' + shape: SQUARE color: BLACK posn: 100, 120 + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + color:GREEN size:20 shape:TRIANGLE posn:20,40 + ''' + ) + prints:: + shape: SQUARE color: BLACK posn: 100, 120 + ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] + - color: BLACK + - posn: ['100', ',', '120'] + - x: 100 + - y: 120 + - shape: SQUARE + + + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] + - color: BLUE + - posn: ['50', ',', '80'] + - x: 50 + - y: 80 + - shape: CIRCLE + - size: 50 + + + color: GREEN size: 20 shape: TRIANGLE posn: 20,40 + ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] + - color: GREEN + - posn: ['20', ',', '40'] + - x: 20 + - y: 40 + - shape: TRIANGLE + - size: 20 + """ + def __init__( self, exprs, savelist = True ): + super(Each,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.skipWhitespace = True + self.initExprGroups = True + + def parseImpl( self, instring, loc, doActions=True ): + if self.initExprGroups: + self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) + opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] + opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] + self.optionals = opt1 + opt2 + self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] + self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] + self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] + self.required += self.multirequired + self.initExprGroups = False + tmpLoc = loc + tmpReqd = self.required[:] + tmpOpt = self.optionals[:] + matchOrder = [] + + keepMatching = True + while keepMatching: + tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired + failed = [] + for e in tmpExprs: + try: + tmpLoc = e.tryParse( instring, tmpLoc ) + except ParseException: + failed.append(e) + else: + matchOrder.append(self.opt1map.get(id(e),e)) + if e in tmpReqd: + tmpReqd.remove(e) + elif e in tmpOpt: + tmpOpt.remove(e) + if len(failed) == len(tmpExprs): + keepMatching = False + + if tmpReqd: + missing = ", ".join(_ustr(e) for e in tmpReqd) + raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) + + # add any unmatched Optionals, in case they have default values defined + matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] + + resultlist = [] + for e in matchOrder: + loc,results = e._parse(instring,loc,doActions) + resultlist.append(results) + + finalResults = sum(resultlist, ParseResults([])) + return loc, finalResults + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class ParseElementEnhance(ParserElement): + """ + Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. + """ + def __init__( self, expr, savelist=False ): + super(ParseElementEnhance,self).__init__(savelist) + if isinstance( expr, basestring ): + if issubclass(ParserElement._literalStringClass, Token): + expr = ParserElement._literalStringClass(expr) + else: + expr = ParserElement._literalStringClass(Literal(expr)) + self.expr = expr + self.strRepr = None + if expr is not None: + self.mayIndexError = expr.mayIndexError + self.mayReturnEmpty = expr.mayReturnEmpty + self.setWhitespaceChars( expr.whiteChars ) + self.skipWhitespace = expr.skipWhitespace + self.saveAsList = expr.saveAsList + self.callPreparse = expr.callPreparse + self.ignoreExprs.extend(expr.ignoreExprs) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr is not None: + return self.expr._parse( instring, loc, doActions, callPreParse=False ) + else: + raise ParseException("",loc,self.errmsg,self) + + def leaveWhitespace( self ): + self.skipWhitespace = False + self.expr = self.expr.copy() + if self.expr is not None: + self.expr.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + else: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + return self + + def streamline( self ): + super(ParseElementEnhance,self).streamline() + if self.expr is not None: + self.expr.streamline() + return self + + def checkRecursion( self, parseElementList ): + if self in parseElementList: + raise RecursiveGrammarException( parseElementList+[self] ) + subRecCheckList = parseElementList[:] + [ self ] + if self.expr is not None: + self.expr.checkRecursion( subRecCheckList ) + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion( [] ) + + def __str__( self ): + try: + return super(ParseElementEnhance,self).__str__() + except Exception: + pass + + if self.strRepr is None and self.expr is not None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) + return self.strRepr + + +class FollowedBy(ParseElementEnhance): + """ + Lookahead matching of the given parse expression. C{FollowedBy} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression matches at the current + position. C{FollowedBy} always returns a null token list. + + Example:: + # use FollowedBy to match a label only if it is followed by a ':' + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() + prints:: + [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] + """ + def __init__( self, expr ): + super(FollowedBy,self).__init__(expr) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + self.expr.tryParse( instring, loc ) + return loc, [] + + +class NotAny(ParseElementEnhance): + """ + Lookahead to disallow matching with the given parse expression. C{NotAny} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression does I{not} match at the current + position. Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny} + always returns a null token list. May be constructed using the '~' operator. + + Example:: + + """ + def __init__( self, expr ): + super(NotAny,self).__init__(expr) + #~ self.leaveWhitespace() + self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs + self.mayReturnEmpty = True + self.errmsg = "Found unwanted token, "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr.canParseNext(instring, loc): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "~{" + _ustr(self.expr) + "}" + + return self.strRepr + +class _MultipleMatch(ParseElementEnhance): + def __init__( self, expr, stopOn=None): + super(_MultipleMatch, self).__init__(expr) + self.saveAsList = True + ender = stopOn + if isinstance(ender, basestring): + ender = ParserElement._literalStringClass(ender) + self.not_ender = ~ender if ender is not None else None + + def parseImpl( self, instring, loc, doActions=True ): + self_expr_parse = self.expr._parse + self_skip_ignorables = self._skipIgnorables + check_ender = self.not_ender is not None + if check_ender: + try_not_ender = self.not_ender.tryParse + + # must be at least one (but first see if we are the stopOn sentinel; + # if so, fail) + if check_ender: + try_not_ender(instring, loc) + loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) + try: + hasIgnoreExprs = (not not self.ignoreExprs) + while 1: + if check_ender: + try_not_ender(instring, loc) + if hasIgnoreExprs: + preloc = self_skip_ignorables( instring, loc ) + else: + preloc = loc + loc, tmptokens = self_expr_parse( instring, preloc, doActions ) + if tmptokens or tmptokens.haskeys(): + tokens += tmptokens + except (ParseException,IndexError): + pass + + return loc, tokens + +class OneOrMore(_MultipleMatch): + """ + Repetition of one or more of the given expression. + + Parameters: + - expr - expression that must match one or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: BLACK" + OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] + + # use stopOn attribute for OneOrMore to avoid reading label string as part of the data + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] + + # could also be written as + (attr_expr * (1,)).parseString(text).pprint() + """ + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + _ustr(self.expr) + "}..." + + return self.strRepr + +class ZeroOrMore(_MultipleMatch): + """ + Optional repetition of zero or more of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example: similar to L{OneOrMore} + """ + def __init__( self, expr, stopOn=None): + super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) + except (ParseException,IndexError): + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]..." + + return self.strRepr + +class _NullToken(object): + def __bool__(self): + return False + __nonzero__ = __bool__ + def __str__(self): + return "" + +_optionalNotMatched = _NullToken() +class Optional(ParseElementEnhance): + """ + Optional matching of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - default (optional) - value to be returned if the optional expression is not found. + + Example:: + # US postal code can be a 5-digit zip, plus optional 4-digit qualifier + zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) + zip.runTests(''' + # traditional ZIP code + 12345 + + # ZIP+4 form + 12101-0001 + + # invalid ZIP + 98765- + ''') + prints:: + # traditional ZIP code + 12345 + ['12345'] + + # ZIP+4 form + 12101-0001 + ['12101-0001'] + + # invalid ZIP + 98765- + ^ + FAIL: Expected end of text (at char 5), (line:1, col:6) + """ + def __init__( self, expr, default=_optionalNotMatched ): + super(Optional,self).__init__( expr, savelist=False ) + self.saveAsList = self.expr.saveAsList + self.defaultValue = default + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) + except (ParseException,IndexError): + if self.defaultValue is not _optionalNotMatched: + if self.expr.resultsName: + tokens = ParseResults([ self.defaultValue ]) + tokens[self.expr.resultsName] = self.defaultValue + else: + tokens = [ self.defaultValue ] + else: + tokens = [] + return loc, tokens + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]" + + return self.strRepr + +class SkipTo(ParseElementEnhance): + """ + Token for skipping over all undefined text until the matched expression is found. + + Parameters: + - expr - target expression marking the end of the data to be skipped + - include - (default=C{False}) if True, the target expression is also parsed + (the skipped text and target expression are returned as a 2-element list). + - ignore - (default=C{None}) used to define grammars (typically quoted strings and + comments) that might contain false matches to the target expression + - failOn - (default=C{None}) define expressions that are not allowed to be + included in the skipped test; if found before the target expression is found, + the SkipTo is not a match + + Example:: + report = ''' + Outstanding Issues Report - 1 Jan 2000 + + # | Severity | Description | Days Open + -----+----------+-------------------------------------------+----------- + 101 | Critical | Intermittent system crash | 6 + 94 | Cosmetic | Spelling error on Login ('log|n') | 14 + 79 | Minor | System slow when running too many reports | 47 + ''' + integer = Word(nums) + SEP = Suppress('|') + # use SkipTo to simply match everything up until the next SEP + # - ignore quoted strings, so that a '|' character inside a quoted string does not match + # - parse action will call token.strip() for each matched token, i.e., the description body + string_data = SkipTo(SEP, ignore=quotedString) + string_data.setParseAction(tokenMap(str.strip)) + ticket_expr = (integer("issue_num") + SEP + + string_data("sev") + SEP + + string_data("desc") + SEP + + integer("days_open")) + + for tkt in ticket_expr.searchString(report): + print tkt.dump() + prints:: + ['101', 'Critical', 'Intermittent system crash', '6'] + - days_open: 6 + - desc: Intermittent system crash + - issue_num: 101 + - sev: Critical + ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] + - days_open: 14 + - desc: Spelling error on Login ('log|n') + - issue_num: 94 + - sev: Cosmetic + ['79', 'Minor', 'System slow when running too many reports', '47'] + - days_open: 47 + - desc: System slow when running too many reports + - issue_num: 79 + - sev: Minor + """ + def __init__( self, other, include=False, ignore=None, failOn=None ): + super( SkipTo, self ).__init__( other ) + self.ignoreExpr = ignore + self.mayReturnEmpty = True + self.mayIndexError = False + self.includeMatch = include + self.asList = False + if isinstance(failOn, basestring): + self.failOn = ParserElement._literalStringClass(failOn) + else: + self.failOn = failOn + self.errmsg = "No match found for "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + startloc = loc + instrlen = len(instring) + expr = self.expr + expr_parse = self.expr._parse + self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None + self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None + + tmploc = loc + while tmploc <= instrlen: + if self_failOn_canParseNext is not None: + # break if failOn expression matches + if self_failOn_canParseNext(instring, tmploc): + break + + if self_ignoreExpr_tryParse is not None: + # advance past ignore expressions + while 1: + try: + tmploc = self_ignoreExpr_tryParse(instring, tmploc) + except ParseBaseException: + break + + try: + expr_parse(instring, tmploc, doActions=False, callPreParse=False) + except (ParseException, IndexError): + # no match, advance loc in string + tmploc += 1 + else: + # matched skipto expr, done + break + + else: + # ran off the end of the input string without matching skipto expr, fail + raise ParseException(instring, loc, self.errmsg, self) + + # build up return values + loc = tmploc + skiptext = instring[startloc:loc] + skipresult = ParseResults(skiptext) + + if self.includeMatch: + loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) + skipresult += mat + + return loc, skipresult + +class Forward(ParseElementEnhance): + """ + Forward declaration of an expression to be defined later - + used for recursive grammars, such as algebraic infix notation. + When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. + + Note: take care when assigning to C{Forward} not to overlook precedence of operators. + Specifically, '|' has a lower precedence than '<<', so that:: + fwdExpr << a | b | c + will actually be evaluated as:: + (fwdExpr << a) | b | c + thereby leaving b and c out as parseable alternatives. It is recommended that you + explicitly group the values inserted into the C{Forward}:: + fwdExpr << (a | b | c) + Converting to use the '<<=' operator instead will avoid this problem. + + See L{ParseResults.pprint} for an example of a recursive parser created using + C{Forward}. + """ + def __init__( self, other=None ): + super(Forward,self).__init__( other, savelist=False ) + + def __lshift__( self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass(other) + self.expr = other + self.strRepr = None + self.mayIndexError = self.expr.mayIndexError + self.mayReturnEmpty = self.expr.mayReturnEmpty + self.setWhitespaceChars( self.expr.whiteChars ) + self.skipWhitespace = self.expr.skipWhitespace + self.saveAsList = self.expr.saveAsList + self.ignoreExprs.extend(self.expr.ignoreExprs) + return self + + def __ilshift__(self, other): + return self << other + + def leaveWhitespace( self ): + self.skipWhitespace = False + return self + + def streamline( self ): + if not self.streamlined: + self.streamlined = True + if self.expr is not None: + self.expr.streamline() + return self + + def validate( self, validateTrace=[] ): + if self not in validateTrace: + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion([]) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + return self.__class__.__name__ + ": ..." + + # stubbed out for now - creates awful memory and perf issues + self._revertClass = self.__class__ + self.__class__ = _ForwardNoRecurse + try: + if self.expr is not None: + retString = _ustr(self.expr) + else: + retString = "None" + finally: + self.__class__ = self._revertClass + return self.__class__.__name__ + ": " + retString + + def copy(self): + if self.expr is not None: + return super(Forward,self).copy() + else: + ret = Forward() + ret <<= self + return ret + +class _ForwardNoRecurse(Forward): + def __str__( self ): + return "..." + +class TokenConverter(ParseElementEnhance): + """ + Abstract subclass of C{ParseExpression}, for converting parsed results. + """ + def __init__( self, expr, savelist=False ): + super(TokenConverter,self).__init__( expr )#, savelist ) + self.saveAsList = False + +class Combine(TokenConverter): + """ + Converter to concatenate all matching tokens to a single string. + By default, the matching patterns must also be contiguous in the input string; + this can be disabled by specifying C{'adjacent=False'} in the constructor. + + Example:: + real = Word(nums) + '.' + Word(nums) + print(real.parseString('3.1416')) # -> ['3', '.', '1416'] + # will also erroneously match the following + print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] + + real = Combine(Word(nums) + '.' + Word(nums)) + print(real.parseString('3.1416')) # -> ['3.1416'] + # no match when there are internal spaces + print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) + """ + def __init__( self, expr, joinString="", adjacent=True ): + super(Combine,self).__init__( expr ) + # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself + if adjacent: + self.leaveWhitespace() + self.adjacent = adjacent + self.skipWhitespace = True + self.joinString = joinString + self.callPreparse = True + + def ignore( self, other ): + if self.adjacent: + ParserElement.ignore(self, other) + else: + super( Combine, self).ignore( other ) + return self + + def postParse( self, instring, loc, tokenlist ): + retToks = tokenlist.copy() + del retToks[:] + retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) + + if self.resultsName and retToks.haskeys(): + return [ retToks ] + else: + return retToks + +class Group(TokenConverter): + """ + Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions. + + Example:: + ident = Word(alphas) + num = Word(nums) + term = ident | num + func = ident + Optional(delimitedList(term)) + print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] + + func = ident + Group(Optional(delimitedList(term))) + print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] + """ + def __init__( self, expr ): + super(Group,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + return [ tokenlist ] + +class Dict(TokenConverter): + """ + Converter to return a repetitive expression as a list, but also as a dictionary. + Each element can also be referenced using the first token in the expression as its key. + Useful for tabular report scraping when the first column can be used as a item key. + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + # print attributes as plain groups + print(OneOrMore(attr_expr).parseString(text).dump()) + + # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names + result = Dict(OneOrMore(Group(attr_expr))).parseString(text) + print(result.dump()) + + # access named fields as dict entries, or output as dict + print(result['shape']) + print(result.asDict()) + prints:: + ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] + + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} + See more examples at L{ParseResults} of accessing fields by results name. + """ + def __init__( self, expr ): + super(Dict,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + for i,tok in enumerate(tokenlist): + if len(tok) == 0: + continue + ikey = tok[0] + if isinstance(ikey,int): + ikey = _ustr(tok[0]).strip() + if len(tok)==1: + tokenlist[ikey] = _ParseResultsWithOffset("",i) + elif len(tok)==2 and not isinstance(tok[1],ParseResults): + tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) + else: + dictvalue = tok.copy() #ParseResults(i) + del dictvalue[0] + if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) + else: + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) + + if self.resultsName: + return [ tokenlist ] + else: + return tokenlist + + +class Suppress(TokenConverter): + """ + Converter for ignoring the results of a parsed expression. + + Example:: + source = "a, b, c,d" + wd = Word(alphas) + wd_list1 = wd + ZeroOrMore(',' + wd) + print(wd_list1.parseString(source)) + + # often, delimiters that are useful during parsing are just in the + # way afterward - use Suppress to keep them out of the parsed output + wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) + print(wd_list2.parseString(source)) + prints:: + ['a', ',', 'b', ',', 'c', ',', 'd'] + ['a', 'b', 'c', 'd'] + (See also L{delimitedList}.) + """ + def postParse( self, instring, loc, tokenlist ): + return [] + + def suppress( self ): + return self + + +class OnlyOnce(object): + """ + Wrapper for parse actions, to ensure they are only called once. + """ + def __init__(self, methodCall): + self.callable = _trim_arity(methodCall) + self.called = False + def __call__(self,s,l,t): + if not self.called: + results = self.callable(s,l,t) + self.called = True + return results + raise ParseException(s,l,"") + def reset(self): + self.called = False + +def traceParseAction(f): + """ + Decorator for debugging parse actions. + + When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".} + When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised. + + Example:: + wd = Word(alphas) + + @traceParseAction + def remove_duplicate_chars(tokens): + return ''.join(sorted(set(''.join(tokens)))) + + wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) + print(wds.parseString("slkdjs sld sldd sdlf sdljf")) + prints:: + >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) + <<leaving remove_duplicate_chars (ret: 'dfjkls') + ['dfjkls'] + """ + f = _trim_arity(f) + def z(*paArgs): + thisFunc = f.__name__ + s,l,t = paArgs[-3:] + if len(paArgs)>3: + thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc + sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) + try: + ret = f(*paArgs) + except Exception as exc: + sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) + raise + sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) + return ret + try: + z.__name__ = f.__name__ + except AttributeError: + pass + return z + +# +# global helpers +# +def delimitedList( expr, delim=",", combine=False ): + """ + Helper to define a delimited list of expressions - the delimiter defaults to ','. + By default, the list elements and delimiters can have intervening whitespace, and + comments, but this can be overridden by passing C{combine=True} in the constructor. + If C{combine} is set to C{True}, the matching tokens are returned as a single token + string, with the delimiters included; otherwise, the matching tokens are returned + as a list of tokens, with the delimiters suppressed. + + Example:: + delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] + delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] + """ + dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." + if combine: + return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) + else: + return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) + +def countedArray( expr, intExpr=None ): + """ + Helper to define a counted list of expressions. + This helper defines a pattern of the form:: + integer expr expr expr... + where the leading integer tells how many expr expressions follow. + The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. + + If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value. + + Example:: + countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] + + # in this parser, the leading integer value is given in binary, + # '10' indicating that 2 values are in the array + binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) + countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] + """ + arrayExpr = Forward() + def countFieldParseAction(s,l,t): + n = t[0] + arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) + return [] + if intExpr is None: + intExpr = Word(nums).setParseAction(lambda t:int(t[0])) + else: + intExpr = intExpr.copy() + intExpr.setName("arrayLen") + intExpr.addParseAction(countFieldParseAction, callDuringTry=True) + return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') + +def _flatten(L): + ret = [] + for i in L: + if isinstance(i,list): + ret.extend(_flatten(i)) + else: + ret.append(i) + return ret + +def matchPreviousLiteral(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousLiteral(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches a + previous literal, will also match the leading C{"1:1"} in C{"1:10"}. + If this is not desired, use C{matchPreviousExpr}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + def copyTokenToRepeater(s,l,t): + if t: + if len(t) == 1: + rep << t[0] + else: + # flatten t tokens + tflat = _flatten(t.asList()) + rep << And(Literal(tt) for tt in tflat) + else: + rep << Empty() + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def matchPreviousExpr(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousExpr(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches by + expressions, will I{not} match the leading C{"1:1"} in C{"1:10"}; + the expressions are evaluated first, and then compared, so + C{"1"} is compared with C{"10"}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + e2 = expr.copy() + rep <<= e2 + def copyTokenToRepeater(s,l,t): + matchTokens = _flatten(t.asList()) + def mustMatchTheseTokens(s,l,t): + theseTokens = _flatten(t.asList()) + if theseTokens != matchTokens: + raise ParseException("",0,"") + rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def _escapeRegexRangeChars(s): + #~ escape these chars: ^-] + for c in r"\^-]": + s = s.replace(c,_bslash+c) + s = s.replace("\n",r"\n") + s = s.replace("\t",r"\t") + return _ustr(s) + +def oneOf( strs, caseless=False, useRegex=True ): + """ + Helper to quickly define a set of alternative Literals, and makes sure to do + longest-first testing when there is a conflict, regardless of the input order, + but returns a C{L{MatchFirst}} for best performance. + + Parameters: + - strs - a string of space-delimited literals, or a collection of string literals + - caseless - (default=C{False}) - treat all literals as caseless + - useRegex - (default=C{True}) - as an optimization, will generate a Regex + object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or + if creating a C{Regex} raises an exception) + + Example:: + comp_oper = oneOf("< = > <= >= !=") + var = Word(alphas) + number = Word(nums) + term = var | number + comparison_expr = term + comp_oper + term + print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) + prints:: + [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] + """ + if caseless: + isequal = ( lambda a,b: a.upper() == b.upper() ) + masks = ( lambda a,b: b.upper().startswith(a.upper()) ) + parseElementClass = CaselessLiteral + else: + isequal = ( lambda a,b: a == b ) + masks = ( lambda a,b: b.startswith(a) ) + parseElementClass = Literal + + symbols = [] + if isinstance(strs,basestring): + symbols = strs.split() + elif isinstance(strs, Iterable): + symbols = list(strs) + else: + warnings.warn("Invalid argument to oneOf, expected string or iterable", + SyntaxWarning, stacklevel=2) + if not symbols: + return NoMatch() + + i = 0 + while i < len(symbols)-1: + cur = symbols[i] + for j,other in enumerate(symbols[i+1:]): + if ( isequal(other, cur) ): + del symbols[i+j+1] + break + elif ( masks(cur, other) ): + del symbols[i+j+1] + symbols.insert(i,other) + cur = other + break + else: + i += 1 + + if not caseless and useRegex: + #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) + try: + if len(symbols)==len("".join(symbols)): + return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) + else: + return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) + except Exception: + warnings.warn("Exception creating Regex for oneOf, building MatchFirst", + SyntaxWarning, stacklevel=2) + + + # last resort, just use MatchFirst + return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) + +def dictOf( key, value ): + """ + Helper to easily and clearly define a dictionary by specifying the respective patterns + for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens + in the proper order. The key pattern can include delimiting markers or punctuation, + as long as they are suppressed, thereby leaving the significant key text. The value + pattern can include named results, so that the C{Dict} results can include named token + fields. + + Example:: + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + print(OneOrMore(attr_expr).parseString(text).dump()) + + attr_label = label + attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) + + # similar to Dict, but simpler call format + result = dictOf(attr_label, attr_value).parseString(text) + print(result.dump()) + print(result['shape']) + print(result.shape) # object attribute access works too + print(result.asDict()) + prints:: + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + SQUARE + {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} + """ + return Dict( ZeroOrMore( Group ( key + value ) ) ) + +def originalTextFor(expr, asString=True): + """ + Helper to return the original, untokenized text for a given expression. Useful to + restore the parsed fields of an HTML start tag into the raw tag text itself, or to + revert separate tokens with intervening whitespace back to the original matching + input text. By default, returns astring containing the original parsed text. + + If the optional C{asString} argument is passed as C{False}, then the return value is a + C{L{ParseResults}} containing any results names that were originally matched, and a + single token containing the original matched text from the input string. So if + the expression passed to C{L{originalTextFor}} contains expressions with defined + results names, you must set C{asString} to C{False} if you want to preserve those + results name values. + + Example:: + src = "this is test <b> bold <i>text</i> </b> normal text " + for tag in ("b","i"): + opener,closer = makeHTMLTags(tag) + patt = originalTextFor(opener + SkipTo(closer) + closer) + print(patt.searchString(src)[0]) + prints:: + ['<b> bold <i>text</i> </b>'] + ['<i>text</i>'] + """ + locMarker = Empty().setParseAction(lambda s,loc,t: loc) + endlocMarker = locMarker.copy() + endlocMarker.callPreparse = False + matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") + if asString: + extractText = lambda s,l,t: s[t._original_start:t._original_end] + else: + def extractText(s,l,t): + t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] + matchExpr.setParseAction(extractText) + matchExpr.ignoreExprs = expr.ignoreExprs + return matchExpr + +def ungroup(expr): + """ + Helper to undo pyparsing's default grouping of And expressions, even + if all but one are non-empty. + """ + return TokenConverter(expr).setParseAction(lambda t:t[0]) + +def locatedExpr(expr): + """ + Helper to decorate a returned token with its starting and ending locations in the input string. + This helper adds the following results names: + - locn_start = location where matched expression begins + - locn_end = location where matched expression ends + - value = the actual parsed results + + Be careful if the input text contains C{<TAB>} characters, you may want to call + C{L{ParserElement.parseWithTabs}} + + Example:: + wd = Word(alphas) + for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): + print(match) + prints:: + [[0, 'ljsdf', 5]] + [[8, 'lksdjjf', 15]] + [[18, 'lkkjj', 23]] + """ + locator = Empty().setParseAction(lambda s,l,t: l) + return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) + + +# convenience constants for positional expressions +empty = Empty().setName("empty") +lineStart = LineStart().setName("lineStart") +lineEnd = LineEnd().setName("lineEnd") +stringStart = StringStart().setName("stringStart") +stringEnd = StringEnd().setName("stringEnd") + +_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) +_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) +_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) +_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | 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 C{\-} or C{\]}) + - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) + (C{\0x##} is also supported for backwards compatibility) + - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character) + - a range of any of the above, separated by a dash (C{'a-z'}, etc.) + - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.) + """ + _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) + try: + return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) + except Exception: + return "" + +def matchOnlyAtCol(n): + """ + Helper method for defining parse actions that require matching at a specific + column in the input text. + """ + def verifyCol(strg,locn,toks): + if col(locn,strg) != n: + raise ParseException(strg,locn,"matched token not at column %d" % n) + return verifyCol + +def replaceWith(replStr): + """ + Helper method for common parse actions that simply return a literal value. Especially + useful when used with C{L{transformString<ParserElement.transformString>}()}. + + Example:: + num = Word(nums).setParseAction(lambda toks: int(toks[0])) + na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) + term = na | num + + OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] + """ + return lambda s,l,t: [replStr] + +def removeQuotes(s,l,t): + """ + Helper parse action for removing quotation marks from parsed quoted strings. + + Example:: + # by default, quotation marks are included in parsed results + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] + + # use removeQuotes to strip quotation marks from parsed results + quotedString.setParseAction(removeQuotes) + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] + """ + return t[0][1:-1] + +def tokenMap(func, *args): + """ + Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional + args are passed, they are forwarded to the given function as additional arguments after + the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the + parsed data to an integer using base 16. + + Example (compare the last to example in L{ParserElement.transformString}:: + hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) + hex_ints.runTests(''' + 00 11 22 aa FF 0a 0d 1a + ''') + + upperword = Word(alphas).setParseAction(tokenMap(str.upper)) + OneOrMore(upperword).runTests(''' + my kingdom for a horse + ''') + + wd = Word(alphas).setParseAction(tokenMap(str.title)) + OneOrMore(wd).setParseAction(' '.join).runTests(''' + now is the winter of our discontent made glorious summer by this sun of york + ''') + prints:: + 00 11 22 aa FF 0a 0d 1a + [0, 17, 34, 170, 255, 10, 13, 26] + + my kingdom for a horse + ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] + + now is the winter of our discontent made glorious summer by this sun of york + ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] + """ + def pa(s,l,t): + return [func(tokn, *args) for tokn in t] + + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + pa.__name__ = func_name + + return pa + +upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) +"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}""" + +downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) +"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}""" + +def _makeTags(tagStr, xml): + """Internal helper to construct opening and closing tag expressions, given a tag name""" + if isinstance(tagStr,basestring): + resname = tagStr + tagStr = Keyword(tagStr, caseless=not xml) + else: + resname = tagStr.name + + tagAttrName = Word(alphas,alphanums+"_-:") + if (xml): + tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + else: + printablesLessRAbrack = "".join(c for c in printables if c not in ">") + tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ + Optional( Suppress("=") + tagAttrValue ) ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + closeTag = Combine(_L("</") + tagStr + ">") + + openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) + closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) + openTag.tag = resname + closeTag.tag = resname + return openTag, closeTag + +def makeHTMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches + tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values. + + Example:: + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple + a,a_end = makeHTMLTags("A") + link_expr = a + SkipTo(a_end)("link_text") + a_end + + for link in link_expr.searchString(text): + # attributes in the <A> tag (like "href" shown here) are also accessible as named results + print(link.link_text, '->', link.href) + prints:: + pyparsing -> http://pyparsing.wikispaces.com + """ + return _makeTags( tagStr, False ) + +def makeXMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for XML, given a tag name. Matches + tags only in the given upper/lower case. + + Example: similar to L{makeHTMLTags} + """ + return _makeTags( tagStr, True ) + +def withAttribute(*args,**attrDict): + """ + Helper to create a validating parse action to be used with start tags created + with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag + with a required attribute value, to avoid false matches on common tags such as + C{<TD>} or C{<DIV>}. + + Call C{withAttribute} with a series of attribute names and values. Specify the list + of filter attributes names and values as: + - keyword arguments, as in C{(align="right")}, or + - as an explicit dict with C{**} operator, when an attribute name is also a Python + reserved word, as in C{**{"class":"Customer", "align":"right"}} + - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) + For attribute names with a namespace prefix, you must use the second form. Attribute + names are matched insensitive to upper/lower case. + + If just testing for C{class} (with or without a namespace), use C{L{withClass}}. + + To verify that the attribute exists, but without specifying a value, pass + C{withAttribute.ANY_VALUE} as the value. + + Example:: + html = ''' + <div> + Some text + <div type="grid">1 4 0 1 0</div> + <div type="graph">1,3 2,3 1,1</div> + <div>this has no type</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + + # only match div tag having a type attribute with value "grid" + div_grid = div().setParseAction(withAttribute(type="grid")) + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + # construct a match with any div tag having a type attribute, regardless of the value + div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + if args: + attrs = args[:] + else: + attrs = attrDict.items() + attrs = [(k,v) for k,v in attrs] + def pa(s,l,tokens): + for attrName,attrValue in attrs: + if attrName not in tokens: + raise ParseException(s,l,"no matching attribute " + attrName) + if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: + raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % + (attrName, tokens[attrName], attrValue)) + return pa +withAttribute.ANY_VALUE = object() + +def withClass(classname, namespace=''): + """ + Simplified version of C{L{withAttribute}} when matching on a div class - made + difficult because C{class} is a reserved word in Python. + + Example:: + html = ''' + <div> + Some text + <div class="grid">1 4 0 1 0</div> + <div class="graph">1,3 2,3 1,1</div> + <div>this <div> has no class</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + div_grid = div().setParseAction(withClass("grid")) + + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + classattr = "%s:class" % namespace if namespace else "class" + return withAttribute(**{classattr : classname}) + +opAssoc = _Constants() +opAssoc.LEFT = object() +opAssoc.RIGHT = object() + +def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): + """ + Helper method for constructing grammars of expressions made up of + operators working in a precedence hierarchy. Operators may be unary or + binary, left- or right-associative. Parse actions can also be attached + to operator expressions. The generated parser will also recognize the use + of parentheses to override operator precedences (see example below). + + Note: if you define a deep operator list, you may see performance issues + when using infixNotation. See L{ParserElement.enablePackrat} for a + mechanism to potentially improve your parser performance. + + Parameters: + - baseExpr - expression representing the most basic element for the nested + - opList - list of tuples, one for each operator precedence level in the + expression grammar; each tuple is of the form + (opExpr, numTerms, rightLeftAssoc, parseAction), where: + - opExpr is the pyparsing expression for the operator; + may also be a string, which will be converted to a Literal; + if numTerms is 3, opExpr is a tuple of two expressions, for the + two operators separating the 3 terms + - numTerms is the number of terms for this operator (must + be 1, 2, or 3) + - rightLeftAssoc is the indicator whether the operator is + right or left associative, using the pyparsing-defined + constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. + - parseAction is the parse action to be associated with + expressions matching this operator expression (the + parse action tuple member may be omitted); if the parse action + is passed a tuple or list of functions, this is equivalent to + calling C{setParseAction(*fn)} (L{ParserElement.setParseAction}) + - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) + - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) + + Example:: + # simple example of four-function arithmetic with ints and variable names + integer = pyparsing_common.signed_integer + varname = pyparsing_common.identifier + + arith_expr = infixNotation(integer | varname, + [ + ('-', 1, opAssoc.RIGHT), + (oneOf('* /'), 2, opAssoc.LEFT), + (oneOf('+ -'), 2, opAssoc.LEFT), + ]) + + arith_expr.runTests(''' + 5+3*6 + (5+3)*6 + -2--11 + ''', fullDump=False) + prints:: + 5+3*6 + [[5, '+', [3, '*', 6]]] + + (5+3)*6 + [[[5, '+', 3], '*', 6]] + + -2--11 + [[['-', 2], '-', ['-', 11]]] + """ + ret = Forward() + lastExpr = baseExpr | ( lpar + ret + rpar ) + for i,operDef in enumerate(opList): + opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] + termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr + if arity == 3: + if opExpr is None or len(opExpr) != 2: + raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") + opExpr1, opExpr2 = opExpr + thisExpr = Forward().setName(termName) + if rightLeftAssoc == opAssoc.LEFT: + if arity == 1: + matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) + else: + matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ + Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + elif rightLeftAssoc == opAssoc.RIGHT: + if arity == 1: + # try to avoid LR with this extra test + if not isinstance(opExpr, Optional): + opExpr = Optional(opExpr) + matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) + else: + matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ + Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + else: + raise ValueError("operator must indicate right or left associativity") + if pa: + if isinstance(pa, (tuple, list)): + matchExpr.setParseAction(*pa) + else: + matchExpr.setParseAction(pa) + thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) + lastExpr = thisExpr + ret <<= lastExpr + return ret + +operatorPrecedence = infixNotation +"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release.""" + +dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") +sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") +quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| + Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") +unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") + +def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): + """ + Helper method for defining nested lists enclosed in opening and closing + delimiters ("(" and ")" are the default). + + Parameters: + - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression + - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression + - content - expression for items within the nested lists (default=C{None}) + - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) + + If an expression is not provided for the content argument, the nested + expression will capture all whitespace-delimited content between delimiters + as a list of separate values. + + Use the C{ignoreExpr} argument to define expressions that may contain + opening or closing characters that should not be treated as opening + or closing characters for nesting, such as quotedString or a comment + expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. + The default is L{quotedString}, but if no expressions are to be ignored, + then pass C{None} for this argument. + + Example:: + data_type = oneOf("void int short long char float double") + decl_data_type = Combine(data_type + Optional(Word('*'))) + ident = Word(alphas+'_', alphanums+'_') + number = pyparsing_common.number + arg = Group(decl_data_type + ident) + LPAR,RPAR = map(Suppress, "()") + + code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) + + c_function = (decl_data_type("type") + + ident("name") + + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + + code_body("body")) + c_function.ignore(cStyleComment) + + source_code = ''' + int is_odd(int x) { + return (x%2); + } + + int dec_to_hex(char hchar) { + if (hchar >= '0' && hchar <= '9') { + return (ord(hchar)-ord('0')); + } else { + return (10+ord(hchar)-ord('A')); + } + } + ''' + for func in c_function.searchString(source_code): + print("%(name)s (%(type)s) args: %(args)s" % func) + + prints:: + is_odd (int) args: [['int', 'x']] + dec_to_hex (int) args: [['char', 'hchar']] + """ + if opener == closer: + raise ValueError("opening and closing strings cannot be the same") + if content is None: + if isinstance(opener,basestring) and isinstance(closer,basestring): + if len(opener) == 1 and len(closer)==1: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS + ).setParseAction(lambda t:t[0].strip())) + else: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + ~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + raise ValueError("opening and closing arguments must be strings if no content expression is given") + ret = Forward() + if ignoreExpr is not None: + ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) + else: + ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) + ret.setName('nested %s%s expression' % (opener,closer)) + return ret + +def indentedBlock(blockStatementExpr, indentStack, indent=True): + """ + Helper method for defining space-delimited indentation blocks, such as + those used to define block statements in Python source code. + + Parameters: + - blockStatementExpr - expression defining syntax of statement that + is repeated within the indented block + - indentStack - list created by caller to manage indentation stack + (multiple statementWithIndentedBlock expressions within a single grammar + should share a common indentStack) + - indent - boolean indicating whether block must be indented beyond the + the current level; set to False for block of left-most statements + (default=C{True}) + + A valid block must contain at least one C{blockStatement}. + + Example:: + data = ''' + def A(z): + A1 + B = 100 + G = A2 + A2 + A3 + B + def BB(a,b,c): + BB1 + def BBA(): + bba1 + bba2 + bba3 + C + D + def spam(x,y): + def eggs(z): + pass + ''' + + + indentStack = [1] + stmt = Forward() + + identifier = Word(alphas, alphanums) + funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") + func_body = indentedBlock(stmt, indentStack) + funcDef = Group( funcDecl + func_body ) + + rvalue = Forward() + funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") + rvalue << (funcCall | identifier | Word(nums)) + assignment = Group(identifier + "=" + rvalue) + stmt << ( funcDef | assignment | identifier ) + + module_body = OneOrMore(stmt) + + parseTree = module_body.parseString(data) + parseTree.pprint() + prints:: + [['def', + 'A', + ['(', 'z', ')'], + ':', + [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], + 'B', + ['def', + 'BB', + ['(', 'a', 'b', 'c', ')'], + ':', + [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], + 'C', + 'D', + ['def', + 'spam', + ['(', 'x', 'y', ')'], + ':', + [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] + """ + def checkPeerIndent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if curCol != indentStack[-1]: + if curCol > indentStack[-1]: + raise ParseFatalException(s,l,"illegal nesting") + raise ParseException(s,l,"not a peer entry") + + def checkSubIndent(s,l,t): + curCol = col(l,s) + if curCol > indentStack[-1]: + indentStack.append( curCol ) + else: + raise ParseException(s,l,"not a subentry") + + def checkUnindent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): + raise ParseException(s,l,"not an unindent") + indentStack.pop() + + NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) + INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') + PEER = Empty().setParseAction(checkPeerIndent).setName('') + UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') + if indent: + smExpr = Group( Optional(NL) + + #~ FollowedBy(blockStatementExpr) + + INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) + else: + smExpr = Group( Optional(NL) + + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) + blockStatementExpr.ignore(_bslash + LineEnd()) + return smExpr.setName('indented block') + +alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") +punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") + +anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) +_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) +commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") +def replaceHTMLEntity(t): + """Helper parser action to replace common HTML entities with their special characters""" + return _htmlEntityMap.get(t.entity) + +# it's easy to get these comment structures wrong - they're very common, so may as well make them available +cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") +"Comment of the form C{/* ... */}" + +htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") +"Comment of the form C{<!-- ... -->}" + +restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") +dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") +"Comment of the form C{// ... (to end of line)}" + +cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") +"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}" + +javaStyleComment = cppStyleComment +"Same as C{L{cppStyleComment}}" + +pythonStyleComment = Regex(r"#.*").setName("Python style comment") +"Comment of the form C{# ... (to end of line)}" + +_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + + Optional( Word(" \t") + + ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") +commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") +"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas. + This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}.""" + +# some other useful expressions - using lower-case class name since we are really using this as a namespace +class pyparsing_common: + """ + Here are some common low-level expressions that may be useful in jump-starting parser development: + - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>}) + - common L{programming identifiers<identifier>} + - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>}) + - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>} + - L{UUID<uuid>} + - L{comma-separated list<comma_separated_list>} + Parse actions: + - C{L{convertToInteger}} + - C{L{convertToFloat}} + - C{L{convertToDate}} + - C{L{convertToDatetime}} + - C{L{stripHTMLTags}} + - C{L{upcaseTokens}} + - C{L{downcaseTokens}} + + Example:: + pyparsing_common.number.runTests(''' + # any int or real number, returned as the appropriate type + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.fnumber.runTests(''' + # any int or real number, returned as float + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.hex_integer.runTests(''' + # hex numbers + 100 + FF + ''') + + pyparsing_common.fraction.runTests(''' + # fractions + 1/2 + -3/4 + ''') + + pyparsing_common.mixed_integer.runTests(''' + # mixed fractions + 1 + 1/2 + -3/4 + 1-3/4 + ''') + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(''' + # uuid + 12345678-1234-5678-1234-567812345678 + ''') + prints:: + # any int or real number, returned as the appropriate type + 100 + [100] + + -100 + [-100] + + +100 + [100] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # any int or real number, returned as float + 100 + [100.0] + + -100 + [-100.0] + + +100 + [100.0] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # hex numbers + 100 + [256] + + FF + [255] + + # fractions + 1/2 + [0.5] + + -3/4 + [-0.75] + + # mixed fractions + 1 + [1] + + 1/2 + [0.5] + + -3/4 + [-0.75] + + 1-3/4 + [1.75] + + # uuid + 12345678-1234-5678-1234-567812345678 + [UUID('12345678-1234-5678-1234-567812345678')] + """ + + convertToInteger = tokenMap(int) + """ + Parse action for converting parsed integers to Python int + """ + + convertToFloat = tokenMap(float) + """ + Parse action for converting parsed numbers to Python float + """ + + integer = Word(nums).setName("integer").setParseAction(convertToInteger) + """expression that parses an unsigned integer, returns an int""" + + hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) + """expression that parses a hexadecimal integer, returns an int""" + + signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) + """expression that parses an integer with optional leading sign, returns an int""" + + fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") + """fractional expression of an integer divided by an integer, returns a float""" + fraction.addParseAction(lambda t: t[0]/t[-1]) + + mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") + """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" + mixed_integer.addParseAction(sum) + + real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) + """expression that parses a floating point number and returns a float""" + + sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) + """expression that parses a floating point number with optional scientific notation and returns a float""" + + # streamlining this expression makes the docs nicer-looking + number = (sci_real | real | signed_integer).streamline() + """any numeric expression, returns the corresponding Python type""" + + fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) + """any int or real number, returned as float""" + + identifier = Word(alphas+'_', alphanums+'_').setName("identifier") + """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" + + ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") + "IPv4 address (C{0.0.0.0 - 255.255.255.255})" + + _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") + _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") + _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") + _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) + _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") + ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") + "IPv6 address (long, short, or mixed form)" + + mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") + "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" + + @staticmethod + def convertToDate(fmt="%Y-%m-%d"): + """ + Helper to create a parse action for converting parsed date string to Python datetime.date + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) + + Example:: + date_expr = pyparsing_common.iso8601_date.copy() + date_expr.setParseAction(pyparsing_common.convertToDate()) + print(date_expr.parseString("1999-12-31")) + prints:: + [datetime.date(1999, 12, 31)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt).date() + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + @staticmethod + def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): + """ + Helper to create a parse action for converting parsed datetime string to Python datetime.datetime + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) + + Example:: + dt_expr = pyparsing_common.iso8601_datetime.copy() + dt_expr.setParseAction(pyparsing_common.convertToDatetime()) + print(dt_expr.parseString("1999-12-31T23:59:59.999")) + prints:: + [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt) + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") + "ISO8601 date (C{yyyy-mm-dd})" + + iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") + "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}" + + uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") + "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})" + + _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() + @staticmethod + def stripHTMLTags(s, l, tokens): + """ + Parse action to remove HTML tags from web page HTML source + + Example:: + # strip HTML links from normal text + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + td,td_end = makeHTMLTags("TD") + table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end + + print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' + """ + return pyparsing_common._html_stripper.transformString(tokens[0]) + + _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') + + Optional( White(" \t") ) ) ).streamline().setName("commaItem") + comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") + """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" + + upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) + """Parse action to convert tokens to upper case.""" + + downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) + """Parse action to convert tokens to lower case.""" + + +if __name__ == "__main__": + + selectToken = CaselessLiteral("select") + fromToken = CaselessLiteral("from") + + ident = Word(alphas, alphanums + "_$") + + columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + columnNameList = Group(delimitedList(columnName)).setName("columns") + columnSpec = ('*' | columnNameList) + + tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + tableNameList = Group(delimitedList(tableName)).setName("tables") + + simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") + + # demo runTests method, including embedded comments in test string + simpleSQL.runTests(""" + # '*' as column list and dotted table name + select * from SYS.XYZZY + + # caseless match on "SELECT", and casts back to "select" + SELECT * from XYZZY, ABC + + # list of column names, and mixed case SELECT keyword + Select AA,BB,CC from Sys.dual + + # multiple tables + Select A, B, C from Sys.dual, Table2 + + # invalid SELECT keyword - should fail + Xelect A, B, C from Sys.dual + + # incomplete command - should fail + Select + + # invalid column name - should fail + Select ^^^ frox Sys.dual + + """) + + pyparsing_common.number.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + # any int or real number, returned as float + pyparsing_common.fnumber.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + pyparsing_common.hex_integer.runTests(""" + 100 + FF + """) + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(""" + 12345678-1234-5678-1234-567812345678 + """) diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/six.py b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/six.py new file mode 100644 index 0000000..190c023 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pkg_resources/_vendor/six.py @@ -0,0 +1,868 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/extern/__init__.py b/mongo_mac/lib/python3.6/site-packages/pkg_resources/extern/__init__.py new file mode 100644 index 0000000..c1eb9e9 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pkg_resources/extern/__init__.py @@ -0,0 +1,73 @@ +import sys + + +class VendorImporter: + """ + A PEP 302 meta path importer for finding optionally-vendored + or otherwise naturally-installed packages from root_name. + """ + + def __init__(self, root_name, vendored_names=(), vendor_pkg=None): + self.root_name = root_name + self.vendored_names = set(vendored_names) + self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor') + + @property + def search_path(self): + """ + Search first the vendor package then as a natural package. + """ + yield self.vendor_pkg + '.' + yield '' + + def find_module(self, fullname, path=None): + """ + Return self when fullname starts with root_name and the + target module is one vendored through this importer. + """ + root, base, target = fullname.partition(self.root_name + '.') + if root: + return + if not any(map(target.startswith, self.vendored_names)): + return + return self + + def load_module(self, fullname): + """ + Iterate over the search path to locate and load fullname. + """ + root, base, target = fullname.partition(self.root_name + '.') + for prefix in self.search_path: + try: + extant = prefix + target + __import__(extant) + mod = sys.modules[extant] + sys.modules[fullname] = mod + # mysterious hack: + # Remove the reference to the extant package/module + # on later Python versions to cause relative imports + # in the vendor package to resolve the same modules + # as those going through this importer. + if prefix and sys.version_info > (3, 3): + del sys.modules[extant] + return mod + except ImportError: + pass + else: + raise ImportError( + "The '{target}' package is required; " + "normally this is bundled with this package so if you get " + "this warning, consult the packager of your " + "distribution.".format(**locals()) + ) + + def install(self): + """ + Install this importer into sys.meta_path if not already present. + """ + if self not in sys.meta_path: + sys.meta_path.append(self) + + +names = 'packaging', 'pyparsing', 'six', 'appdirs' +VendorImporter(__name__, names).install() diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f103817843bc2582d7e8fe4a9ed1896a8162781e GIT binary patch literal 2440 zcmZ`)&2Jk;6rb5IuQyIW2qm<FXe1EDQWLkd2qa2XL@QK*tg5X_u?nlr&Nx|Ty}O+m zC$ZUFaKsUD;m(zRgA4z|ToH%<3!Hdw)=tt!9c$l==i|-$_`ToUSY3_&{p0Uvf3*qu zhn#C3jPJmwu7co%)0_;**MvLVJt5qkI|ItYfg`AJg)?_X-kea_^@w!aFW>~}rzn@r zg~1*8)LjsQz*#bII32h{&^QF0+&iHIPx##D!3mkuLBLmei-$1V;%y$CkU_{-cnA76 zci@&av-U(3yp;FHRVlTQvy+HH`;tAl_ki8F_Awg^ov<p=dn{XQVZ&0gVOH?0*kxs< zv$9C?e7bdD6$x$?z?M?)33-?)!HPsrq}`JhO2a^KP?_#0yF#&{EXPcirH+eaEVk|G zeu{y^hCRCd6@2PL5H+nyOf;>XIgXs#tu|{qayjJ?K$!730mt0_AP`63P+?keV_DZX z?bCaVtAsXdOPlT8%Cw}Y@+1`|Y8K*Zf4A!yPl<de(G(e=2toWwWCY!R(_SUBgG7to zK_Yv@GUr07Ub^4Y`Ssz>(E-1yK8-&~cc%N-ZwzOL<MbM|-J<unS7p`KA|6{e$706S zk?Mg}lS-Fmu6l5HEQKm3G8L-VIMa*ctjKg6Z&y<jF8`n*3N0fvpb?#IJb5Xn+sl0^ z#XZolci=;GsdW%F83F7z$P<L0W2FmG^k(1Md>|wqiA1J*ka(#ygVeGnM9W0tRKXI( zl4ZJ=D@{sKg`wMq^t;ps5IU%qCW<zcas~dH6=m;<5pr*!c@_zNht4j);?=p0DMADr z1_2LPxO@f!fCf58(YZN&<{rDp-mzc1aue~d9qrcs$b%jJ8~~+m;%sdJH2dY$^@orY zSujKaJ482!lRQVXGC;G`iXCQ9AE(%2Nx?B3r{`hQuFz~;@<}dOrdU}l!v~e1_hdQQ z-Gd%hmPK|JG`R|H^t*v+S8!K`<z}I1+@zQqcbrrvYRo_@EI_+~4Xp{6b{Y@EX*@L1 zcsq#_CTNUmB98!CgdYn#ZY<q^S=9kS{B`QV?=AQ)q~Y9w6fuPj3j`0^H2emG3u$mL z5l0#V@7yInJU#ZOw`;%lHpp=RDGBD3677xrI=DoRTXoBh=`B+G@<$j4+~4=?2zGoy z>eeI3x^C@9Qd2-MCEt_hn@{2U4raMK3Wr3u=j2y9r$1Bf0kVVHH>c^j4>SP<%*q2H zF>jD)3w6tSx@38o;xcA6FB5*6{a14I0zo+Y{V^!G@>3Jt<15P|z^qI0e3D7QKW9ZL z$H<3^oGZ37DLAsC1(F5Af*+YGSvF+Ta>5WocIhyY1#s_GmX?K@<V`g$_5<zO-IDQ4 zX_@Uz5HQ>Qt|Kplc~*2I`6iAnp<#`g2pGb$dmIBXPJsv;1Sr#im?+Qyv@<NtO7l$I zld_a1fOlY=XcJ(3a@7r+dVU*KBd18jk9-I92bC1V?8s7bQfNSJ$uA%eW4l1!`*28Y zf*{^H?NEn?@QY{^tU>S5H5xe%4crS@Jg4FU*I6uL3~Hi*5cXSg9s3cy8HhIf=sL59 zXQ*hNs+Y@>Wd#5NBD9U~q9rLzPf==?<WeMj%D`163VjBSe%F=n!o8+_dd37vRRKr8 zh67uRXW<T<YWU9sR$qUG{}!9NwBL>JEkHto{6Q|8<iWTT$ImB;r7HN>iep};aV)Vk zO<2jY5>ihkLO@<Z@d1h}C@dqK38ZF;)s2|3oDh1Rv*vfgs1v?tSCF6ZNe5)Ya0+Cl zaOkS+$h5#+4i87ylUt~18$}PrH4t6j#;4KZqZ>+ogp04U#DupR7jNT3W?#P0UAybi F{{iFvhF$;w literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pkg_resources/py31compat.py b/mongo_mac/lib/python3.6/site-packages/pkg_resources/py31compat.py new file mode 100644 index 0000000..a381c42 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pkg_resources/py31compat.py @@ -0,0 +1,23 @@ +import os +import errno +import sys + +from .extern 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/mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/INSTALLER b/mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/METADATA b/mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/METADATA new file mode 100644 index 0000000..c69fb86 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/METADATA @@ -0,0 +1,243 @@ +Metadata-Version: 2.1 +Name: pymongo +Version: 3.8.0 +Summary: Python driver for MongoDB <http://www.mongodb.org> +Home-page: http://github.com/mongodb/mongo-python-driver +Author: Mike Dirolf +Author-email: mongodb-user@googlegroups.com +Maintainer: Bernie Hackett +Maintainer-email: bernie@mongodb.com +License: Apache License, Version 2.0 +Keywords: mongo,mongodb,pymongo,gridfs,bson +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: Microsoft :: Windows +Classifier: Operating System :: POSIX +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 +Classifier: Topic :: Database +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* +Provides-Extra: gssapi +Provides-Extra: snappy +Provides-Extra: tls +Provides-Extra: srv +Provides-Extra: gssapi +Requires-Dist: pykerberos; extra == 'gssapi' +Provides-Extra: snappy +Requires-Dist: python-snappy; extra == 'snappy' +Provides-Extra: srv +Requires-Dist: dnspython (<2.0.0,>=1.13.0); extra == 'srv' +Provides-Extra: tls + +======= +PyMongo +======= +:Info: See `the mongo site <http://www.mongodb.org>`_ for more information. See `GitHub <http://github.com/mongodb/mongo-python-driver>`_ for the latest source. +:Author: Mike Dirolf +:Maintainer: Bernie Hackett <bernie@mongodb.com> + +About +===== + +The PyMongo distribution contains tools for interacting with MongoDB +database from Python. The ``bson`` package is an implementation of +the `BSON format <http://bsonspec.org>`_ for Python. The ``pymongo`` +package is a native Python driver for MongoDB. The ``gridfs`` package +is a `gridfs +<http://www.mongodb.org/display/DOCS/GridFS+Specification>`_ +implementation on top of ``pymongo``. + +PyMongo supports MongoDB 2.6, 3.0, 3.2, 3.4, 3.6 and 4.0. + +Support / Feedback +================== + +For issues with, questions about, or feedback for PyMongo, please look into +our `support channels <http://www.mongodb.org/about/support>`_. Please +do not email any of the PyMongo developers directly with issues or +questions - you're more likely to get an answer on the `mongodb-user +<http://groups.google.com/group/mongodb-user>`_ list on Google Groups. + +Bugs / Feature Requests +======================= + +Think you’ve found a bug? Want to see a new feature in PyMongo? Please open a +case in our issue management tool, JIRA: + +- `Create an account and login <https://jira.mongodb.org>`_. +- Navigate to `the PYTHON project <https://jira.mongodb.org/browse/PYTHON>`_. +- Click **Create Issue** - Please provide as much information as possible about the issue type and how to reproduce it. + +Bug reports in JIRA for all driver projects (i.e. PYTHON, CSHARP, JAVA) and the +Core Server (i.e. SERVER) project are **public**. + +How To Ask For Help +------------------- + +Please include all of the following information when opening an issue: + +- Detailed steps to reproduce the problem, including full traceback, if possible. +- The exact python version used, with patch level:: + + $ python -c "import sys; print(sys.version)" + +- The exact version of PyMongo used, with patch level:: + + $ python -c "import pymongo; print(pymongo.version); print(pymongo.has_c())" + +- The operating system and version (e.g. Windows 7, OSX 10.8, ...) +- Web framework or asynchronous network library used, if any, with version (e.g. + Django 1.7, mod_wsgi 4.3.0, gevent 1.0.1, Tornado 4.0.2, ...) + +Security Vulnerabilities +------------------------ + +If you’ve identified a security vulnerability in a driver or any other +MongoDB project, please report it according to the `instructions here +<http://docs.mongodb.org/manual/tutorial/create-a-vulnerability-report>`_. + +Installation +============ + +PyMongo can be installed with `pip <http://pypi.python.org/pypi/pip>`_:: + + $ python -m pip install pymongo + +Or ``easy_install`` from +`setuptools <http://pypi.python.org/pypi/setuptools>`_:: + + $ python -m easy_install pymongo + +You can also download the project source and do:: + + $ python setup.py install + +Do **not** install the "bson" package from pypi. PyMongo comes with its own +bson package; doing "easy_install bson" installs a third-party package that +is incompatible with PyMongo. + +Dependencies +============ + +PyMongo supports CPython 2.7, 3.4+, PyPy, and PyPy3.5+. + +Optional dependencies: + +GSSAPI authentication requires `pykerberos +<https://pypi.python.org/pypi/pykerberos>`_ on Unix or `WinKerberos +<https://pypi.python.org/pypi/winkerberos>`_ on Windows. The correct +dependency can be installed automatically along with PyMongo:: + + $ python -m pip install pymongo[gssapi] + +Support for mongodb+srv:// URIs requires `dnspython +<https://pypi.python.org/pypi/dnspython>`_:: + + $ python -m pip install pymongo[srv] + +TLS / SSL support may require `ipaddress +<https://pypi.python.org/pypi/ipaddress>`_ and `certifi +<https://pypi.python.org/pypi/certifi>`_ or `wincertstore +<https://pypi.python.org/pypi/wincertstore>`_ depending on the Python +version in use. The necessary dependencies can be installed along with +PyMongo:: + + $ python -m pip install pymongo[tls] + +Wire protocol compression with snappy requires `python-snappy +<https://pypi.org/project/python-snappy>`_:: + + $ python -m pip install pymongo[snappy] + +You can install all dependencies automatically with the following +command:: + + $ python -m pip install pymongo[snappy,gssapi,srv,tls] + +Other optional packages: + +- `backports.pbkdf2 <https://pypi.python.org/pypi/backports.pbkdf2/>`_, + improves authentication performance with SCRAM-SHA-1 and SCRAM-SHA-256. + It especially improves performance on Python versions older than 2.7.8. +- `monotonic <https://pypi.python.org/pypi/monotonic>`_ adds support for + a monotonic clock, which improves reliability in environments + where clock adjustments are frequent. Not needed in Python 3. + + +Additional dependencies are: + +- (to generate documentation) sphinx_ + +Examples +======== +Here's a basic example (for more see the *examples* section of the docs): + +.. code-block:: python + + >>> import pymongo + >>> client = pymongo.MongoClient("localhost", 27017) + >>> db = client.test + >>> db.name + u'test' + >>> db.my_collection + Collection(Database(MongoClient('localhost', 27017), u'test'), u'my_collection') + >>> db.my_collection.insert_one({"x": 10}).inserted_id + ObjectId('4aba15ebe23f6b53b0000000') + >>> db.my_collection.insert_one({"x": 8}).inserted_id + ObjectId('4aba160ee23f6b543e000000') + >>> db.my_collection.insert_one({"x": 11}).inserted_id + ObjectId('4aba160ee23f6b543e000002') + >>> db.my_collection.find_one() + {u'x': 10, u'_id': ObjectId('4aba15ebe23f6b53b0000000')} + >>> for item in db.my_collection.find(): + ... print(item["x"]) + ... + 10 + 8 + 11 + >>> db.my_collection.create_index("x") + u'x_1' + >>> for item in db.my_collection.find().sort("x", pymongo.ASCENDING): + ... print(item["x"]) + ... + 8 + 10 + 11 + >>> [item["x"] for item in db.my_collection.find().limit(2).skip(1)] + [8, 11] + +Documentation +============= + +You will need sphinx_ installed to generate the +documentation. Documentation can be generated by running **python +setup.py doc**. Generated documentation can be found in the +*doc/build/html/* directory. + +Testing +======= + +The easiest way to run the tests is to run **python setup.py test** in +the root of the distribution. + +To verify that PyMongo works with Gevent's monkey-patching:: + + $ python green_framework_test.py gevent + +Or with Eventlet's:: + + $ python green_framework_test.py eventlet + +.. _sphinx: http://sphinx.pocoo.org/ + + diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/RECORD b/mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/RECORD new file mode 100644 index 0000000..f78aa0b --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/RECORD @@ -0,0 +1,145 @@ +bson/__init__.py,sha256=fA5HyVYXaQiiGTPImc6lU1DZmPwpEOdolj4H8wi6GWo,41831 +bson/__pycache__/__init__.cpython-36.pyc,, +bson/__pycache__/binary.cpython-36.pyc,, +bson/__pycache__/code.cpython-36.pyc,, +bson/__pycache__/codec_options.cpython-36.pyc,, +bson/__pycache__/dbref.cpython-36.pyc,, +bson/__pycache__/decimal128.cpython-36.pyc,, +bson/__pycache__/errors.cpython-36.pyc,, +bson/__pycache__/int64.cpython-36.pyc,, +bson/__pycache__/json_util.cpython-36.pyc,, +bson/__pycache__/max_key.cpython-36.pyc,, +bson/__pycache__/min_key.cpython-36.pyc,, +bson/__pycache__/objectid.cpython-36.pyc,, +bson/__pycache__/py3compat.cpython-36.pyc,, +bson/__pycache__/raw_bson.cpython-36.pyc,, +bson/__pycache__/regex.cpython-36.pyc,, +bson/__pycache__/son.cpython-36.pyc,, +bson/__pycache__/timestamp.cpython-36.pyc,, +bson/__pycache__/tz_util.cpython-36.pyc,, +bson/_cbson.cpython-36m-darwin.so,sha256=jZPW9IYPwD-_csrr_SqheSPyw8tBHomx957GgkIK5H8,55768 +bson/binary.py,sha256=Og_jHotkpGCrUbOcyP8J3jNP2l6Q51NVj8GZ-3h-bXE,7223 +bson/code.py,sha256=Bj9q2xc3hJ-IuNwzUTSi1r0qshBU1J1pCjVJIJExquk,3360 +bson/codec_options.py,sha256=q-9JB_wMZeRFIl-N3iHE7HHnl1SorntWMROew64Uqws,13752 +bson/dbref.py,sha256=pMBnQj36MsJHr-OeTOnJ0gQBF239Mff5E3ioXp_x2vs,4733 +bson/decimal128.py,sha256=RA9r0OcH_XzxAW0Bdi8oD7axD6yIgRBSq69zBu-iDbI,10425 +bson/errors.py,sha256=AkDIISytky_6NFP-U2ecdXooIr53yt0ZiAT42DmuoI8,1159 +bson/int64.py,sha256=NNAMdrdFUMfrhmTfd9cGo2qLSpnS4xjSyVvDnJKmagc,1056 +bson/json_util.py,sha256=yqRnD6yYW0H47TXmknCwOGMnirkafQ7u5uSPSdVXSAk,31707 +bson/max_key.py,sha256=21OvVcOVm6sb7bd4oRFiapZMgmG1dqnTNOjEm1QaGZQ,1315 +bson/min_key.py,sha256=AIejvYyTgDFTJna81weTarOb5zBhZGWTW8M2fU1GZJQ,1315 +bson/objectid.py,sha256=5lIAMfIEI6GH0PGQaCO43ySRBAIu-TAJtqIAWMvwyT0,9426 +bson/py3compat.py,sha256=nC6q-RwR7iCHN3NFVoiwO3s3Y6GeKe_qQAcIL4Gc9J4,2815 +bson/raw_bson.py,sha256=nQkLPwICqaK6_cKMn1dWbg6G-ZDqAxBbK-FKLCqDwyc,4588 +bson/regex.py,sha256=44nO3645IcX3gRQ9X9ChUDVkQErHSLzX67BLYsyyuII,4291 +bson/son.py,sha256=vv0ervx8YNBTIJpd1vao621OAZ5mss7MhWr031rUajQ,5788 +bson/timestamp.py,sha256=KmPD75UR8zE95sTOQxjvutIJ6A65UOcqfTRFL2MAE-k,3932 +bson/tz_util.py,sha256=Zy_bA8x2YWrTbIx08HQYYJVghKKwChcCkO4VSBwaNVU,1518 +gridfs/__init__.py,sha256=16Mn5rm1dVHCCA3Ur93Az6tMUdyQ9XnkeWCcDemQVe4,36320 +gridfs/__pycache__/__init__.cpython-36.pyc,, +gridfs/__pycache__/errors.cpython-36.pyc,, +gridfs/__pycache__/grid_file.cpython-36.pyc,, +gridfs/errors.py,sha256=Z7E-XkxtrWNfob3cTBSgeRlTvHcG02DCPv4X_EmvBkQ,1056 +gridfs/grid_file.py,sha256=o7jeNNH_OEx-tN3w9uMFSZXKPKNgmMImaVsAWt9LUU4,30383 +pymongo-3.8.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pymongo-3.8.0.dist-info/METADATA,sha256=m927tI9y8XSlRfwoW-clv5d-UYbdBgOHY4_JPhYzd0Q,8020 +pymongo-3.8.0.dist-info/RECORD,, +pymongo-3.8.0.dist-info/WHEEL,sha256=Lc3xCie9DAglUBCmpJLkW3wZ5DMpbh3Q35H52m_mSLM,110 +pymongo-3.8.0.dist-info/top_level.txt,sha256=OinVojDdOfo1Dsp-NRfrZdp6gcJJ4bPRq61vSg5vyAs,20 +pymongo/__init__.py,sha256=81DOJzt4jqEltYecEUMnW_Cxd83L5PiWph1PL4-yCW0,2821 +pymongo/__pycache__/__init__.cpython-36.pyc,, +pymongo/__pycache__/auth.cpython-36.pyc,, +pymongo/__pycache__/bulk.cpython-36.pyc,, +pymongo/__pycache__/change_stream.cpython-36.pyc,, +pymongo/__pycache__/client_options.cpython-36.pyc,, +pymongo/__pycache__/client_session.cpython-36.pyc,, +pymongo/__pycache__/collation.cpython-36.pyc,, +pymongo/__pycache__/collection.cpython-36.pyc,, +pymongo/__pycache__/command_cursor.cpython-36.pyc,, +pymongo/__pycache__/common.cpython-36.pyc,, +pymongo/__pycache__/compression_support.cpython-36.pyc,, +pymongo/__pycache__/cursor.cpython-36.pyc,, +pymongo/__pycache__/cursor_manager.cpython-36.pyc,, +pymongo/__pycache__/database.cpython-36.pyc,, +pymongo/__pycache__/driver_info.cpython-36.pyc,, +pymongo/__pycache__/errors.cpython-36.pyc,, +pymongo/__pycache__/helpers.cpython-36.pyc,, +pymongo/__pycache__/ismaster.cpython-36.pyc,, +pymongo/__pycache__/max_staleness_selectors.cpython-36.pyc,, +pymongo/__pycache__/message.cpython-36.pyc,, +pymongo/__pycache__/mongo_client.cpython-36.pyc,, +pymongo/__pycache__/mongo_replica_set_client.cpython-36.pyc,, +pymongo/__pycache__/monitor.cpython-36.pyc,, +pymongo/__pycache__/monitoring.cpython-36.pyc,, +pymongo/__pycache__/monotonic.cpython-36.pyc,, +pymongo/__pycache__/network.cpython-36.pyc,, +pymongo/__pycache__/operations.cpython-36.pyc,, +pymongo/__pycache__/periodic_executor.cpython-36.pyc,, +pymongo/__pycache__/pool.cpython-36.pyc,, +pymongo/__pycache__/read_concern.cpython-36.pyc,, +pymongo/__pycache__/read_preferences.cpython-36.pyc,, +pymongo/__pycache__/response.cpython-36.pyc,, +pymongo/__pycache__/results.cpython-36.pyc,, +pymongo/__pycache__/saslprep.cpython-36.pyc,, +pymongo/__pycache__/server.cpython-36.pyc,, +pymongo/__pycache__/server_description.cpython-36.pyc,, +pymongo/__pycache__/server_selectors.cpython-36.pyc,, +pymongo/__pycache__/server_type.cpython-36.pyc,, +pymongo/__pycache__/settings.cpython-36.pyc,, +pymongo/__pycache__/son_manipulator.cpython-36.pyc,, +pymongo/__pycache__/ssl_context.cpython-36.pyc,, +pymongo/__pycache__/ssl_match_hostname.cpython-36.pyc,, +pymongo/__pycache__/ssl_support.cpython-36.pyc,, +pymongo/__pycache__/thread_util.cpython-36.pyc,, +pymongo/__pycache__/topology.cpython-36.pyc,, +pymongo/__pycache__/topology_description.cpython-36.pyc,, +pymongo/__pycache__/uri_parser.cpython-36.pyc,, +pymongo/__pycache__/write_concern.cpython-36.pyc,, +pymongo/_cmessage.cpython-36m-darwin.so,sha256=XGIhcOIZdnQzFJXCzUmHG7678OM5WbP3aKsJdwTLXMY,31272 +pymongo/auth.py,sha256=Us_2nWCfUAMo8YUFHCesVNl36QzdFcp71zOUH6trgcE,20621 +pymongo/bulk.py,sha256=EX0Ywp_iNGI-t8lD0PP3S9I4ees5Vl5XjhqF9Eccj7Y,27237 +pymongo/change_stream.py,sha256=5dh1Fnia-F39woBq-jvwE7U2iJrXmlDhUQDwAwy0qKo,11924 +pymongo/client_options.py,sha256=C8HZx2FNdnKN_5u1lypzjENiJf1lf9N8us2Il7sEd9A,8868 +pymongo/client_session.py,sha256=WkFxjmKporUVdaZT2rCWq5ejqFMeb-8kDo-lNPCIet0,24237 +pymongo/collation.py,sha256=-dQ4Aoclig9lx-nZTo92Jw5NsV8Q6QVWzzpxTb9FKvs,7808 +pymongo/collection.py,sha256=eAJvZ0_wRnnT-ZJWyanTi8lBMmj8EwOkGlULm-pJqE0,144875 +pymongo/command_cursor.py,sha256=k3GAgo4T54UrJjtU3i5PygJWANTAlfPrQvtbGBX19pY,12393 +pymongo/common.py,sha256=saIGQW5XhiwUDoZz0jUaOu-lNJL9PcSDj6WvlAoA-4Y,24440 +pymongo/compression_support.py,sha256=9HkL52o0UJdNRGaiJOT7DVbF_K_E3R2kkhFbGVo_6MI,4147 +pymongo/cursor.py,sha256=CzgUSMHBzuEJQvDWiZhheuCQ1Vxic8LqeZr-UkU-ETw,49943 +pymongo/cursor_manager.py,sha256=lJerbsskemaaB5bUy_Rv0Ola4BJqEEezSo3zOAoAGak,2088 +pymongo/database.py,sha256=cyyIRYIBkyyERkhLf1Oxz2rvUNZgbDnplCWror_h_34,60249 +pymongo/driver_info.py,sha256=fk9u7Ni4Ln-Rx1DkqZmvsJeI49l72o3kiRJvfHpcmlI,1703 +pymongo/errors.py,sha256=tE3rNsYdBrtJuG1S98x9b4Nen0Ko5loevwygSECpEd4,7756 +pymongo/helpers.py,sha256=rlLgk-0L-P1GiBNjk72sjsTSAstDULxcYqQh79NoyXA,9922 +pymongo/ismaster.py,sha256=FOLjQm86XxBPiQ2sCRWHc1i_g-ap721tTBLX5X1WywQ,4527 +pymongo/max_staleness_selectors.py,sha256=rXA_frTXGvAwAWY_pBbu4GvnLsOLlaG2xnIbYdCizgI,4326 +pymongo/message.py,sha256=AvCYQPCHplrGsyohjiJshWz5CmrVJ3BFWy_jxRCNXJQ,54961 +pymongo/mongo_client.py,sha256=U584fea4EAWOUvtp9rgfqRVMaKe55ZTaibaJkWlvk04,85049 +pymongo/mongo_replica_set_client.py,sha256=sjv9GYkF-m_sTa9OeqALj0vnMT1s9C-Vo8yAbL6u_4M,1955 +pymongo/monitor.py,sha256=avigyQxsYwWEfH6LR-qFgCI9QvJ_CB7cgsTHIcBht1U,6706 +pymongo/monitoring.py,sha256=zJ1RATkTNlPIU5GMI2Dz6s3-bTETLzzm8Kq9WJdUvFw,32460 +pymongo/monotonic.py,sha256=NOgK1fiHf-yqoF5vZ2xP0QhMLB0DYRvAc5U8q4utxSE,1100 +pymongo/network.py,sha256=MsM63PCn9mbRIWJGo2_G71kcI98_89aHzLkZGbeRl9Q,11738 +pymongo/operations.py,sha256=acY2LxLYx8ZwgQelduw2inu_8SliR5O17CAcv5pTtS8,13510 +pymongo/periodic_executor.py,sha256=7YuG_Bh9NVkSXSfAYHJtL1csYQXI3kb1jvP17NA0khk,5535 +pymongo/pool.py,sha256=Ljc0jB7N0TOm0MRwNkp269hqVd3IeFLz9ZYrc-dHG5I,43433 +pymongo/read_concern.py,sha256=s-lPeqjpraky4TabOul_stU6ps9UELs1tHGGAPvaoIk,2337 +pymongo/read_preferences.py,sha256=3FAArDFnwp4grk9Emv7lg2LECQ_Dmg8OILVnnK5Wp0U,16494 +pymongo/response.py,sha256=8kwNkEwCAaVtQ2AFaFD8wZFtANniAS6f9bPVG8bizgY,3474 +pymongo/results.py,sha256=FE8M0suvJW50LMMEEE1j6546dg6B_fRWkt2-uQkJq5Y,7818 +pymongo/saslprep.py,sha256=Ybzpu66Rm4KRFIfbqooRocDNjFGJ3Xkpzu1uI0f7pc8,4275 +pymongo/server.py,sha256=SXmorrZJrE7rvoH7dzBBbxpT_CIrTVQGMomZgwC4Nok,5874 +pymongo/server_description.py,sha256=uErJUi1UF9guWb13NI0IEiaUD5m3EkwV3DbAjnwtgkY,6081 +pymongo/server_selectors.py,sha256=KoItAlFYGYujfq_nrNaHjWVW_IDSCpKP7f-2YLl_k5I,5307 +pymongo/server_type.py,sha256=AScVY81CujqY93-0kfnB1LG4OowXqO3Ts-CeXyMPa9g,882 +pymongo/settings.py,sha256=cNo29xuxjv6qy5KpAqB52fuL5X04rqSIErLJfexaVj8,4095 +pymongo/son_manipulator.py,sha256=aINKIHNhAE_f6j1Do8ejNVYD0_u-Pa1e6oerKsMxe7s,6699 +pymongo/ssl_context.py,sha256=_iBrSiqyD7I0MQMIwOUOc1q_CxTODeALfepfZ3353rE,3670 +pymongo/ssl_match_hostname.py,sha256=u5QdUf8wogzS0SzsfsKcOYcAwWXo97e8COGWJbbl7dY,4677 +pymongo/ssl_support.py,sha256=5Yuim-Bp50vZUCKEn4e8qp3YkglnaptG1_L5lTg8Eus,7763 +pymongo/thread_util.py,sha256=YF-_hCRZEH931lCfhBBIZBXQE39WPamHwG7BU_QHlzo,3959 +pymongo/topology.py,sha256=C4Yd1pYMzAYVwnczkVjhPQR6Tze5ZyCUHRQgjlgAC_E,25389 +pymongo/topology_description.py,sha256=z9KHcuCrsIwSvndj49a95750fVqBMF_nrqA6fgH6JkQ,20631 +pymongo/uri_parser.py,sha256=Od1L3n1wb7yIOxV__l5u0Nk4ramkvIjThWuXsw01jDQ,14553 +pymongo/write_concern.py,sha256=PQmoV6RqaTlMgvoKU-KoQ_oowJsH9Tabi8KF-kSCZTg,5000 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/WHEEL b/mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/WHEEL new file mode 100644 index 0000000..75ff859 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.31.1) +Root-Is-Purelib: false +Tag: cp36-cp36m-macosx_10_9_x86_64 + diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/top_level.txt b/mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/top_level.txt new file mode 100644 index 0000000..7b660e2 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo-3.8.0.dist-info/top_level.txt @@ -0,0 +1,3 @@ +bson +gridfs +pymongo diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__init__.py b/mongo_mac/lib/python3.6/site-packages/pymongo/__init__.py new file mode 100644 index 0000000..7f7dc38 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/__init__.py @@ -0,0 +1,99 @@ +# Copyright 2009-present MongoDB, Inc. +# +# 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. + +"""Python driver for MongoDB.""" + +ASCENDING = 1 +"""Ascending sort order.""" +DESCENDING = -1 +"""Descending sort order.""" + +GEO2D = "2d" +"""Index specifier for a 2-dimensional `geospatial index`_. + +.. _geospatial index: http://docs.mongodb.org/manual/core/2d/ +""" + +GEOHAYSTACK = "geoHaystack" +"""Index specifier for a 2-dimensional `haystack index`_. + +.. versionadded:: 2.1 + +.. _haystack index: http://docs.mongodb.org/manual/core/geohaystack/ +""" + +GEOSPHERE = "2dsphere" +"""Index specifier for a `spherical geospatial index`_. + +.. versionadded:: 2.5 + +.. _spherical geospatial index: http://docs.mongodb.org/manual/core/2dsphere/ +""" + +HASHED = "hashed" +"""Index specifier for a `hashed index`_. + +.. versionadded:: 2.5 + +.. _hashed index: http://docs.mongodb.org/manual/core/index-hashed/ +""" + +TEXT = "text" +"""Index specifier for a `text index`_. + +.. versionadded:: 2.7.1 + +.. _text index: http://docs.mongodb.org/manual/core/index-text/ +""" + +OFF = 0 +"""No database profiling.""" +SLOW_ONLY = 1 +"""Only profile slow operations.""" +ALL = 2 +"""Profile all operations.""" + +version_tuple = (3, 8, 0) + +def get_version_string(): + if isinstance(version_tuple[-1], str): + return '.'.join(map(str, version_tuple[:-1])) + version_tuple[-1] + return '.'.join(map(str, version_tuple)) + +__version__ = version = get_version_string() +"""Current version of PyMongo.""" + +from pymongo.collection import ReturnDocument +from pymongo.common import (MIN_SUPPORTED_WIRE_VERSION, + MAX_SUPPORTED_WIRE_VERSION) +from pymongo.cursor import CursorType +from pymongo.mongo_client import MongoClient +from pymongo.mongo_replica_set_client import MongoReplicaSetClient +from pymongo.operations import (IndexModel, + InsertOne, + DeleteOne, + DeleteMany, + UpdateOne, + UpdateMany, + ReplaceOne) +from pymongo.read_preferences import ReadPreference +from pymongo.write_concern import WriteConcern + +def has_c(): + """Is the C extension installed?""" + try: + from pymongo import _cmessage + return True + except ImportError: + return False diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07ebeb29accb30aab18511d84f7ed4f4db70f764 GIT binary patch literal 1600 zcmZ`(-A?016dwQNKR^fs2tSJ{Y^zjV(q&s!m8xyiBrH)OL2<UQqgIyJGXyUl+Z_)q zLFyIld-S$XQmK#N+g|Yq?M-{e31Ro5WBK!U&Y2mXIp?#V&CKNg{_T$+QU!$mLhlR> z_&0Dze*zGM5mB&0R<KG`tPu_CM8_$T!fBGm8Ir+Si04Qa=SdY8NP!f8LAXeZw@62L z2G5cVnepaW36~TEeAb(1Wn5+pcp<UpyhT>Qm4uhPCAN&06F%>)uqv)5yzH&AHN3{w z@jBbU8|)EVCJGqAz7@K!Qs!TW%1<L!hmdOPefehj=qmLQuC$+C%Rt2e91BXJ)1 z2I1}%<;GdSjibOH2CZ**?-V#JR`&=l3~6v+k0N0^7dX2|qVSw@8mG_g=$w*R7xY@( z!DMu&N|4pM%K|uXPe&S96Yl6afIvbaS``WPR^_`yeWM9osNh3H|5dG`TlH1}D^*3y z$V3lu>4&`2T`rT0mEF64VelLn3Di<?-i=%zQuQ4g&%l`?H}EZS8G1C<BEe(*P2l>m z#_aHS#OLHf3IDkD5K3SRTEDV+{VebZEUh~ib>TfddwqRHK8wDvK6hS^E}lL+yLro; zPhkxG`k)@V;gjTzp7(@*>0bu!PgnJD#AF$#Ps?(BS6J3=IEu?dDy;j=ASKrywjqT` zRtPDxilOj%U^OM4?Nf2d{Z`;yGU|((8m}I8x|aF!__)^}v|H9mr{A`|Z}-hkuM4rp z>HoxFuYB{8M*$y<LJC$P>2lL^<+e&(Nz6VCJ=d{KDkgzUobULAULOU7dU3AfN0f`6 zPvcyRdQ?zJ^J98s`=dDbG9*yK#66~oJ1;l39qAt*$|lF0o`Hs-N#H4-a97Y~02cSB zqLCej4{<D-kAaLzL?Nn&nDR3MA!{alPC~uN^Bo0j@aQHwMI<E!a<kEi3~^44rUBxl zzEpuR=@KPhbA4RkoaHbYMfQ*m_PaF=XC{5)TM&;69To;$v^fuWO-XzYis2<WB?aGr z<@^XV$^#%(Rf>uZP2}5Pb;qLAxNI%YNJw7%QJk?X5;&HHa}BfE?zTGJ7dYQ)PkHJ^ zySLZE1$Z1ZUYUbN^E;da!#qA{_uDvq&@d0$EvygPrvt3@_V;nlJnWrVz3$<wSZf>} za#^}WM{&WLs?CZs6XD_V<fyw&;Ca*$P#|80HF)+Rz(B-&L2k78ek73+uSn<O{q#ie zmXk<|FUgSceu$6dWkn$W$+TrTZJJ3CQf|vcBEA9vUX`#aVNJrigbfLg0PxEF?ws1h z3a5gK_@)e3?!#}TxGZO^E^f&6vN!K^GWiQ6?aY3~0&?lm=h78@0-&pKX?j}EPOh=7 UW>a~ssFc(q^t-6+WB}Fw0C_j8rT_o{ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/auth.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/auth.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63f88380d372fe06c390492eb5c7c5a0cfb508a9 GIT binary patch literal 13333 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 H!%Y1*Ue17h literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/bulk.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/bulk.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c8332a18a7f98087be2ecc6d58198b0f036c3eb GIT binary patch literal 19249 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 QZg%=tE&j8o7pLF&zoB8{4gdfE literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/change_stream.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/change_stream.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d48b6c6b65eb2720200aca80fdfd5165f074cdbc GIT binary patch literal 10516 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/client_options.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/client_options.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0707be1353f093a45ecbb3ffec2275af3f9f963e GIT binary patch literal 7957 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 Bl;QvY literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/client_session.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/client_session.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a0043581bc7537bf02204bf8a11aa84223593a6 GIT binary patch literal 20008 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/collation.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/collation.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6dc7660b68f716ffe6fbeba4945e34cbd12b91d GIT binary patch literal 6502 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/collection.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/collection.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af0911212a57ee4d7a41efd07056c7cd1da4729f GIT binary patch literal 117994 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/command_cursor.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/command_cursor.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6339b96cb5f3c25ef52149a4695a38c38fb9684 GIT binary patch literal 9937 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/common.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/common.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..473a2806f38fc1fe9a3e9cc5c9c52e659aae271b GIT binary patch literal 19211 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/compression_support.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/compression_support.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e40608a0d9d977713233da2b3c81a8bee892fead GIT binary patch literal 3359 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 N%=}!bIA5Bd`!BbM2TK3| literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/cursor.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/cursor.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8f8e94223605e7693d386638462d7f5a27656eb GIT binary patch literal 37160 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 b@vKuwfs};*;CxI^KRh`z{rSZ3zuEr>zGJ#? literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/cursor_manager.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/cursor_manager.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e8641f841a5253398a021441f2f62f20fa21e99 GIT binary patch literal 1950 zcmah~&5s*36!&~2n;o(R6;yGkge4@{i0-8A79k>pTCyvIP*+u1gp?wAoUxP4?u?za zorFXy4s5Ud4_x_6_#fuVsTb~W;@Oi43F5;mKYKm)`@N6fdpSNhh<^X+mv0YS2>pt- zMhN@IF!du43=I(Tn4fzC&#nHzhc(E9A{>Ms`W&&4HC`gt;EkJL&}9BssMDmsc?g}H zK6`%Je{z0$f{*YMTu?#BTwx>egbJ2(yqIu-)0xszX-pNzmsy^3hUv)IdlSC2r%{?q z%~>2pXMC}~UMtgBPvk6Tc*rs1qfFS>a5x*LIn|nLEJwKS5T35#0UD=Nz>6po+E9lm z1*SO7GcF7sF5!EgXJQ=n3T`I7<ooHekYX%jCrNcLerk{U?oF(@A(bO!?Pdb@#xb6A zr86l~@OaEwuZNH0;|ODX!l#O-)NpnWkEFti(;Pg`G&Whm|Ml&C`}S+WHm_s+cN=%j zh<BWiT__VQ<iaXa{A!jd2oi)Np^U*+ClK=Stbjno_<X`~l6*!@I@wW^BoHeIF9vfJ zFXY^2=M|6zoprqOAQOf|qKR2fxlZkIJ$%?ahN&?Kj(}0fvS|=7p9L?`Ags7FXs{-* zXs<ljfn9yD!zgQA<!sFcJfs@VtZ8v-vFxyG17;tl!!_svm~4ED`D5TA6I_JX-i>#S zNP~rd+gQE$!ZJgc3=(8{SOY*_AZ%{*o>4`C9+2PO<`4tXlZqZm4;ZyYk<FdeJC#$l z&Wib48GU6fhB!uGLVB6=InU2J&9b$iN&qQ!8QNWWyQUD(>znFRxwqi-Qt?q4SaFB! zgpaI=+wsd#^L$h`D@%Vy>J}jWA-hwR&B5dDoT~0f<_vu6rk7olKNt<ao3lsyBl2N7 zTwXpn9<3HddLPDEbkDofY<je=r6cvRn91yF-d)$sX01|Hmq$EZmMuaukr_hXv#E(d zpl0a#@YnKIcXn)#>#J#CufedZoqd@45QIV3p7CyceH&5>>HGl_dJ)_po7}N??ceww za?L5A51~1I39SZ0&AZ;PmDlGqvu)!XxO=J;RAx3>Um_W^gcs7-dU5`Wl-mY#2#mjn zbLa=1ElvNy5C;nSfFzXx7<5Blbmh5Wiepn<mOaPA>h}B4;kbg<0-M8$)Brw}%5?CQ zX6i4B{&V|rEu?1gnOyu|7ucAyx?7>!I21DtjgnV^aMga+X_Qf>>#!(G;&OizM)ex} zKWN(qziyPe6R5U5+~24z_txGzLRR8+tEb@t^ANVW2?DhvujQ}a>~A;rs<*jHAw)oF z5>iHl6q3zyyKfV6HKY0Z%N`+2ri7?BK%IKa3R?tQ!U8MHuy<iP*p?Uit+qSs?5Vfy zcWaH>2Qj!c)KUPek5gGpsj2*L%Hai1jeD}C+95f|TAx(*eR|h|zz;D32%vvE_!DJM BIiCOk literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/database.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/database.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4755c92b191b886654cece53b9901704c4faba8d GIT binary patch literal 54180 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/driver_info.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/driver_info.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..122cdf4e1866b90179fd700f1751b94d11bd1e76 GIT binary patch literal 1378 zcmaJ=&2Aev5GMCWmSi~v+`v7CC=v()94W3_6a|8yNnI2<L?}=L0Tw9;YRQ$>=8|iY zk|IIAR4MWrxdnZazQbO7>LawL4p%?UsgyW7yE{AceKQ}=kB-{^eE9Rt#|A=wp-)y5 z{O@7gr(ifr5XU@_xCoK}dq0$65hW2uKOr9R_#NW02zbmJ{D3#d;W}7{Nz7Znpk90V z!*f1kDixgQ(&buNl4(O;X*JdtF9<jJOc+b@qLiW#%K11&oGyvZ$j^&9uKzc{Ks{Ww z6)OaHQ;3DTL+ebg#?&oJk@|?;infmZ5*&dN3={&6laR;nQ3mjN^sbde?@@%37(h0v z_C<~3rOGt>9V6r&!bW=P2-{*LbHmCK>g`dr+XU9-MC{pEVSo*hdTe)5T}wRZQ{rg? z{ZqmeC#7T#+E9@BL?{8T>Qr00L|Dg0GPe_9p?s>95~*)ppFH1z`QLuk$x@~W<DBHq z5<OQW_mmv`C%N?qNg=FdW6>usRqk>o^Q9p3+)W_D2thW@wRJ9;UklQGwb*p2drG=z z{jd7x-m$t6cXWJ_F2Ga^KRyQp_K8Tr7Gxyqd_%2-$HLN7l<t#Oagnj9bp1_Kx*H_u z6UDGY*fs&<ki#pq4z7X~TH#f&3fIwX^!C{*x(e6mDq5op^lSf3aEou_Rm{<K%RF@8 zxyCx^An*@3USZd`YG%O+TI1jF&BNDd6@eIn;qv0O0eKRyt6Hpg;vkQpnYD~zpiE8$ zDW=u|Eto2F80H2__tYQRUaN}jv=qj87S#czO3Wz*hgqJdu8MOf3R|^vyZg|1epTxd z>i%eqHdPZo0`X7^5)D&ntH|G02U{&w&7F>_$O@TNag7O%MvKx^GHWUQ1N|!pC8(P@ zF_<wk$h71j#X)*KaPll0y`Ax|?YH!sbhNlWJI|K$B7FjDtOl2ZGA|$3;G}$PzEe}3 z-^>Q(qVR`zf888m>PO!%7sk)(0c_g=gYXIb?&Byp4wlDvee7?$(F=#eVXt8hA+%~! zT4+9%z_;p9dNXBm!`?TK>y*+ud3CfUmkKH2+2`<WZF<-od;h*SzUe2ht#_Ku2-i={ zk$-p3o6o@b(qF)}I!v{cn?q(z08f&8BMS$vT%4!6D4DBAvq`b9x2f!_Rn4ax<j;Io M>st^7ouCu`2dL?d!2kdN literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/errors.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/errors.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..503ac06dbc97e6b571aff44f91796894b225eeff GIT binary patch literal 10106 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 CV&CWh literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/helpers.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/helpers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de5408f425a2216d6fa9033f30695e31408bf2ee GIT binary patch literal 6176 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 b`g07GDU9Wg8D`<_-0@r<|B>8K?$Cb$Q{OnS literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/ismaster.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/ismaster.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d9e4e334fa1f8ac74ed38f3377fc9a6e89c465f GIT binary patch literal 5118 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 RT~7tAKS;x)@zsr`{{tFEn>YXf literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/max_staleness_selectors.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/max_staleness_selectors.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47e97d564f7a0f0f607b6c15976a6ddbea9e3f7d GIT binary patch literal 2467 zcmbVO&rcgi6rPz~8?!bffdq)u!w4xVR*9V`{h^>L3JQ*z2q<FRkXmh5i)U;W*1MaT zHDI({N{{^`dhK7*|6#9{s&ehEy|nMGjj;())2_5{-oAOvym{X@AAU47W&QcnFW>xj zlaOD@$iu*Y3a|bGj35mns9-+rum+>(8@|yo8z%T>BPVi=yvU1*A4p?D6vQNq1!0LI zjFX}yreL(hv`xx4+&?HG&y*KS<+(f#xt6|c#@v?bP^vYlo63t~FAOx_b+r^c40y*q zwqw_qfz;ZT%`gzUVp;V)$v50%KAhrqB%55jJ-xzr_GG~0J*g!3G<W$y5FQ0QQeMYZ zJ-)SUxv(*=grD|@n(K=VFkk8z5@Xo?$cy)29f-9;)#>`~ie+)WWLJDw$6rMPlImVZ z^836W+QE~pL9`5^rLDKq`k~7-SnVUeCtVfqN;iJ4<eRPxn!OF%vc}I4gyV-;hEu)w z5wfan=vG$HaQC;%erGX9SuYoHjYVt`^mb(XL7OCRD>wzTk7Iv^`&6uRAQ36kbmmzY zw7hm#xrlL1sZc?*XxFx1)wZ4b*ITu73o_3eV46rld~nRe`wU+F1WZB_8k2c)K-6MP z1^5^d>^5l`bL5PEPZJU|m|cNcBW4L{v3^_-AfdT=^5Zp};+-xOzAL#4<x8mlT3nz* z_r&1nx^f*iu{~PGNbY-L`T9jhQ!3u?1|cUe->am1;@|hIl#TS(i?#Kdv$Or8UURl; z+b_OcQ`p9I&fZvEU$5D9XJhrXW7k*LYnwIOF0*tB_IHNYAe|kO(rI0=@@JwDoxhH& zaFY%J=<1=Xs;$r$Qt4{*pc?xRTf4`H;$!`p^GS2Jcku90>*T1@d;m{7sMf2I7v1*) z+{M4I9tYjfdvjQgdYv$6hr@BK5T`E?q0*J8m(DwfuJ7TsbH=ikkQyLigcv2tC^KeQ z0Y|1v5F0WHS!BYSG06ufq5I^NwaKY*{0e-!M!sD?H4}56#m2sQz*HUl9K87jk}&WX zdf?OjiFtCGOL7T0pz6EC*e@jJ8KvaS%&5PEnUjfeMuB(qq_!GGeh*1=+398O1s8l; zM$)(-hNy{fLHhc0MZPL!E1eifSvspT;dI1^a;C*WFz!WC0k=q6+_wA533}JKiI>yq zX6ogD(#iBj7CA!ka<I8-68|XgMv)9ex`5Xka6p9~+o+sZ1x%dmV*~}ODf~9H&?(gr zzfjeTH+@sYj43Bub8w2s5Yo575SFJVE76iUM+<;piA^)L0P!&d@kAMd5jcq88DN+& zJ%<Rk;r`nsL-ZwlGeGodhNuw(l7Q%I#BhM<IEuR?$Sscg8H#j>;`9H7;#C2!lqVaD zLj~{m1Br1Jidi_MnnrU24IW-0)733B2$Y%uGr&S&8ylvEmDC-an?o~?2Cwc21VtwZ zodE!wFr~52#3%p&7Rx{|tV<B?!rTx9RFWYGpTb8%gaNHBCD8i581K_F_?>_NsHNCI zc|Kz>XI^*$zRKpwga6pd$~pXeAe-lZ!&A;>m%HBr<Xy%Tg_V|BM$D`kSI?dAleG<L z8pVMC&&*s2m}fEd0eo+ki|K^ph_LB6jp>0nRV4ne(wT@hW-o$Q@0mh@Q4?rz>C1w$ kg-0sMu*hyg;qy)?y1smZTW1oM^*(1((<t03+$r4s2PlcL_W%F@ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/message.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/message.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..087e6c6727eb0f3147aae20d716f10f9d6a00a91 GIT binary patch literal 37251 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/mongo_client.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/mongo_client.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13edeac4db146ba717f119cf8937f09f081aa79c GIT binary patch literal 72827 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 Gy!jV;9zqxZ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/mongo_replica_set_client.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/mongo_replica_set_client.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6a8588e9a2b01e1b8da2825fc52049339504b09 GIT binary patch literal 1872 zcmbtVO^X{h7}k8)-a5N&Q%InfqDw;z&P>9#l$ufsDU=?%gl?cP6g1kA#@4PZO(fYH zFH0{Q$f^Aeg`WCL`X7AlDL<h-^_6C3<A&@hg3-t$y^o&vc|Ux3a4`Po_rHGrV}#J( zXlJCb{stbK!NgF3Sj1u(6%o7>884F}iO_e5rEKs5u>ns`)2pNyu=p5Fh8Kt5^2YFr zI?ghD%sHMhUCqjzKc~w^a+@#2d_m}%3Q13d6mC;yuizqdG>NwROReUbR8nx|D*v?~ zNw=`~VZjlQK}F1>B6*2wpvRIIdqvt(Dh4l6ii)A9v%T|!NBogDQdIPqyT<{V-UGbX zL@||uT3l;`XO*PZ&dOh!P2iI4GRgv23sGj{F@|x2foX3fmb=cK*7!{(WdJ!BQsNVi z4PWXtXILmqalLXY!||FME40G8#!ohZKzDPN^?TKVsySz~89vM&2Edz%wc7sA6D%xN z`W(9j$69er6@$0j^hm7<4$1_PD7Fp`QRz=xZh+zx2chf~gNU8;u;sEI<a-BRRdU6+ z4HwlbRXOkrq<0(mLLFXE1|o2UEkw&7ce=NJSCwa2xE`yb3RhYwUODVE2)#phikYw# z#K1sKNHDT^$(JV(f@zQioD@!*9?B~QP6kn|;|<g23Qlqf*x*}d1m&PrE#|fh90cbn z7?!2swc&PAmT-w%Xo$PLPJ!C!Wq-}PdOz)fAjv7Dl&4*mmUCv|ZXfQlTxje3ug2(x z8z(rh_4!>zUFG=-9KiDdJoX+;4xK_vaIvqxUy}&A#HE+$Dn1=tMwjt#Q3TBcYA`*z zcoNd~&D8havg>9s#VgBkIM^1LkIhYCdKJU{&@aZ2ht-+nYc8SI_s*$NLe1?q^{eei zeT73PermV21G@tEjCW?cM~HxM5;94)spYcXrqqD-@C?l77VzIAP`uC&2>BEJyU80P z*3j7UH8pvyC4;octFzq6NA=0`HT%qdK|ZfeHfN6x>x=Vc^$^Bf<xlfQG!KLVu2McQ zU#gWB&(?X@V6NYxen^*#yM3eCm@&}xjn58YLeVfD#}}WxRn)Ba={jyceqOG}@YwfZ zV$mf!MOV-_@A~+}M;9Nz73%({b~1^Ieb32|1(zV)Br>-E!uTX;rw?J}l?;bS4!^9w z4MjH-Y>!Sx-b~RYCuBP&WU1Lo`t?2`&sJ1+J0n8i4+QYN2Ie+Q+k-AD6_*k=uDJj? z@1OCMLWJ+aB1pD(JB{{7;oD?r?)ZJLWHIW3U_9mG)=u_?v#+6def_Fs`gJG-50l1w H@qY3j-cdE7 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/monitor.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/monitor.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b92d680e7cb0d875bae958e5e96a76a8a17b049 GIT binary patch literal 4758 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/monitoring.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/monitoring.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6971a077a089289bf107c634f173587f90f250ff GIT binary patch literal 34371 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≶44!Qr|#o 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/monotonic.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/monotonic.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f723e4cd2a1f7fbc324e6db5707f5fa137444942 GIT binary patch literal 505 zcmYjNy-ve05VoDPX-f+oSU^JR+Mx|q`4JLAEFd8P3zdKf$x7m+GIiqMB!%<|n3#9~ zR-S}+$jZbcz{I5~6=(UolfUn~vpsCJ8sBdpcjr1npXgs~Kz$55eg$C2LJTt^a6l}A z5!1%l(y}I;=|Z>kYZR{Q$g4~mY7e7g-J+1(psWpwil_!v%fJX!rwi3fsao*HlJ6|| z=aL6^RTzO$xXX?uGW`m5joH?S2VTE(Aw!wSkh>l3cOn_b+!0>C@dX!0U7WAkPAo;5 zc$5c`R7tKUV7mmS9{f4GSZRg2mK&5Z=~9|EDD~4MRUV~^09P=!5R_WAxea>cD`)eL zCrU}B;0MvX%R5r_qAuX)-i#EV+KFdQZDsmWFi*v%J24Y6@SUeA+llw-uIprz!O)*Q z2JSY*I5bCQ#G@V$;{=BG)Ipd^{xCJ842F;8GB01ykFvaW7)X{1@2Cxv<4pjaG)a{Z Ot%+ALWYUH_NAe3!h=FJT literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/network.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/network.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1477392dcefe88858fc2ce72c7f38326feffff3 GIT binary patch literal 7361 zcmaJ`OKcoRdhXXeIUJ5CiZ8udG9_ygnOeh+y{j0pDSGr+i$gBSwd9WBW^<}Z&P-4D zsJe#K5IsVm@d7!-iLr+uhs9!%Qvw75au4>fmjF5CmY}hx<Pzl&1js1?g5>+F=S8iY zA-cM{s{X(J`rm)?z3J)vfBoX`zKq{dlz&ksewWez1W)*tswhmc6s9uGQ!Q1#HA|Ck z-O}aTunhT5St+JlX{K74?k$WMp5Dq@SygfMMh;K@9`&YVTezoKnJ0?BXejP<GtY&p z&>u@#=`R#td#ZFxz>o%pqBWx`6Dxn7taMA(OtKQ|GTyn?tThXGm1Vv2tvPG1b-}tI zzjNMvYr$HO{k*r>TC$c}%hs~|p7JiXE?Jjam#xdKE7q0PRqLu8FL-9_nsp778;$F1 zy013gvR2qKE3%odRqKWvEy>ZF?!tk}&aqjHzwOR`tA=;kc{ca8V%_qy>_XCG^K1bl z<p&B|WJ_NwY{~ttzHa?C({_~d#nYRQeBpB6@l4+pCjoDop3`-?dE|O+yjrd}3Rt-M ziUd^MEvvE74m|HZIw_a)fTN>teeqsdi!%vG7-w2;7&?b8rb-)YPwkD$&d%C{ioNs5 zs$gB7xwW9x=2#TZ*wsyYeRE@L8*3hIR?9{_z19)IHkSClTN81y8i)-i1dSEiE-r0? zEJxG>|GrcAI^2z?w|F3eTHwhA*mT<dadm5L{WE*Jvi10j)6_?G{A%-b0{q^_Glyp# zPxx1wq6kH(k=9rHYHvP*k}W8`g-GX@nC5Ft?=41JZz(eP-ROKl;dh1B&?7BM^|hWB z&G45|Cb%DE8V2TGMl+2Rx6q~|jTs*)QHJIlnMPK=b1c=&CA~;%<e5=d`Wj1P-8nh) z)94)FGWedR@8IXrbYrTw94+&|7KKKkG2K^s7o%DJt7yJa>?>lXndZM@sordK{#%us z(H#E=mQ82|m8A%jM{1Oc^r#S}qgj^wCi|t)yVSefyVAQF%>m|<s7O1>-qonsG^hvI zbJ2WsB`WrHRq;)H&jQy1(^(PprGTpt&GvI&>Itq94xeDK`uu_-G5KRm$tdBAma)gr zhUbYcE-F0}=bVd{K<lMws&A;uaJF}`>qkoCLUg&W0+LSoOG)=H*%Zsy)!sG#hhjcb zqDzp*_2_zI0kmCUg>SUpThUugUs8J4qAZ~PBg!@wqia#7uK`c)Ta9PMQe!!~hSTJu z5}W=8yTZ)5p@@skJmw=+>8+^B=`QHicw<Nr(Hoi2kQ?Gsv?4BxD+gL%!-{IO(zx2Y z>F04$Gg^Tz-NdP`MK_|G;3b_ar7AD6#}{xjklD(Mm8a6xNc?~CoA?2J9njat(9ty* z?2L0Rttge}ZmlC+(=lO5EyrhOa13J=N3IzLwWcd>n*leuQxAs&tI}9k^LZ1$yIT%- zVA(DY@5%wwe8=1)$i2J3$(@q{8nf<)!trbFcop0C0g83>GJ^xTDRYFg?_jgQH&2f0 zwIfpmChtIZK+%B2F^aJ5*5pP*;#pAZv|L}9PG~wlNM|m0naS!kVTx|sy=}UO=FVny zbpnUy9J_Wv1fLwiN73m6GjsufEq7>kv*~orlR9_J_P{}y`*kr!Q4j4_;2#Dd(SlVc zM5=T;*c-?kGnxK)48mQ9+3;KkpbuP;hoCX+FdQ2%t_5&(cF-nYCHFAbX=F1Qcmr!g zctorP)&vMXdEKjnFFVP^2xNi}HMw9CWP{F>z>NUR1E@o%4KdaILvy9(b;zOa)?4l* zsv}n_K%zFUyIHd?MGZa?ucS7G<Fh)R7o0fzo@*yFASme&BkPBL02m<HtI0jgdT8$Q z&V*Juj8QxQ7>V!JQ4m6f+W{A4Qn5re$Gb@^cGK+=0MHVy+ol}FTGB3g;JSb8cy(sd z!ZEN{$Ju?TK491UF^jOz-J0iw;oZF#?XDF4D%!dTIGDCtIfft}k6_36TF!HOKMZ_3 zte=ub?BW0ztG7BW6G{S+Gn3{`nwNBmBb+~UIZSqpMyeL{uZCbez#=tkFf;}n7|n#> z+71t0`-InpYY&zuVgQ~eW8;v^B!Bnz<l^;Yw+hA8y}bb`rg>0zJqEr^8m|fIw4ugl z^aXi<48#L+5rLEM|BqHsFC#zn+^&h|03GT2#1t$AS;=!TamWsi7_{wHcu3np;3RmM zY<LuOKrW`u%`JOl=fNb5@6?)paN@b_&}9>FQUVYHoK5G<nxV6rL;^|Kk|*Jwd22{* z`L4M=U`fKT5bScqkeq$jq$~%rAF;I)lI@Xt@4}^hDrb3U9`K-rT_;=x6dzhBeb5M) z6lm2>P}(pyJ9Ir{NA=@@Ku%MuE43DTWgw~HNShUFinM1S;i^?~4q))>W4n)YBXPY# z4x~^T2YI|A*jNji$kV3JP!&&s#Y0A5_0o50-K+n_ul!bQ_>f?1Kr1;%%u=jnyXAEE zT^q)3OLZT6O>4%k`?lbYA38Wz;KwP?J$Ah~JB$r+CSiSO&DNYw=y;^+p|r<Z*D40X ztk4$lYH=QsfVl@w#}n3^>yu|<Hk=@UWV{T4*b%N=t3yMuU2p<Ab3|umplH^TEq$Rq zq`?+JV0#WfbmP>sj?25&IZ9qP)~cV{o1a&<A6C{rwJx+f`|vSG!>w#YP%h$3==uzj zi)Xl7b0Ii;kR@9)9ls4d1xpeWvo4^UEEzazc_yAB+7|4@`3=r70*Z5$=QUS`mN;LB zswHuoPXUM*(8L+$3S`XSA8`)8N7(KV#9DZr=z}D={>_Q7Q>(#Km*0*JN*GXa$%Fu3 z@Vizv9K>ZSHwv#7PJAY8@(YrlLAZ<4Neqiq@?=oe*J4SW8AJywKX&|9Zsf<U=`$|a zD#-0{MslTmff!IiW6exB81g+<e(Y1M;#ohysak*rBgcs~Ka5ico^u$+24cZsoEb1H zP9>tva~IkW3cJo?9S#b-fUCC(L>5#>1_tY#j0JE3HtQty3lW+~oK{&W?zX+IHJxY! z)D?qatV2f7)gee`AeX;X_zytge;?gx^ZGF~`OdM!?;HdkGN<rPt$9ay?;h+wKW6WT zAKJfD+wV5teedA(q*ePKeuw^@-8=1i`yHtzp7##_f!_)0&yMd5;@;>zC<#~F-8eJQ zxc9Mb_%#~kRzc0G1>I2dYC$cjY5C4;vlz{4MHS;(Nj0=IW(_>EdI>8^nt`<i4LyvO zFk3_~uW1CW<uOihSzs&RG30v|?JQPh<!n)%livm)`R{^`Qv(Iwy_!xm;g`olTEC7b z{AV<>zC&@|M~#R2NADTER4<K6PeV2K0aZv%oqr%u>!DUs543ruuf9|xTrV_L{utv% zq#vlm(MW3=oMDveDs8kn&C*Sc|EbVXODYU?2KLf>Y3!8|28{t<b`kX+)gZmBUmT37 zG}g;@3j%c&>XjU-kXxui(zurRr{uB$d*!0ENHsEjWw>8*`4HuzY+prHkUxDF6*GC2 zLHd3V*)nQ(S%!Z{De#JnqI!D$K_Eua-9)x@gPZ#uVY<&@&jL~C20yKA3@~}Fe<+U3 zTQ_*w^a1A~*OYY!0x3Bh=5RLJ_6SywNtyQCdiR6!>BnzEgD5OLDpfCpMW#iRK#lMu z2(V@S*BM25MK1c)5}MP?M0(JsF!cti%h|X%ya*u2T-lBnMvj#V7MpT5SuOEtpo^D> zt0(Rw>;#f$v49t8RrWKtD>J6ppuDo2=eKB%%)%;>#SgeHtv*gC9E(+(0`kDxMPMPA z!3#6jLXb@oBE%-R4}%D^3ZsYsk01>_Y3|ZaD`@@(Pxw7Fims`1Fqf<}F>3Rpz6PVA z*&>Xq0An%Kc~wH!DB#nNqVnh}<j?UTl!&fDG^Y0S=YJHb{Li{Y6yT~HHK3Z`hiYm< zKhU6_Pf;SHs6Aa22ChR?C@7i0{gdLL%*EYZFZCidD02;%8x_(Src3iOa5<qzy2wUG zA6G6v(QxfC`1(-k>5-bud|&CQ&x%hJk)tabsJc;=`OSY4{io;P<>{6P34>Yl0whi4 ze4N|w3fJM>>Ba^E>2aKSw3$dOv$>OWE>M2#2R0>N<0vR^wEQ4WRUTD$w>deIScd@P z6k!a@=|t3@%JKcqL9Es(Xm$K1{}5xZ3+fY${Ue_63K~U<B@Ka)|0<GTq@SFFXi6IY z1S>{jftD*|oYI5+F*-xBB==N3c&485Ttr5sHWmJdUEF{)h?xch8<*g{dZ~e^bYVzQ zc@R}viV9u^qDnV15QcR!KOw60i}XNLDR@4OzYtjlmctW5yby`;Z2k#E1QF<o2;Ri~ z9DfLU<9y3)1-yG)cTeIR$pG0M>Zl)Lj(<kYV`?_2sZv9%E@#H<<v+qethJ8gyktG> z)?rpb^4d;J>N{EfZvYK1p&^zh7NJ4&Cz)Q*YLw^FkKPnHB(KSm!D|^Sc!?B$2VV^h zcWY=Fc)J6oP9EZdJOE)R>$v@NLPrQL2V(<CVpvw+NF<&8fAEBKY6S+H#$R5OJgL#p z@JD9)2_AVGSHT6il3ae{I#<VSoPoE&QjkbGp5Bq3Y@O<Bm!CNvp_w=yUleLX>*HWH z)I+{geu2qv*{0}-Wwi>dIs4(-j=i<{_;H*QM<fI!FtPC%d&Mc+!;2I4IAhbLuuGT0 z1}c+-*GwVK+E9SHux;GO56?}mDv$VoI)8@r)#1{SIZ)oaI6T9@qx1Y<y9@$>7Lkbl z<b7P};R`093Y{+aPDyl11OFEwU-m>{n*2s^r)$KgxP)WckCbin{6&}oQh`JDP&p*A z8wlDOQUo0abPQjY5m{+Ke~^UYm$<(3zruJ9{_m&B7=uY*Brm4q%D;!H;WF`bSro{# ziRnfW&kW|${BKW?WI%nip7FxK?sI@E0n@L?n4T&Em%x2oLpKdtNgnU?;kGL}+@CCa zsjMAd(n0ggeb*hjz}x11$D_MA)SCPRSAfG})-<K-#4Y|Tx4}pL6`DB9-9sv)csylS zKCe`F?Txja&l0)jJN{@kos^t$VY}l~-6TCJzegzYpF3VB8NlWHPUUfBeb=sRZ*OiV zCV$r2<8)>1!P=uLzd<x?qA92N9`(uoVvRFip|3ai)Ob1x*mmOVOQcN%L}5^a6=kJo zEosZzC3QB1+|n>$_;b?h7Io;_#k0D023xh9B1NT~-?rntjoU%i!Ht$37i{}k$MKRG z?htWJYA6MtXk>V{Fa}qvgj9-WwQQEtNO^j<TD@PD&;9$=@@<%mtPN~_m5@kJ;-VL) zL%};W!M~*8-=~IrLL!bdS>mH=oT2yD_M@Z&Mkk$zKi-O`9<}J&ED?@QkVn*z)3u87 z7NOmJk8%!2;IbQonL*Ak%gdxrFAlH2DCG})PVvaPI59Z7!3jHU+AT?sWbHhHMSu-> zC_VeQ2$hMJH8VstNR^VrD!n5Q9;cJ!hks0TQ-06asG+n+hDqrs<8-j!K;W0moe+VP z2+1MNew2vs_h#@FZlN(`o<uPriz38;QWT&jMOl25<hy`^g-V%4qo5ZI#D>@Y^3Mud O;Rc-b`Rw^@?*9OwUj=pm literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/operations.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/operations.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de8660155793014d1a748cb730a8cd8261240b22 GIT binary patch literal 13954 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/periodic_executor.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/periodic_executor.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..295ec294ce2ef7d012a202ba106fe45d70858e04 GIT binary patch literal 3717 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 H)a(BTFf(~Z literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/pool.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/pool.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8d9179326195bcb18124f0a7f3a4d254fd23b7c GIT binary patch literal 29316 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/read_concern.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/read_concern.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1e0ed5cfbb6da79522fae35369eb22d745167cc GIT binary patch literal 2299 zcmaJ?-HzKt6!uS&^=6Z8*{)jX4Fgh9gIb5OML<-cR@*JA1fg1%n}9TNJd>?AwkMsL zWSeNYVf!Gx<w<x0E_}-sj{sMEGj3A1U17=N<C)|0^PTS;@3q^_e_sCa%SW4z^OsY( zYLM^aR-a;F&cI<V^HMkS2A=DD>oA|yUO24A{d0d%<F#{VP-pcYolawU<4A~9k+G2E zRLDt^ACuEWKP8e!jKm_3xy)7gH_SR6x7bozLWSzZl*eXob@>qP<5qnv+!?qC!ej2h zXP2yV7jEH_HC{O9?w|pAg9TRJfV|0?Ru0$}YrSv=o2<>Y@oX{=L0&Gl4iU|M8BFxj zb)3q3vq^CEo<uUrxaLyz?1tIAO@=9-^K{rFH_N~~<mf4XBR66-h(bQeIN^$DD3p6* zytYJ0qC^_$MC2AKi;kFbX}45J$RhyApGVm=<+n&wx>zfanKHme6?;{D*Z#<Gm_;W- zCVDX(q7G?FM4m2SP0wUbSfnGw7isb|Qe?z=UNLxzuQbnz7I43^Ld2Nlf^kIncw9*> zQSdp|WR|ZIXSd98#h&7F&Lv@d9L-W)1~cNwgtM^3JPZjm6flVx<E+;sd*SEhQ9t&; z19O?DA;&&$^$C_UP-7CP9Supl=bpTN=AJp!%LDB*_uTyr=P0_@Uw&AYA)6_UWRX=_ zLjt7xBIjYJRx}d;t8`>&YCIKJXoVV-S_{SI5$Jj#rH~!3s41R~i@H7e-I3@d=ijV5 zmB~EPygQF%cPvtdyt?tEtJ6E<(epXGtG=XP#G}RJ&fa)=n#G^tI?lUC-DxttZ6iq2 z+w$vtCX#3K?sSof{8+4?rq=XTFNM=Z5m1`siKg^p14@9!ad+In^W5cbCH!!u7K8Ej zGEZ|`FdGogoD&0<yS#QWufvWj>(Ikv0}q>RxirnIaoxeKY_<I5dsXiip*LI`E$ez0 zf^p5<Nif~9k~cA}>MwsjEV()y9?2O8ixa~;@Xdg*8Yt){h}jg~GfKG~IBVtsd~8Tg zrc!7Ti*!XY74}g!5l1Pqv5{YxRM8d_igAY8A4l;bT&GuCeo#&C4Xt&WCPjah=KBy5 z=U344#F4vLU69wk2jUunF8?%`GZD`+o@?Ycm0Uq8rvw`BowQ%|jTueoom^<%dp)c$ z!{RhjsyD1e3HTIAvTUX!02Pw&A!sv7%#@l(>5QYp*U-U4q_yk~S3wOC9!45G5o1F0 zGNy|hg=;G%ww~q9N;c#ve3*TUK}E1~br%{Xm4lkwaGP&Yd8KyoT)2*p*Yn^ifcDPZ z6U!*=8+!LUHEDiv(v(JC!cuJag??<NtpT62j%Nv8)CG`{Z%5gnls}{N0X|fwZ5+hc za+f<5q|t0fWlaRrX7BJ_US^gISJ8C#*W~w?mnueX-cX%oySmZ&f39K@7~W9&=yhoC zg11sKKx~=mk>giKY0;!K6Ks|mxkc%-S(Lsy*`O4N<GU@`EdsO>{#ANm%PHH~vmnYH zBV93z8H1I@P6q?F>2$S?C1};W=0>aDYP8xx-4>$XX~=6h8f=f0$T8UV%APJKaYKww zc&x4FVE5s{qX$2IcSH{l9z3M`KlJwx4*L~<*1d6B1oz66zA;s{#j1HN|MFM=0an*g AH~;_u literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/read_preferences.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/read_preferences.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7df58ffd985eb5706206cafe1ab496d12f77da86 GIT binary patch literal 16468 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/response.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/response.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e3e9c3dc573044301587b5acbb0b0778fb4f1e8 GIT binary patch literal 3363 zcmcgu-EP}96sBa^mL0oIf3m*<16!b5jkR`*uGkg~L$_iWda<l%axoYKR9U2BHL~cC zRMHr}OMu?*33j_D**oZF7ki5BYUfZtR@0<)Z%Ttllqr%Q55IFh-tTtX|NimUZ@+g5 z`G-`B1MP=U)h#fL49QP~S<F5m%;wf{ZD_-LjXCh{a2wuhtiDZpjrq-|d?vZ#v8FzS z#!SSD)3Fp&swbQ(E)Tfu2QX<_>d<-!RqcS`WN5*1HoF2-Hdyn73>{u)E^D2TV{6!e zcAKr4b`#ni)-`Px+85YG({4d~on12RHoFY4uBPtO97<aEn6LfR^?b$vpGwy}$@dek zv=_3p<*`KiIuvo*^$@iei0RaiS<nD*Snz2>eFRnA0JE?b#3KtEthK0twHFT9+M*8D zVHT`!`;kS+N}g%AX<jy;_|l(p&86Bb|D^N|eTEx&wn@LIG1rGe?k)X1g$?<;y#MO= z`A%WTt%*?jHk}EndsK|GBN2%V%9D9@<kB-Rcn8ie|AU4s8y+euW<2xQsZ|R{<|B*O zV%hVCRh<q)!wh7}Bv=r61n)_taW0>-5zP;2iD0W&mv~CDh6c$jk!BK4uh&Q&#iMcR z7$!6eBD9ygP2B=++NlEilSl{@@?SWZ$?(9}d~o2)!B|8LPH7PA4RmyGJbH1!zEod% z4}#Ir-o5+d`QbFU3uQMR><nh%>`oXf?MKla`AwXNaQ|R1JDQ4kSCr3UxBb}>5Y-Fg zP<!47u&`=_A?=2h{pOdR=Ctk?Uj;xkQ}Bt^@D#VbAkPVK(VAc1HbGdj=5s}*e@K7W z{$-1fjx<;Oo@JZ|k0uN>Th7b{e09Nm234VhNp0ROL7+cZ0C3~&G=!z`<jz6Rg03&1 z76{f$1o>I60OI;v=?se_an8YjCvmre;Yx{NNuw2De2Op%vb`P~usHJe91LsF^`L@b zNrz&_6%h0vzaC<K5nv{9zY<~q#RSpW+~@$B%?hH8(ks<4dSi61A?0Jpe4dxKJ#Q*l z5@EaJdHabU<vlIWQ<2ch^W;TXFLh@UGm1Vk^pwaDiAN;SM-pLGXpAu|4VN)OE<;u8 zU|fq>j_s~@>e)|XZveF{$Vn{fYcQo$wT88qWNaBdbd6lqS;NQ=%2kuOrrmr=95Qqv z1l#GwA74!TMCrmiusJ1yJq{Waj|FJdOo%AJK*NGh^f|6>^jH%OqH}CNw?TYt5SqrK zd0e-Mk)N88pF()*5Ts`cj~3LADbH}wAdyN)$OM>cLO-IQi1Mia4r=s1<f!7KTvfJ> z*B*n@XrefyV<C+`oZ3dAsYX80xB2iV(9A9;hm$avn4y&^17P7&Q_SFHaOYFJcSSrS zTvt@Yw5}3}5xD_8GEpN@Q{;zWdTy5Lk!mJ*(zS}SQwM!^DxP{4+?Ko`@)ZW*GNdpZ zA3;?ZV5HlzZ1Y3KntybP_wOQGe`BVs9L}50yS&BVnC#9;55p*ecFgF=*TICt%_W8d zhYLlv)7$Wco`^)#Lmy%w-bFH%6YX;Svyd>zWJGj$5QT8dy-kx?hmm0pbmOH&aZO>? zJhXt687Cz#Cxc#$Jt>7;(hCwR9>+PU{$uF+6>27V?)=(mPgag=g`|HA9kUAi0gmCv z+3EfhKr|{*)#g`Eqe9;F><Z6X5;Lv5ga#9@yn+TfBd?;teM+1b?%x@?0v<&L!H{Ku z=o)@x@;6fXAykFLbs>9qHacxX@U5PcHa(At0JNhaM$dVmO+wG;Z}_@2I9cj`n~BYL M2uGpzJGJ%x|Nk6CLjV8( literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/results.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/results.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0167341fed02f50a8698370c1ce593ac0c0a06d GIT binary patch literal 8805 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/saslprep.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/saslprep.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..104d092e2a39154db278a2b99b00709ccfe11db6 GIT binary patch literal 2445 zcma)8Pfr_16yKR$jJ+5`5-CyJR2@}O8@Gv#F=-lvPzZqrwIT=zX{|=fdS?s^`;VDf zz?P}15-Ew4OYb@K+H=1{`yKY0Q$9j-Y2U0_Sky-CSZ{XT?wdF7&+ol)b9B`F^Orxq z|7~2;UTe8=0oHec#E&pht))>!v4?!z(vj9J1E+gN%Xq8>#L(E#uE}SRrhe3D73dHx zJk?sm-)X_!Z#6m$Z<KtoRb<9a3CIK*0V)HH0#$&<fX0C?bV{v@v_y-b1GR>!zNS^p z-Y0Vbas9|+J`1ER-7p|whpaBnPfawMWNmKkn~1Zh_6DrgswgQ*b|@{`jo9*{gVakH z>Zt?G1BuHpNv*F*bd32$i77fpKcT(`r{P{DQ%Gp+``zBg`Zgm%ayQsg#}GfHvB!uj zNDxY5@7u0tw>?%Pj|Ag^?K45_fRe}-;vnQy5I+`@v>BOOn_pTw(IjeBJuzM32143_ z!xGavwK^%SgY65Pha9{ys4eYZH9ibBzjf;oclT|{>iagYcS4UcF6z#1U3!g9`*5F5 ziQCpKr`_FcG&{Wm-<g2171Y=3ksIAi5A(d6{7w*u?%sYq>iS`@6`nqYExa_8Q8y`O z%oP=}B1{@K5k>{fOR!#duzCf<02%^P(G|bLltorlR7CrT6N#n1V|36J?Fa{k#7BxB zdZFgR3q;Y*@H6xbcQD0Ne_HHo_qAil$dM+CJEa|y8hz~;1E=qd9O-?%uhF6RK!U$a z*CT2zevoB4oMusJ9X&bA?Bl*ZSRa0-^gj9cg(fS{v<?D{mEbHqIE%l6{ifQ#_v$eq z1CUU*UxJJO4|=9aPR8_#%>e@v@-lt;l8~EZQ{{1Unw+7D$nXrj<Wb-{A<d8`a(fB6 z9(Cn5pnkG;NaBIq4blV#U|A(Lhh1?Lg<LXPBlo)UzqP=|frd6ni-8VzD+oDg$Q=!4 zM?Bni+pe_Y01yo_j9SW2D+=8}3gr=x8L5*++Y?X)P?n@Qb!#f8g`@=m9|Y-yoB(v) zFczur#AnX79k{|5gt|gPk;SgqhH{Yyj0NYEZ0^O3yG(47>u0u*G-v}`i0ygd0i)nf zK+kU#Qn{8D-@7$r-hz@Exz9Rw?8)=FfTV41Dwj9ktwm)duPFzQRVHH|<glUekae6- z!Nh$)&Pj(GK;|qTiFVq~RPm|8yQGTl8cbUN+9y|!&~qp_C<o&?Qcr%BY60$}pYfgn zkVbD2NgGKOC%86|=**L_9B~6nsvc&w8%g<;aT=4UFjvL@)|~MmKThaJvk%pw%7Oyw zUCr7=ZN>{7fWRy)GQq@HUi^BVtKR!YO}%TGr_-bZeG}YmyVT{(QBB?Uh_lU{-E&T= zuF?cbdp5XOIReL?L&a}EOW(s(RVrFOaf+8gvQ^AHP~8*I#dBViX0}+s4kJFht&|SJ z*!$pLoXF&QpZ~+=v($pYQ0@*?`@r-!f5E7Zab-1E`AJ5smDPt2mhLUBFWgVevuh+5 zbi2XFlzc_W8#_=|$;e5StDcdRVuxByYtouXN>HJ`?YTXc+fN&bxnX<p;L6B<m`rp# z=vED00M)IJGP~bV$}KY!V3dETEK+w)Rp$z1sdWQ86&%t#U;-B6229$xi41I@3N{J_ zR6qtQBh#qh0zAt`QLhY{x`{5s?P207TCZM8hAoSRj%BqfZ4m~wsM}P?vL#m;Nh8PA zy_1YA`Kqs_mtkw{!Q94zwYI*xwEWe|>cUED1b<)cPytNFv&37@WCLh27YnDEXQuMZ ztvvHZp1GZ8zRWXsxcUz<0G5i<8N`y}%-|owtg<PsO#_!PhEP->FqNW#iUk8!`Ck$L E4UOZTz5oCK literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/server.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/server.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..441b8becdc256b3a76f01fcfb5ae97e8331da8d7 GIT binary patch literal 4639 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 J=MHOG{{_9Fi*En` literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/server_description.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/server_description.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12f6186b1cfc75acb7f0f9befd707f89d681c0b0 GIT binary patch literal 6377 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 AaR2}S literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/server_selectors.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/server_selectors.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00c2048d5778217b1010a1655a49a2f8cf9d1537 GIT binary patch literal 5710 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 G(mw%jRyH*N literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/server_type.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/server_type.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47a86af448f461b6fe865196e3630222a43557e2 GIT binary patch literal 446 zcmYjOOHRWu5OtD%LPFsPblU|Dh@X%U0z}0MsFH$&g%qV3r$lw^V7n>lmOW=+%SpIH zwyZb;tZ<5i7-{}~W54lEr{jFRzTXQAp%3&=937u%mHXNN!Uzm7sgar3G!QYtf(A69 z1#Pfl1srfE_OnSWSba8L5N<#xK)toa#;D9mH|9WOH{qgt$=QUTpLHb>1rf6UsfVMU zQ8_Hi2&h?333h^Ivqo0!8#ZNp&Twmqlz7Dth9b=(QDWB*0uplub)xI1Vw@@>aN7^A z)x&Ra@xZ0h6IG;-QO?MxtuMUlHLG?Q0*}M6a$`;@iB-y(6sGQ0O%bsP!EP|{ZwG!j zx*HDOkf?!6^G&^6q(!8NS46@~I0a3`i>IEV+sXK;fL(bI?#1JBy1kPu=2^U@Wx~9X zm#6t=%A|@Y-4usx#?!~b%ge0Z%Afz;O{g^geqL7gQO03L$?>{=fULizVXj&Y!!}yR E58Nw;I{*Lx literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/settings.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/settings.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa1aed6171c3a78688c1748673a0d016324798dd GIT binary patch literal 4193 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/son_manipulator.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/son_manipulator.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2cf1d17290a60034af295621895e4d46e6eed9c GIT binary patch literal 7506 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 G7XAyP6UpEJ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/ssl_context.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/ssl_context.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e3244c2d31a0884f6a93bbbf6f04e35599059ad GIT binary patch literal 3404 zcma)9Pj4GV6yIGtw&NuI-v-(ohN_|%H4bfxszQYtg%ni^PDl)GEu`ssXB<zmyR)4c z$8{8OX)hf34qQ2K;Y%RC!d^M?5#Ypovuk^kMu@fM&3bn{^WN|M-XE_nEY$!0`S<U? zJLfomI)!T<?jOU@pMhXb#~IBtmwBPvai2Nym9oRVgSxuqI{10v#NKn~D~FX>`K`ms zy!58jDKl@^Y0Mmbuts|R0Vlh=o9i+*{Iww>N<tp-*!V`sxcL_x;j{vj<7)<P9>dTt zL2#$zf(jmUJ0<oWY+Plvw@zn<SJ*78zjfZYohqAS^YE<37T7tMXL*I!`0N|6Q)ln9 z3+&=sw=>7CvrFtU+|9Ea>>68yy9IV0lw3;dQ|<g8UB`Jx=VrZ5;A;1Uo~o~jACtB1 zr$mcLguWt160O7LbTiUZG9t;y^kqy|oA>M{-GL!Ya!q1cz=A{^RxwSaB8id-S4O}Z z)AtP-%0b9Tm)oC<IFL~S&~-yjhQjpinM36#RLkIin-hoLYd#>42*~Ec+=dr&K%#** zB=NPzql^q>NQQk8^s^UTPGk(D2d8tgy|dNcTHo5FACo}F+W4{2RuRT~BIb;U*scT1 zNhH}I<V~y5<aYqa;k{J?$SDr0gX0<est0yP{%a8pqTDRQt=WE8gu;xP_GwzBf!`A$ zPiJWWkl5QAJ>aAK;aLB4o*r@~dLs%t@W2D!;Ds}ebr|{<2<99+G?PFoxc81-kR?;z zpMkl;93X_-YE)GTR;w}!WTUEpNK0U3I=jBH)26Mh)`qIW!-kiZH4l4fZLG^Lj>7o) zCtOLCIP?u)IrP;^Plk*uy%HR(nDB0|`}&aG*AM8YL3ea;ceQskjDk<#+KX4(D~U*! z1!5hB%j#h~kmA+hN-~OMyeB6!=t99G7*fq-l-4K}u`rZ=2xsd$2*<7DpQFoDPBzEu z0wB7*aK>RlLOYM0eG9`;zYPQ!n?(R%4FOAnzSKMh#(=PtP=mmTc+b*ctdVu!BxZbL zlmO!Mj0QeimT{Q-7#B5M3ouNmxP>nh3;1;o#4-$R-8yr^nz45O!<s*y^&!T%jZ>pW z7_J#-h_sIr4hG&P$TQIs0XPmLoRPj9!rF;JUEcQ(!H{0|Yg~w^^n4NOW|ktR=GsV` z1k_{?OcN6t-Ldgvziw@}pKi6*HZcoK*6eJ2^X=1}jW4s1$l<coI}@(XMN0R$DaOP7 z0(eU&sBmiG*@1&Tv0>sc7sA6kTHNIZ!qo<GA?%tha9|b_){p7Tp&t(TDR-iN`lNoJ zPxSMSPU?4RVJpC}#0%$1WM6<UnS#e2M6sKx>Hh|--jqHgK9JZ(B7w|deTtbakV<i# z$e1B{3vNd*!s|TWOq~WChJ|C7;uesH`^Y07YCyaP2^rH8X2k7{uMwRHvNuMA522X_ z$Yi&|dBoRb$ion4KOT{I5Oo1vNWklBMZKV8aE{5dz(x*Pq8kbgYUDcS+`SEZ4d7X9 zM1c9!+LR|wqOB=+fW#Ah62Jl$-^q)E6tT%HvnHK1q6lY`Y{4mND0Ehzke?Qs0^&mf z#z7Pq=ma2Auqckv9os%7cdOw|^KPS*F{w6QpH_1lPO&OIAA+ZCk)S~z@LmH>Xw2VE zt>PYCFR=d9!m}y$4(ET(nFNeP&)l5)52GKUmI`pb`O*4X<D}CD`lQPsC<KG-@*io( z=GK=#6k_WoX3i{6K~E4*+&0M)SdfY!y0(Ii@vG!zbcPM0XmlF8s}_>{v`}UlO>ZKC zdCD#HZ_P6oKWPV8I`G07Q}#Lxjn&9F`!0s(J_P4}2}5+h3<C=8e&x7yTxRZ1vo^0h ze+F#~c2)ef(6*#(XT4M2+2CZuS8+2?fO>4RB=~mMwmuV7WOttjW(r56rY?da3KK;- zr?~=KsTK_S3iKmY{FR31P*LFp7P+(*_?ApMU1X91;!O8}y;R0nbYs{(y`l#RMvbP* z-`nGia@o_+In?YSg^n!iAZ#yz+0mA|%sZ8g-DNaPUBh?RQQSar1qC(|nXr{`3BK;a z&}fKLsk>#@gMlB<J-SvPdExlR%vsG$mZ+iC@mj4$`ANIoYMjF+BK9LrX<Db)NkKOU z_w$s#8u(%Urb;Q30X&|CJRVA;DOK?Q!Lbbx_N^mZusch1s?IwV>D1d(X+E7RFkfAQ z&DB*DXnp|_3y#GFS-J>ABYd@b*>l{oSF6rfYt>r0?$zh&Rs5@>a2>$$0Zh4@o<@mO kW<x2d(n>}fyXvfC(%Pd8lP}KWS(qZqp6AZH=iEx^UzUKYLjV8( literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/ssl_match_hostname.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/ssl_match_hostname.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dadec6175236092444a8f0311b3b6fd526d65640 GIT binary patch literal 3010 zcmZ`*L2nz!72cWMC6_CbW&|U#1EUzEa3U%a8QF>B2Cfl7mIJk}<Vud+vQF96&QMx% zxx1bj$|SM8gf8G?&pr9tf6!xZ1@aT-noIo$S~RD=nWY$2Kz1>2XJ_8L_vX!e-<#XD zn*ZN7|9rl?YFXb~7oIBgzl0`U1ECg0vDGQQsDmaA7{M_f+8rBN&#dHzV=-so^LxnB zFSV)j%Ies^w-Wq2i=n<tt?L$b2NpkMrA|5VXvuJtzp`kVdao?%F>h{nDzrg;y7CHj zd|IV7kg-DR^a^~d6dhU3ciw_E)_xNyKgzlRrJM;7B0UI?{_3^^O*lZP1#8g$-+-v{ zf}7hgVaN}no$=@_kgR<c@OCeaDdVCY4%#x_>K%{I=%?cI?q}igWUzI+H+?w_KY`~Y zX+LRaQMMT+LI!cX$$ycI(&)umJDUvC<Ro2wg^0VuK!&H?(^SYL7_wG2QQo~c7#`E$ z{))B|n#D^%-fFXcdMA0Y6Js}Q#ytz-5&Ll~+&!1`4s?vv5IW08d*w@LLLV!$I*3{w zY&?opV~24W^`a0QvCDbN_nWrzx?OE>x2ybacbL*qtozk&_r)lPi<t}BjZ2LQ6_9^b zE5blL#P$DMtv%E{`thOZv)O?r{te{Bn%Oy6rp?K%J_Obr&79n!_H}FK!q=hhpE2}H zx!Xsy1heJ5oa2GRA4yEh5?0UAd(gf`d0G4kWH@sxN16^W$aHCGfVs?V2t#j<kd@pA zNhMmDBk>yeOppIn&&zV(%iTFLT-Pp+^eZ|r=U^MM#y9fP1M8csGjGWOa`nuMzdy4; zh6&#ON^WbrX#G7sR-NNnC9m{rIdDQ)UYVZ$Mh8cfoRA<4Q%-eHrsVM94!N^+>$43a zSSX`3A$MAzwr=}Af#+1p?2C3=rfDo%5tF@E%1_#-au~OHFVxF^zF4(ctkR1fD%9fo z5O@v9zC!EM4Uj;FK{6pPqnL&Pr-DQY34aU)@?ign=#&0}Ox-{HvGvWzQ)irPZcg#@ z^<rQhy4%oN&^pb!azz$LQn_I|N~Ae?<#3j9<;Lkt##JfEGL}%~L*8&HUPkg%Va`;E zi7?2RDg$#IgwP4oVHU+qIsG(Bl)v}Y{=wny&i2u+a!o=teT8YFyz{(LwP7&sE_b4w zERaIEnO38`nDyikGEh}G8wODVS*|J<n0q`pQ8p~O5YalARlQ3SVS?Rgy#`}q9f;*R z2wv<X4^=gFF{;}RYPg<VMOWQb`<m^etM~@u9|3o$b3s2k1#~l^ucb*#A|1SaJO?_% zInI#|*(RF4-W>;_gd<vnNZKQNkI4eVm}nK@a2_j!jluU}B;yI8DHF*@l2F!*5=MfA z1o27A!P`U9OF5CJkub5eb{=0_t<PJx$R_#VU?d4BIttT_eb8(fuBOek{eTFgBnnds z=f#EOQ3fbciZbmURn`a5jWUI!?6MOZFupLmK*L{yG=t7oxq<j5{4E{i!Os<F#z9XZ zVl^&EC_Xy3Ck=@tI7nyO3>QTQ9BB726rQ__!h>hHC^`kI^Z`YB7G$0?KF%G;+0Ju3 zb2XAs2QcB=98)~-_?dL`5=h4UjB3QN`=uOk2J-naaJs<x*l<?(8(9WU44iK+b3TK0 z;)n4=jX$)cwSvAov-0?pybQgyrRFlo`);Z6Uzg;3_sn|n4?q#XmN}x{!1)W}AIb`? z<cRuxU#`e1%m5Dc@Vf@{l8q%V2Hsx*?@Eqxn^vz|OCAqKYubxiTeCj>&r`;u-UNan zkYrt_{W@6#0H91CG1Y+rp+^EiIFlouz|ir;#KY0iqoXt&Fxfg`GGmPE#cR!G5vojp zNJiGrGjqK~44~b*yLA^rkuK5A$l_2|1PM3;eX#}!x`^w`C5c2}NDv7y1MsjHMDd8T z7CA_W7=<C+0XB@<-Y7AMSqL|V3zDP|@ySUM%~Q#SnVb;FgCxBOcN>NM%Ti4e#sCuo z0{bPxY*;VSe_@(PHkN>#@{}+jjFX++!zbN?$4~YS_O~BtMl*1@``fSg4tF2ytGXB+ z_W{ngW4W(0#s+kq`jFAv#T`bK7Yxb=@Pm7V<}z?S{qWqE<R)Jxx50&T<&d&B#T0Ll z>5ZS}y~#}pnEn#>4M5COxcflGhuxg3(`Ns_nWPu77`y=Jt&eDw&}L2fPxaly+!PEl z@HNO-RsFg^2Q#j0hz)~%TwexEk}ErAiKz<weZ9aQ1{sH2r`7b7qhpBwOtXHh=ez~( z3T2BRQTBjMxW)$f9UWf=n7Z-B^5C8VpSTai@*L#Z7&Xu;V6=m(s1A6&YI?=DjvRXx zklRCg9(sW3?;E;``8|-(MCJ&ZHU2LAf%b_|l_i`NxVW-6%u+6keOJ%m1_>p*8zsF| zl^2L<Jj8E-h+_Y`C>Wm@B^UOii-Wn!!7Z`4bluliC82ADhdhjN1I(-2byUKh-EjQd H-pc;~wO$fr literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/ssl_support.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/ssl_support.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..477328e73ea27a992c2a3205041c2c577cf89b52 GIT binary patch literal 3834 zcmb6cO>^7E6<B~I_#uj-J}k$Hi)ow2j2)`B?6}EfI#p;Y)>t7GlJN)X7J>*+0to`l zVyT!Mu+s_KbA9NshfYsT{y<OdwU_>az4qiwrq}k=_ZB3@sF`UC&VIdp``+8P?~A)D zE17@({;$uQ*Cpxi($e=mnEwP?_<<}*wq!`QY!gp5WHAzhh*2>VTQSs8POK6};)&#M ztCExKW#|K0!k?`g>NCkFPjQwS6$GYcXmBnC*c&r!KgM2Qrbioqnea0GtdRvOijiKz z{@pjQWjpER`YXl?;K_E%%lB7}RatVBZec1JYc{cp4(YDj#MXXIu1fYsFJWvr>Pwm4 z5b|WbM1RxRlqKNs-B=#j%gyAM?X0&I@6V*m*(<-2j4O8DUWIYnF4$`@UiAxhakjG_ zLu}HNN}J<r&Ea4WP^NbRsyCa5y6fvlqmKjsG$_A9o!46XC7Ej#hq8Uwb6}ng8Fl?r zlZ^(rELH-)<DL$w#oWNJQX0@#1P;DZuuDM)NEsjvc+7dh+PH}yjw-YYw6FzT1P|EL zXfBeQ5`z_!r-Z)E2veeXrpB|040}p90WAqF)lqs$`k^?b*(8!W@|HA}zW{1*MP>ZQ z$Cl^X7ISoV=ICv>h)$i)LfxW{evVsZ{ebEHVaW6oN3R9Gqk}HQ(7_`aefF_4>WCvl zC)AIR!_X^Ns*RRetJkW>$G4V2^`q87y|#CFd<?V}1eVS;s-Jv%(5OB*J}xh|YvZ4` zKthmd2qJX!H^YTgu{7`NmzV<2g%k^xDE$R^!Kjqx88>wOkXb$`0bhrw&aBX4jB*9Y z@YJcp#45eG7GDw5IqlhUPLpRqwL?d|d5Q33FhCRF32}ojCAtng{^jiqsCy3T-#NGF zPABkehlV@t-VXC_cTQfM+jqnJ=DqgGsCRp}Gyc5a{vmv){!VLW;11pq@_ODo^gVwV zxSyTx3`Tu4&cz6Vn_+Cj<-v#-#ft(r6Cc{dhyD@TR{=UHp~<SeA!o=2j4Gj<0Bhq0 zeh^E9NeXi;!-7duX(B~Z7Yu1C%khlhjFGMaa5aWn30na}Q^)T%9j2R44r-{grp^N0 z^1+{Ch2w*M?xN;d$O7t=D=_PTN0m9L>~XbGueWNYBt@?<G|RRH7Ei)eUbu{F)H!uS z=1`t!dqL>%^nww%mxg4Km{57#Z2%#jH@(2J%{k+T01GqFNorEgz%NJW8?ag^AqR^q z&_03|J_cDL>3M1*Psl`>sFTDbIY~tc;iWnQ#rPyjOf>XRCfNia>QtG^lQc_2X<GsB zea@2faiqacs;9s#6{SthPuePu0xJPne~Hqn)J+R2Njo)F>hKa~dI_q1D>VJB(99AP zBT5<qrakIJ%51K)OgB5pM1ThYH`^ohA27etlU~Z9HiPDS1WpxTwT*CEU^#mgV@j0n zu0(P~B4w(`lAoKer$mJ4yDFGXH{Z*^nG;!>KzbN&z}Z5Sokyi7(lbm2@+A9<>{F3^ zqU21n-wKVaO@Vj#1)M4(N1(R~+A092wJ0e}PMzU@C1An~{XayBSj#U7Jrs1-kq-SE z;1s7|-Tp7(-s_NH6o7s$Fg69o*MPAhFn&J6AV8zcHbuYnn=LT-E5K2M^%mPk%qMVz zPo#$QR6+^ZmF`uP%fHTE1Dpo}cCGvR6rwOdHMq%^(47YNcq2-Kvs@j&RiO^XWXrc9 z9J3+y(OWLkgdUu9oi;1i`1(<!-l|vXhi2=rX;uyos<jr+x6hn*&pZo4=39MdpQqyB z6Y^~R2qLlxl+N!^bn0cuE?<kcEA@|$8r5bKqO`FdgBsOZ^`m<0U=Kq#O~6Tt+3Qsr zXG!SBkCu}q2A+Y_HwRW24$i0*I+#|5E`{VU7_qa!*YA|?m*2ao-x!PrBUs!k-@aMG z=)7Cry*Vx&#bHtJIV0T;oX~#@vXI5vXCg<r9k&hoc^|R>&z(Ee?TpNhXPt)Q>SZa~ z)I;C@pV<TdyEl1JL<ZaGSVNDAXc_VZ1d81|d^>cQIp3M_9$4%w90!<KE<)?E?uNP_ zFdd*5xlp{RAL!u-0#;wI>@8m?)Z4+(voY1801jl|n5GrWAV|&>X_rgN#Y52V!yA-{ zcnZ;#uG1{O%_?>pb{M|+>cU=x4eU}3cn~j-p6%X0I{dUrR}l3(*y*^VfSf|bAtW!; z^`R2NvV^Y+1&K7$KC@h(Yd}xrI==b1+Bn#MW>y-9X60eE^2j`_?(Nez@z|y~Hq)9H zz#{_Lkp2Mow1H<apx>uAaJlwy?{Rez$6NJAm9H$8hxN)MdJWJ-gyt%mInRj`m|qU| z4|ocN14Ds#J9DVRvoo&!z;;SGu3Gdoq^~2V6c`!Wh>^K4SI8POo%6J~B_>NFHM1t3 z7q+<YFp6oED{c0IlXI6V&WrZtWU~tOgDLDIuJjBz5q6-Hw4z*061kvc<h-U4$UVs| zd5gdgau9)*RJP=8m?cSp6d*+t`8sANgeV%!aGoPMNZl~PswiXrD#&>l3k0!}GTj4C z->5FJ#u4ef2ouOq@=|Sx<*zcnQ3Ep#JsmVQ^qgBdwOsJy|Ey@s<J#rY3@jhqL_Zla zy=|fIf<@1Z4=`#(zo0z#6YJb^J?q4CY9(1%8QAk02*(rlu-_kD(x@m<{sh}08l*&2 zvPjhPYDFY!G<&?BD0=_ji~ToA%L`Fu`XMm7EF)_D&(K1wTqH7gP*M25##5$g2W``& z+ptM*LdVlsM_V@hg)lT>&fr$Uk$Lu@kN-u4kI{R0;9czQKxgFUH4GL{ag~%m2?HOB zzTI}vhwvmyS|dLz5X%n!6A5EiRu6-AkM1Hd;Ze76_BM7HHjMT8nI+>Dx)-h|>}u)O zSk+QdU1=Z0cJpJ5K;b@gD$!*45fv;q2iBPpGlYSq&Y<xe?HS5ZQUq@xVDkmJNVI}h J%=}DC{u_bJ=yw1B literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/thread_util.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/thread_util.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e80750112062f115e612c07eed2ba174d3d2b55 GIT binary patch literal 4190 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 Loo=hU*RB5#w=Z5W literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/topology.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/topology.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a14ff02647d69a705669837c7aa8e09b2025de79 GIT binary patch literal 17463 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/topology_description.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/topology_description.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c472e7801a78be13cab909bf5ec64afbcefdb5a GIT binary patch literal 13509 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 OgJ!vveIt7`tN%ZDisRq_ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/uri_parser.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/uri_parser.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b08a2ded0e91a6fa72e7bf5613ba529295e9efe GIT binary patch literal 11222 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/write_concern.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/pymongo/__pycache__/write_concern.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0fd811152c99e6b49ef7301455de313d13d654b GIT binary patch literal 4597 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 QfJmdrPcAA~t8yv&FD01|4*&oF literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/_cmessage.cpython-36m-darwin.so b/mongo_mac/lib/python3.6/site-packages/pymongo/_cmessage.cpython-36m-darwin.so new file mode 100755 index 0000000000000000000000000000000000000000..a1d3479fe636210823e4b3814c9ab891e4464681 GIT binary patch literal 31272 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/auth.py b/mongo_mac/lib/python3.6/site-packages/pymongo/auth.py new file mode 100644 index 0000000..3667257 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/auth.py @@ -0,0 +1,570 @@ +# Copyright 2013-present MongoDB, Inc. +# +# 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. + +"""Authentication helpers.""" + +import functools +import hashlib +import hmac +import socket + +try: + from urllib import quote +except ImportError: + from urllib.parse import quote + +HAVE_KERBEROS = True +_USE_PRINCIPAL = False +try: + import winkerberos as kerberos + if tuple(map(int, kerberos.__version__.split('.')[:2])) >= (0, 5): + _USE_PRINCIPAL = True +except ImportError: + try: + import kerberos + except ImportError: + HAVE_KERBEROS = False + +from base64 import standard_b64decode, standard_b64encode +from collections import namedtuple +from random import SystemRandom + +from bson.binary import Binary +from bson.py3compat import string_type, _unicode, PY3 +from bson.son import SON +from pymongo.errors import ConfigurationError, OperationFailure +from pymongo.saslprep import saslprep + + +MECHANISMS = frozenset( + ['GSSAPI', + 'MONGODB-CR', + 'MONGODB-X509', + 'PLAIN', + 'SCRAM-SHA-1', + 'SCRAM-SHA-256', + 'DEFAULT']) +"""The authentication mechanisms supported by PyMongo.""" + + +class _Cache(object): + __slots__ = ("data",) + + _hash_val = hash('_Cache') + + def __init__(self): + self.data = None + + def __eq__(self, other): + # Two instances must always compare equal. + if isinstance(other, _Cache): + return True + return NotImplemented + + def __ne__(self, other): + if isinstance(other, _Cache): + return False + return NotImplemented + + def __hash__(self): + return self._hash_val + + + +MongoCredential = namedtuple( + 'MongoCredential', + ['mechanism', + 'source', + 'username', + 'password', + 'mechanism_properties', + 'cache']) +"""A hashable namedtuple of values used for authentication.""" + + +GSSAPIProperties = namedtuple('GSSAPIProperties', + ['service_name', + 'canonicalize_host_name', + 'service_realm']) +"""Mechanism properties for GSSAPI authentication.""" + + +def _build_credentials_tuple(mech, source, user, passwd, extra, database): + """Build and return a mechanism specific credentials tuple. + """ + if mech != 'MONGODB-X509' and user is None: + raise ConfigurationError("%s requires a username." % (mech,)) + if mech == 'GSSAPI': + if source is not None and source != '$external': + raise ValueError( + "authentication source must be $external or None for GSSAPI") + properties = extra.get('authmechanismproperties', {}) + service_name = properties.get('SERVICE_NAME', 'mongodb') + canonicalize = properties.get('CANONICALIZE_HOST_NAME', False) + service_realm = properties.get('SERVICE_REALM') + props = GSSAPIProperties(service_name=service_name, + canonicalize_host_name=canonicalize, + service_realm=service_realm) + # Source is always $external. + return MongoCredential(mech, '$external', user, passwd, props, None) + elif mech == 'MONGODB-X509': + if passwd is not None: + raise ConfigurationError( + "Passwords are not supported by MONGODB-X509") + if source is not None and source != '$external': + raise ValueError( + "authentication source must be " + "$external or None for MONGODB-X509") + # user can be None. + return MongoCredential(mech, '$external', user, None, None, None) + elif mech == 'PLAIN': + source_database = source or database or '$external' + return MongoCredential(mech, source_database, user, passwd, None, None) + else: + source_database = source or database or 'admin' + if passwd is None: + raise ConfigurationError("A password is required.") + return MongoCredential( + mech, source_database, user, passwd, None, _Cache()) + + +if PY3: + def _xor(fir, sec): + """XOR two byte strings together (python 3.x).""" + return b"".join([bytes([x ^ y]) for x, y in zip(fir, sec)]) + + + _from_bytes = int.from_bytes + _to_bytes = int.to_bytes +else: + from binascii import (hexlify as _hexlify, + unhexlify as _unhexlify) + + + def _xor(fir, sec): + """XOR two byte strings together (python 2.x).""" + return b"".join([chr(ord(x) ^ ord(y)) for x, y in zip(fir, sec)]) + + + def _from_bytes(value, dummy, _int=int, _hexlify=_hexlify): + """An implementation of int.from_bytes for python 2.x.""" + return _int(_hexlify(value), 16) + + + def _to_bytes(value, length, dummy, _unhexlify=_unhexlify): + """An implementation of int.to_bytes for python 2.x.""" + fmt = '%%0%dx' % (2 * length,) + return _unhexlify(fmt % value) + + +try: + # The fastest option, if it's been compiled to use OpenSSL's HMAC. + from backports.pbkdf2 import pbkdf2_hmac as _hi +except ImportError: + try: + # Python 2.7.8+, or Python 3.4+. + from hashlib import pbkdf2_hmac as _hi + except ImportError: + + def _hi(hash_name, data, salt, iterations): + """A simple implementation of PBKDF2-HMAC.""" + mac = hmac.HMAC(data, None, getattr(hashlib, hash_name)) + + def _digest(msg, mac=mac): + """Get a digest for msg.""" + _mac = mac.copy() + _mac.update(msg) + return _mac.digest() + + from_bytes = _from_bytes + to_bytes = _to_bytes + + _u1 = _digest(salt + b'\x00\x00\x00\x01') + _ui = from_bytes(_u1, 'big') + for _ in range(iterations - 1): + _u1 = _digest(_u1) + _ui ^= from_bytes(_u1, 'big') + return to_bytes(_ui, mac.digest_size, 'big') + +try: + from hmac import compare_digest +except ImportError: + if PY3: + def _xor_bytes(a, b): + return a ^ b + else: + def _xor_bytes(a, b, _ord=ord): + return _ord(a) ^ _ord(b) + + # Python 2.x < 2.7.7 + # Note: This method is intentionally obtuse to prevent timing attacks. Do + # not refactor it! + # References: + # - http://bugs.python.org/issue14532 + # - http://bugs.python.org/issue14955 + # - http://bugs.python.org/issue15061 + def compare_digest(a, b, _xor_bytes=_xor_bytes): + left = None + right = b + if len(a) == len(b): + left = a + result = 0 + if len(a) != len(b): + left = b + result = 1 + + for x, y in zip(left, right): + result |= _xor_bytes(x, y) + return result == 0 + + +def _parse_scram_response(response): + """Split a scram response into key, value pairs.""" + return dict(item.split(b"=", 1) for item in response.split(b",")) + + +def _authenticate_scram(credentials, sock_info, mechanism): + """Authenticate using SCRAM.""" + + username = credentials.username + if mechanism == 'SCRAM-SHA-256': + digest = "sha256" + digestmod = hashlib.sha256 + data = saslprep(credentials.password).encode("utf-8") + else: + digest = "sha1" + digestmod = hashlib.sha1 + data = _password_digest(username, credentials.password).encode("utf-8") + source = credentials.source + cache = credentials.cache + + # Make local + _hmac = hmac.HMAC + + user = username.encode("utf-8").replace(b"=", b"=3D").replace(b",", b"=2C") + nonce = standard_b64encode( + (("%s" % (SystemRandom().random(),))[2:]).encode("utf-8")) + first_bare = b"n=" + user + b",r=" + nonce + + cmd = SON([('saslStart', 1), + ('mechanism', mechanism), + ('payload', Binary(b"n,," + first_bare)), + ('autoAuthorize', 1)]) + res = sock_info.command(source, cmd) + + server_first = res['payload'] + parsed = _parse_scram_response(server_first) + iterations = int(parsed[b'i']) + if iterations < 4096: + raise OperationFailure("Server returned an invalid iteration count.") + salt = parsed[b's'] + rnonce = parsed[b'r'] + if not rnonce.startswith(nonce): + raise OperationFailure("Server returned an invalid nonce.") + + without_proof = b"c=biws,r=" + rnonce + if cache.data: + client_key, server_key, csalt, citerations = cache.data + else: + client_key, server_key, csalt, citerations = None, None, None, None + + # Salt and / or iterations could change for a number of different + # reasons. Either changing invalidates the cache. + if not client_key or salt != csalt or iterations != citerations: + salted_pass = _hi( + digest, data, standard_b64decode(salt), iterations) + client_key = _hmac(salted_pass, b"Client Key", digestmod).digest() + server_key = _hmac(salted_pass, b"Server Key", digestmod).digest() + cache.data = (client_key, server_key, salt, iterations) + stored_key = digestmod(client_key).digest() + auth_msg = b",".join((first_bare, server_first, without_proof)) + client_sig = _hmac(stored_key, auth_msg, digestmod).digest() + client_proof = b"p=" + standard_b64encode(_xor(client_key, client_sig)) + client_final = b",".join((without_proof, client_proof)) + + server_sig = standard_b64encode( + _hmac(server_key, auth_msg, digestmod).digest()) + + cmd = SON([('saslContinue', 1), + ('conversationId', res['conversationId']), + ('payload', Binary(client_final))]) + res = sock_info.command(source, cmd) + + parsed = _parse_scram_response(res['payload']) + if not compare_digest(parsed[b'v'], server_sig): + raise OperationFailure("Server returned an invalid signature.") + + # Depending on how it's configured, Cyrus SASL (which the server uses) + # requires a third empty challenge. + if not res['done']: + cmd = SON([('saslContinue', 1), + ('conversationId', res['conversationId']), + ('payload', Binary(b''))]) + res = sock_info.command(source, cmd) + if not res['done']: + raise OperationFailure('SASL conversation failed to complete.') + + +def _password_digest(username, password): + """Get a password digest to use for authentication. + """ + if not isinstance(password, string_type): + raise TypeError("password must be an " + "instance of %s" % (string_type.__name__,)) + if len(password) == 0: + raise ValueError("password can't be empty") + if not isinstance(username, string_type): + raise TypeError("password must be an " + "instance of %s" % (string_type.__name__,)) + + md5hash = hashlib.md5() + data = "%s:mongo:%s" % (username, password) + md5hash.update(data.encode('utf-8')) + return _unicode(md5hash.hexdigest()) + + +def _auth_key(nonce, username, password): + """Get an auth key to use for authentication. + """ + digest = _password_digest(username, password) + md5hash = hashlib.md5() + data = "%s%s%s" % (nonce, username, digest) + md5hash.update(data.encode('utf-8')) + return _unicode(md5hash.hexdigest()) + + +def _authenticate_gssapi(credentials, sock_info): + """Authenticate using GSSAPI. + """ + if not HAVE_KERBEROS: + raise ConfigurationError('The "kerberos" module must be ' + 'installed to use GSSAPI authentication.') + + try: + username = credentials.username + password = credentials.password + props = credentials.mechanism_properties + # Starting here and continuing through the while loop below - establish + # the security context. See RFC 4752, Section 3.1, first paragraph. + host = sock_info.address[0] + if props.canonicalize_host_name: + host = socket.getfqdn(host) + service = props.service_name + '@' + host + if props.service_realm is not None: + service = service + '@' + props.service_realm + + if password is not None: + if _USE_PRINCIPAL: + # Note that, though we use unquote_plus for unquoting URI + # options, we use quote here. Microsoft's UrlUnescape (used + # by WinKerberos) doesn't support +. + principal = ":".join((quote(username), quote(password))) + result, ctx = kerberos.authGSSClientInit( + service, principal, gssflags=kerberos.GSS_C_MUTUAL_FLAG) + else: + if '@' in username: + user, domain = username.split('@', 1) + else: + user, domain = username, None + result, ctx = kerberos.authGSSClientInit( + service, gssflags=kerberos.GSS_C_MUTUAL_FLAG, + user=user, domain=domain, password=password) + else: + result, ctx = kerberos.authGSSClientInit( + service, gssflags=kerberos.GSS_C_MUTUAL_FLAG) + + if result != kerberos.AUTH_GSS_COMPLETE: + raise OperationFailure('Kerberos context failed to initialize.') + + try: + # pykerberos uses a weird mix of exceptions and return values + # to indicate errors. + # 0 == continue, 1 == complete, -1 == error + # Only authGSSClientStep can return 0. + if kerberos.authGSSClientStep(ctx, '') != 0: + raise OperationFailure('Unknown kerberos ' + 'failure in step function.') + + # Start a SASL conversation with mongod/s + # Note: pykerberos deals with base64 encoded byte strings. + # Since mongo accepts base64 strings as the payload we don't + # have to use bson.binary.Binary. + payload = kerberos.authGSSClientResponse(ctx) + cmd = SON([('saslStart', 1), + ('mechanism', 'GSSAPI'), + ('payload', payload), + ('autoAuthorize', 1)]) + response = sock_info.command('$external', cmd) + + # Limit how many times we loop to catch protocol / library issues + for _ in range(10): + result = kerberos.authGSSClientStep(ctx, + str(response['payload'])) + if result == -1: + raise OperationFailure('Unknown kerberos ' + 'failure in step function.') + + payload = kerberos.authGSSClientResponse(ctx) or '' + + cmd = SON([('saslContinue', 1), + ('conversationId', response['conversationId']), + ('payload', payload)]) + response = sock_info.command('$external', cmd) + + if result == kerberos.AUTH_GSS_COMPLETE: + break + else: + raise OperationFailure('Kerberos ' + 'authentication failed to complete.') + + # Once the security context is established actually authenticate. + # See RFC 4752, Section 3.1, last two paragraphs. + if kerberos.authGSSClientUnwrap(ctx, + str(response['payload'])) != 1: + raise OperationFailure('Unknown kerberos ' + 'failure during GSS_Unwrap step.') + + if kerberos.authGSSClientWrap(ctx, + kerberos.authGSSClientResponse(ctx), + username) != 1: + raise OperationFailure('Unknown kerberos ' + 'failure during GSS_Wrap step.') + + payload = kerberos.authGSSClientResponse(ctx) + cmd = SON([('saslContinue', 1), + ('conversationId', response['conversationId']), + ('payload', payload)]) + sock_info.command('$external', cmd) + + finally: + kerberos.authGSSClientClean(ctx) + + except kerberos.KrbError as exc: + raise OperationFailure(str(exc)) + + +def _authenticate_plain(credentials, sock_info): + """Authenticate using SASL PLAIN (RFC 4616) + """ + source = credentials.source + username = credentials.username + password = credentials.password + payload = ('\x00%s\x00%s' % (username, password)).encode('utf-8') + cmd = SON([('saslStart', 1), + ('mechanism', 'PLAIN'), + ('payload', Binary(payload)), + ('autoAuthorize', 1)]) + sock_info.command(source, cmd) + + +def _authenticate_cram_md5(credentials, sock_info): + """Authenticate using CRAM-MD5 (RFC 2195) + """ + source = credentials.source + username = credentials.username + password = credentials.password + # The password used as the mac key is the + # same as what we use for MONGODB-CR + passwd = _password_digest(username, password) + cmd = SON([('saslStart', 1), + ('mechanism', 'CRAM-MD5'), + ('payload', Binary(b'')), + ('autoAuthorize', 1)]) + response = sock_info.command(source, cmd) + # MD5 as implicit default digest for digestmod is deprecated + # in python 3.4 + mac = hmac.HMAC(key=passwd.encode('utf-8'), digestmod=hashlib.md5) + mac.update(response['payload']) + challenge = username.encode('utf-8') + b' ' + mac.hexdigest().encode('utf-8') + cmd = SON([('saslContinue', 1), + ('conversationId', response['conversationId']), + ('payload', Binary(challenge))]) + sock_info.command(source, cmd) + + +def _authenticate_x509(credentials, sock_info): + """Authenticate using MONGODB-X509. + """ + query = SON([('authenticate', 1), + ('mechanism', 'MONGODB-X509')]) + if credentials.username is not None: + query['user'] = credentials.username + elif sock_info.max_wire_version < 5: + raise ConfigurationError( + "A username is required for MONGODB-X509 authentication " + "when connected to MongoDB versions older than 3.4.") + sock_info.command('$external', query) + + +def _authenticate_mongo_cr(credentials, sock_info): + """Authenticate using MONGODB-CR. + """ + source = credentials.source + username = credentials.username + password = credentials.password + # Get a nonce + response = sock_info.command(source, {'getnonce': 1}) + nonce = response['nonce'] + key = _auth_key(nonce, username, password) + + # Actually authenticate + query = SON([('authenticate', 1), + ('user', username), + ('nonce', nonce), + ('key', key)]) + sock_info.command(source, query) + + +def _authenticate_default(credentials, sock_info): + if sock_info.max_wire_version >= 7: + source = credentials.source + cmd = SON([ + ('ismaster', 1), + ('saslSupportedMechs', source + '.' + credentials.username)]) + mechs = sock_info.command( + source, cmd, publish_events=False).get('saslSupportedMechs', []) + if 'SCRAM-SHA-256' in mechs: + return _authenticate_scram(credentials, sock_info, 'SCRAM-SHA-256') + else: + return _authenticate_scram(credentials, sock_info, 'SCRAM-SHA-1') + elif sock_info.max_wire_version >= 3: + return _authenticate_scram(credentials, sock_info, 'SCRAM-SHA-1') + else: + return _authenticate_mongo_cr(credentials, sock_info) + + +_AUTH_MAP = { + 'CRAM-MD5': _authenticate_cram_md5, + 'GSSAPI': _authenticate_gssapi, + 'MONGODB-CR': _authenticate_mongo_cr, + 'MONGODB-X509': _authenticate_x509, + 'PLAIN': _authenticate_plain, + 'SCRAM-SHA-1': functools.partial( + _authenticate_scram, mechanism='SCRAM-SHA-1'), + 'SCRAM-SHA-256': functools.partial( + _authenticate_scram, mechanism='SCRAM-SHA-256'), + 'DEFAULT': _authenticate_default, +} + + +def authenticate(credentials, sock_info): + """Authenticate sock_info.""" + mechanism = credentials.mechanism + auth_func = _AUTH_MAP.get(mechanism) + auth_func(credentials, sock_info) + + +def logout(source, sock_info): + """Log out from a database.""" + sock_info.command(source, {'logout': 1}) diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/bulk.py b/mongo_mac/lib/python3.6/site-packages/pymongo/bulk.py new file mode 100644 index 0000000..bc8c31c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/bulk.py @@ -0,0 +1,702 @@ +# Copyright 2014-present MongoDB, Inc. +# +# 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 bulk write operations interface. + +.. versionadded:: 2.7 +""" +import copy + +from itertools import islice + +from bson.objectid import ObjectId +from bson.raw_bson import RawBSONDocument +from bson.son import SON +from pymongo.client_session import _validate_session_write_concern +from pymongo.common import (validate_is_mapping, + validate_is_document_type, + validate_ok_for_replace, + validate_ok_for_update) +from pymongo.helpers import _RETRYABLE_ERROR_CODES +from pymongo.collation import validate_collation_or_none +from pymongo.errors import (BulkWriteError, + ConfigurationError, + InvalidOperation, + OperationFailure) +from pymongo.message import (_INSERT, _UPDATE, _DELETE, + _do_batched_insert, + _do_bulk_write_command, + _randint, + _BulkWriteContext) +from pymongo.read_preferences import ReadPreference +from pymongo.write_concern import WriteConcern + + +_DELETE_ALL = 0 +_DELETE_ONE = 1 + +# For backwards compatibility. See MongoDB src/mongo/base/error_codes.err +_BAD_VALUE = 2 +_UNKNOWN_ERROR = 8 +_WRITE_CONCERN_ERROR = 64 + +_COMMANDS = ('insert', 'update', 'delete') + + +# These string literals are used when we create fake server return +# documents client side. We use unicode literals in python 2.x to +# match the actual return values from the server. +_UOP = u"op" + + +class _Run(object): + """Represents a batch of write operations. + """ + def __init__(self, op_type): + """Initialize a new Run object. + """ + self.op_type = op_type + self.index_map = [] + self.ops = [] + self.idx_offset = 0 + + def index(self, idx): + """Get the original index of an operation in this run. + + :Parameters: + - `idx`: The Run index that maps to the original index. + """ + return self.index_map[idx] + + def add(self, original_index, operation): + """Add an operation to this Run instance. + + :Parameters: + - `original_index`: The original index of this operation + within a larger bulk operation. + - `operation`: The operation document. + """ + self.index_map.append(original_index) + self.ops.append(operation) + + +def _merge_command(run, full_result, offset, result): + """Merge a write command result into the full bulk result. + """ + affected = result.get("n", 0) + + if run.op_type == _INSERT: + full_result["nInserted"] += affected + + elif run.op_type == _DELETE: + full_result["nRemoved"] += affected + + elif run.op_type == _UPDATE: + upserted = result.get("upserted") + if upserted: + n_upserted = len(upserted) + for doc in upserted: + doc["index"] = run.index(doc["index"] + offset) + full_result["upserted"].extend(upserted) + full_result["nUpserted"] += n_upserted + full_result["nMatched"] += (affected - n_upserted) + else: + full_result["nMatched"] += affected + full_result["nModified"] += result["nModified"] + + write_errors = result.get("writeErrors") + if write_errors: + for doc in write_errors: + # Leave the server response intact for APM. + replacement = doc.copy() + idx = doc["index"] + offset + replacement["index"] = run.index(idx) + # Add the failed operation to the error document. + replacement[_UOP] = run.ops[idx] + full_result["writeErrors"].append(replacement) + + wc_error = result.get("writeConcernError") + if wc_error: + full_result["writeConcernErrors"].append(wc_error) + + +def _raise_bulk_write_error(full_result): + """Raise a BulkWriteError from the full bulk api result. + """ + if full_result["writeErrors"]: + full_result["writeErrors"].sort( + key=lambda error: error["index"]) + raise BulkWriteError(full_result) + + +class _Bulk(object): + """The private guts of the bulk write API. + """ + def __init__(self, collection, ordered, bypass_document_validation): + """Initialize a _Bulk instance. + """ + self.collection = collection.with_options( + codec_options=collection.codec_options._replace( + unicode_decode_error_handler='replace', + document_class=dict)) + self.ordered = ordered + self.ops = [] + self.name = "%s.%s" % (collection.database.name, collection.name) + self.namespace = collection.database.name + '.$cmd' + self.executed = False + self.bypass_doc_val = bypass_document_validation + self.uses_collation = False + self.uses_array_filters = False + self.is_retryable = True + self.retrying = False + self.started_retryable_write = False + # Extra state so that we know where to pick up on a retry attempt. + self.current_run = None + + def add_insert(self, document): + """Add an insert document to the list of ops. + """ + validate_is_document_type("document", document) + # Generate ObjectId client side. + if not (isinstance(document, RawBSONDocument) or '_id' in document): + document['_id'] = ObjectId() + self.ops.append((_INSERT, document)) + + def add_update(self, selector, update, multi=False, upsert=False, + collation=None, array_filters=None): + """Create an update document and add it to the list of ops. + """ + validate_ok_for_update(update) + cmd = SON([('q', selector), ('u', update), + ('multi', multi), ('upsert', upsert)]) + collation = validate_collation_or_none(collation) + if collation is not None: + self.uses_collation = True + cmd['collation'] = collation + if array_filters is not None: + self.uses_array_filters = True + cmd['arrayFilters'] = array_filters + if multi: + # A bulk_write containing an update_many is not retryable. + self.is_retryable = False + self.ops.append((_UPDATE, cmd)) + + def add_replace(self, selector, replacement, upsert=False, + collation=None): + """Create a replace document and add it to the list of ops. + """ + validate_ok_for_replace(replacement) + cmd = SON([('q', selector), ('u', replacement), + ('multi', False), ('upsert', upsert)]) + collation = validate_collation_or_none(collation) + if collation is not None: + self.uses_collation = True + cmd['collation'] = collation + self.ops.append((_UPDATE, cmd)) + + def add_delete(self, selector, limit, collation=None): + """Create a delete document and add it to the list of ops. + """ + cmd = SON([('q', selector), ('limit', limit)]) + collation = validate_collation_or_none(collation) + if collation is not None: + self.uses_collation = True + cmd['collation'] = collation + if limit == _DELETE_ALL: + # A bulk_write containing a delete_many is not retryable. + self.is_retryable = False + self.ops.append((_DELETE, cmd)) + + def gen_ordered(self): + """Generate batches of operations, batched by type of + operation, in the order **provided**. + """ + run = None + for idx, (op_type, operation) in enumerate(self.ops): + if run is None: + run = _Run(op_type) + elif run.op_type != op_type: + yield run + run = _Run(op_type) + run.add(idx, operation) + yield run + + def gen_unordered(self): + """Generate batches of operations, batched by type of + operation, in arbitrary order. + """ + operations = [_Run(_INSERT), _Run(_UPDATE), _Run(_DELETE)] + for idx, (op_type, operation) in enumerate(self.ops): + operations[op_type].add(idx, operation) + + for run in operations: + if run.ops: + yield run + + def _execute_command(self, generator, write_concern, session, + sock_info, op_id, retryable, full_result): + if sock_info.max_wire_version < 5 and self.uses_collation: + raise ConfigurationError( + 'Must be connected to MongoDB 3.4+ to use a collation.') + if sock_info.max_wire_version < 6 and self.uses_array_filters: + raise ConfigurationError( + 'Must be connected to MongoDB 3.6+ to use arrayFilters.') + + db_name = self.collection.database.name + client = self.collection.database.client + listeners = client._event_listeners + + if not self.current_run: + self.current_run = next(generator) + run = self.current_run + + # sock_info.command validates the session, but we use + # sock_info.write_command. + sock_info.validate_session(client, session) + while run: + cmd = SON([(_COMMANDS[run.op_type], self.collection.name), + ('ordered', self.ordered)]) + if not write_concern.is_server_default: + cmd['writeConcern'] = write_concern.document + if self.bypass_doc_val and sock_info.max_wire_version >= 4: + cmd['bypassDocumentValidation'] = True + bwc = _BulkWriteContext(db_name, cmd, sock_info, op_id, + listeners, session) + + while run.idx_offset < len(run.ops): + if session: + # Start a new retryable write unless one was already + # started for this command. + if retryable and not self.started_retryable_write: + session._start_retryable_write() + self.started_retryable_write = True + session._apply_to(cmd, retryable, ReadPreference.PRIMARY, + sock_info) + sock_info.send_cluster_time(cmd, session, client) + check_keys = run.op_type == _INSERT + ops = islice(run.ops, run.idx_offset, None) + # Run as many ops as possible. + request_id, msg, to_send = _do_bulk_write_command( + self.namespace, run.op_type, cmd, ops, check_keys, + self.collection.codec_options, bwc) + if not to_send: + raise InvalidOperation("cannot do an empty bulk write") + result = bwc.write_command(request_id, msg, to_send) + client._receive_cluster_time(result, session) + + # Retryable writeConcernErrors halt the execution of this run. + wce = result.get('writeConcernError', {}) + if wce.get('code', 0) in _RETRYABLE_ERROR_CODES: + # Synthesize the full bulk result without modifying the + # current one because this write operation may be retried. + full = copy.deepcopy(full_result) + _merge_command(run, full, run.idx_offset, result) + _raise_bulk_write_error(full) + + _merge_command(run, full_result, run.idx_offset, result) + # We're no longer in a retry once a command succeeds. + self.retrying = False + self.started_retryable_write = False + + if self.ordered and "writeErrors" in result: + break + run.idx_offset += len(to_send) + + # We're supposed to continue if errors are + # at the write concern level (e.g. wtimeout) + if self.ordered and full_result['writeErrors']: + break + # Reset our state + self.current_run = run = next(generator, None) + + def execute_command(self, generator, write_concern, session): + """Execute using write commands. + """ + # nModified is only reported for write commands, not legacy ops. + full_result = { + "writeErrors": [], + "writeConcernErrors": [], + "nInserted": 0, + "nUpserted": 0, + "nMatched": 0, + "nModified": 0, + "nRemoved": 0, + "upserted": [], + } + op_id = _randint() + + def retryable_bulk(session, sock_info, retryable): + self._execute_command( + generator, write_concern, session, sock_info, op_id, + retryable, full_result) + + client = self.collection.database.client + with client._tmp_session(session) as s: + client._retry_with_session( + self.is_retryable, retryable_bulk, s, self) + + if full_result["writeErrors"] or full_result["writeConcernErrors"]: + _raise_bulk_write_error(full_result) + return full_result + + def execute_insert_no_results(self, sock_info, run, op_id, acknowledged): + """Execute insert, returning no results. + """ + command = SON([('insert', self.collection.name), + ('ordered', self.ordered)]) + concern = {'w': int(self.ordered)} + command['writeConcern'] = concern + if self.bypass_doc_val and sock_info.max_wire_version >= 4: + command['bypassDocumentValidation'] = True + db = self.collection.database + bwc = _BulkWriteContext( + db.name, command, sock_info, op_id, db.client._event_listeners, + session=None) + # Legacy batched OP_INSERT. + _do_batched_insert( + self.collection.full_name, run.ops, True, acknowledged, concern, + not self.ordered, self.collection.codec_options, bwc) + + def execute_op_msg_no_results(self, sock_info, generator): + """Execute write commands with OP_MSG and w=0 writeConcern, unordered. + """ + db_name = self.collection.database.name + client = self.collection.database.client + listeners = client._event_listeners + op_id = _randint() + + if not self.current_run: + self.current_run = next(generator) + run = self.current_run + + while run: + cmd = SON([(_COMMANDS[run.op_type], self.collection.name), + ('ordered', False), + ('writeConcern', {'w': 0})]) + bwc = _BulkWriteContext(db_name, cmd, sock_info, op_id, + listeners, None) + + while run.idx_offset < len(run.ops): + check_keys = run.op_type == _INSERT + ops = islice(run.ops, run.idx_offset, None) + # Run as many ops as possible. + request_id, msg, to_send = _do_bulk_write_command( + self.namespace, run.op_type, cmd, ops, check_keys, + self.collection.codec_options, bwc) + if not to_send: + raise InvalidOperation("cannot do an empty bulk write") + run.idx_offset += len(to_send) + # Though this isn't strictly a "legacy" write, the helper + # handles publishing commands and sending our message + # without receiving a result. Send 0 for max_doc_size + # to disable size checking. Size checking is handled while + # the documents are encoded to BSON. + bwc.legacy_write(request_id, msg, 0, False, to_send) + self.current_run = run = next(generator, None) + + def execute_command_no_results(self, sock_info, generator): + """Execute write commands with OP_MSG and w=0 WriteConcern, ordered. + """ + full_result = { + "writeErrors": [], + "writeConcernErrors": [], + "nInserted": 0, + "nUpserted": 0, + "nMatched": 0, + "nModified": 0, + "nRemoved": 0, + "upserted": [], + } + # Ordered bulk writes have to be acknowledged so that we stop + # processing at the first error, even when the application + # specified unacknowledged writeConcern. + write_concern = WriteConcern() + op_id = _randint() + try: + self._execute_command( + generator, write_concern, None, + sock_info, op_id, False, full_result) + except OperationFailure: + pass + + def execute_no_results(self, sock_info, generator): + """Execute all operations, returning no results (w=0). + """ + if self.uses_collation: + raise ConfigurationError( + 'Collation is unsupported for unacknowledged writes.') + if self.uses_array_filters: + raise ConfigurationError( + 'arrayFilters is unsupported for unacknowledged writes.') + # Cannot have both unacknowledged writes and bypass document validation. + if self.bypass_doc_val and sock_info.max_wire_version >= 4: + raise OperationFailure("Cannot set bypass_document_validation with" + " unacknowledged write concern") + + # OP_MSG + if sock_info.max_wire_version > 5: + if self.ordered: + return self.execute_command_no_results(sock_info, generator) + return self.execute_op_msg_no_results(sock_info, generator) + + coll = self.collection + # If ordered is True we have to send GLE or use write + # commands so we can abort on the first error. + write_concern = WriteConcern(w=int(self.ordered)) + op_id = _randint() + + next_run = next(generator) + while next_run: + # An ordered bulk write needs to send acknowledged writes to short + # circuit the next run. However, the final message on the final + # run can be unacknowledged. + run = next_run + next_run = next(generator, None) + needs_ack = self.ordered and next_run is not None + try: + if run.op_type == _INSERT: + self.execute_insert_no_results( + sock_info, run, op_id, needs_ack) + elif run.op_type == _UPDATE: + for operation in run.ops: + doc = operation['u'] + check_keys = True + if doc and next(iter(doc)).startswith('$'): + check_keys = False + coll._update( + sock_info, + operation['q'], + doc, + operation['upsert'], + check_keys, + operation['multi'], + write_concern=write_concern, + op_id=op_id, + ordered=self.ordered, + bypass_doc_val=self.bypass_doc_val) + else: + for operation in run.ops: + coll._delete(sock_info, + operation['q'], + not operation['limit'], + write_concern, + op_id, + self.ordered) + except OperationFailure: + if self.ordered: + break + + def execute(self, write_concern, session): + """Execute operations. + """ + if not self.ops: + raise InvalidOperation('No operations to execute') + if self.executed: + raise InvalidOperation('Bulk operations can ' + 'only be executed once.') + self.executed = True + write_concern = write_concern or self.collection.write_concern + session = _validate_session_write_concern(session, write_concern) + + if self.ordered: + generator = self.gen_ordered() + else: + generator = self.gen_unordered() + + client = self.collection.database.client + if not write_concern.acknowledged: + with client._socket_for_writes() as sock_info: + self.execute_no_results(sock_info, generator) + else: + return self.execute_command(generator, write_concern, session) + + +class BulkUpsertOperation(object): + """An interface for adding upsert operations. + """ + + __slots__ = ('__selector', '__bulk', '__collation') + + def __init__(self, selector, bulk, collation): + self.__selector = selector + self.__bulk = bulk + self.__collation = collation + + def update_one(self, update): + """Update one document matching the selector. + + :Parameters: + - `update` (dict): the update operations to apply + """ + self.__bulk.add_update(self.__selector, + update, multi=False, upsert=True, + collation=self.__collation) + + def update(self, update): + """Update all documents matching the selector. + + :Parameters: + - `update` (dict): the update operations to apply + """ + self.__bulk.add_update(self.__selector, + update, multi=True, upsert=True, + collation=self.__collation) + + def replace_one(self, replacement): + """Replace one entire document matching the selector criteria. + + :Parameters: + - `replacement` (dict): the replacement document + """ + self.__bulk.add_replace(self.__selector, replacement, upsert=True, + collation=self.__collation) + + +class BulkWriteOperation(object): + """An interface for adding update or remove operations. + """ + + __slots__ = ('__selector', '__bulk', '__collation') + + def __init__(self, selector, bulk, collation): + self.__selector = selector + self.__bulk = bulk + self.__collation = collation + + def update_one(self, update): + """Update one document matching the selector criteria. + + :Parameters: + - `update` (dict): the update operations to apply + """ + self.__bulk.add_update(self.__selector, update, multi=False, + collation=self.__collation) + + def update(self, update): + """Update all documents matching the selector criteria. + + :Parameters: + - `update` (dict): the update operations to apply + """ + self.__bulk.add_update(self.__selector, update, multi=True, + collation=self.__collation) + + def replace_one(self, replacement): + """Replace one entire document matching the selector criteria. + + :Parameters: + - `replacement` (dict): the replacement document + """ + self.__bulk.add_replace(self.__selector, replacement, + collation=self.__collation) + + def remove_one(self): + """Remove a single document matching the selector criteria. + """ + self.__bulk.add_delete(self.__selector, _DELETE_ONE, + collation=self.__collation) + + def remove(self): + """Remove all documents matching the selector criteria. + """ + self.__bulk.add_delete(self.__selector, _DELETE_ALL, + collation=self.__collation) + + def upsert(self): + """Specify that all chained update operations should be + upserts. + + :Returns: + - A :class:`BulkUpsertOperation` instance, used to add + update operations to this bulk operation. + """ + return BulkUpsertOperation(self.__selector, self.__bulk, + self.__collation) + + +class BulkOperationBuilder(object): + """**DEPRECATED**: An interface for executing a batch of write operations. + """ + + __slots__ = '__bulk' + + def __init__(self, collection, ordered=True, + bypass_document_validation=False): + """**DEPRECATED**: Initialize a new BulkOperationBuilder instance. + + :Parameters: + - `collection`: A :class:`~pymongo.collection.Collection` instance. + - `ordered` (optional): If ``True`` all operations will be executed + serially, in the order provided, and the entire execution will + abort on the first error. If ``False`` operations will be executed + in arbitrary order (possibly in parallel on the server), reporting + any errors that occurred after attempting all operations. Defaults + to ``True``. + - `bypass_document_validation`: (optional) If ``True``, allows the + write to opt-out of document level validation. Default is + ``False``. + + .. note:: `bypass_document_validation` requires server version + **>= 3.2** + + .. versionchanged:: 3.5 + Deprecated. Use :meth:`~pymongo.collection.Collection.bulk_write` + instead. + + .. versionchanged:: 3.2 + Added bypass_document_validation support + """ + self.__bulk = _Bulk(collection, ordered, bypass_document_validation) + + def find(self, selector, collation=None): + """Specify selection criteria for bulk operations. + + :Parameters: + - `selector` (dict): the selection criteria for update + and remove operations. + - `collation` (optional): An instance of + :class:`~pymongo.collation.Collation`. This option is only + supported on MongoDB 3.4 and above. + + :Returns: + - A :class:`BulkWriteOperation` instance, used to add + update and remove operations to this bulk operation. + + .. versionchanged:: 3.4 + Added the `collation` option. + + """ + validate_is_mapping("selector", selector) + return BulkWriteOperation(selector, self.__bulk, collation) + + def insert(self, document): + """Insert a single document. + + :Parameters: + - `document` (dict): the document to insert + + .. seealso:: :ref:`writes-and-ids` + """ + self.__bulk.add_insert(document) + + def execute(self, write_concern=None): + """Execute all provided operations. + + :Parameters: + - write_concern (optional): the write concern for this bulk + execution. + """ + if write_concern is not None: + write_concern = WriteConcern(**write_concern) + return self.__bulk.execute(write_concern, session=None) diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/change_stream.py b/mongo_mac/lib/python3.6/site-packages/pymongo/change_stream.py new file mode 100644 index 0000000..920daae --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/change_stream.py @@ -0,0 +1,334 @@ +# Copyright 2017 MongoDB, Inc. +# +# 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. + +"""Watch changes on a collection, a database, or the entire cluster.""" + +import copy + +from bson import _bson_to_dict +from bson.raw_bson import RawBSONDocument +from bson.son import SON + +from pymongo import common +from pymongo.collation import validate_collation_or_none +from pymongo.command_cursor import CommandCursor +from pymongo.errors import (ConnectionFailure, + InvalidOperation, + OperationFailure, + PyMongoError) + + +# The change streams spec considers the following server errors from the +# getMore command non-resumable. All other getMore errors are resumable. +_NON_RESUMABLE_GETMORE_ERRORS = frozenset([ + 11601, # Interrupted + 136, # CappedPositionLost + 237, # CursorKilled + None, # No error code was returned. +]) + + +class ChangeStream(object): + """The internal abstract base class for change stream cursors. + + Should not be called directly by application developers. Use + :meth:`pymongo.collection.Collection.watch`, + :meth:`pymongo.database.Database.watch`, or + :meth:`pymongo.mongo_client.MongoClient.watch` instead. + + .. versionadded:: 3.6 + .. mongodoc:: changeStreams + """ + def __init__(self, target, pipeline, full_document, resume_after, + max_await_time_ms, batch_size, collation, + start_at_operation_time, session): + if pipeline is None: + pipeline = [] + elif not isinstance(pipeline, list): + raise TypeError("pipeline must be a list") + + common.validate_string_or_none('full_document', full_document) + validate_collation_or_none(collation) + common.validate_non_negative_integer_or_none("batchSize", batch_size) + + self._decode_custom = False + self._orig_codec_options = target.codec_options + if target.codec_options.type_registry._decoder_map: + self._decode_custom = True + # Keep the type registry so that we support encoding custom types + # in the pipeline. + self._target = target.with_options( + codec_options=target.codec_options.with_options( + document_class=RawBSONDocument)) + else: + self._target = target + + self._pipeline = copy.deepcopy(pipeline) + self._full_document = full_document + self._resume_token = copy.deepcopy(resume_after) + self._max_await_time_ms = max_await_time_ms + self._batch_size = batch_size + self._collation = collation + self._start_at_operation_time = start_at_operation_time + self._session = session + self._cursor = self._create_cursor() + + @property + def _aggregation_target(self): + """The argument to pass to the aggregate command.""" + raise NotImplementedError + + @property + def _database(self): + """The database against which the aggregation commands for + this ChangeStream will be run. """ + raise NotImplementedError + + def _pipeline_options(self): + options = {} + if self._full_document is not None: + options['fullDocument'] = self._full_document + if self._resume_token is not None: + options['resumeAfter'] = self._resume_token + if self._start_at_operation_time is not None: + options['startAtOperationTime'] = self._start_at_operation_time + return options + + def _full_pipeline(self): + """Return the full aggregation pipeline for this ChangeStream.""" + options = self._pipeline_options() + full_pipeline = [{'$changeStream': options}] + full_pipeline.extend(self._pipeline) + return full_pipeline + + def _run_aggregation_cmd(self, session, explicit_session): + """Run the full aggregation pipeline for this ChangeStream and return + the corresponding CommandCursor. + """ + read_preference = self._target._read_preference_for(session) + client = self._database.client + with client._socket_for_reads(read_preference) as (sock_info, slave_ok): + pipeline = self._full_pipeline() + cmd = SON([("aggregate", self._aggregation_target), + ("pipeline", pipeline), + ("cursor", {})]) + + result = sock_info.command( + self._database.name, + cmd, + slave_ok, + read_preference, + self._target.codec_options, + parse_write_concern_error=True, + read_concern=self._target.read_concern, + collation=self._collation, + session=session, + client=self._database.client) + + cursor = result["cursor"] + + if (self._start_at_operation_time is None and + self._resume_token is None and + cursor.get("_id") is None and + sock_info.max_wire_version >= 7): + self._start_at_operation_time = result["operationTime"] + + ns = cursor["ns"] + _, collname = ns.split(".", 1) + aggregation_collection = self._database.get_collection( + collname, codec_options=self._target.codec_options, + read_preference=read_preference, + write_concern=self._target.write_concern, + read_concern=self._target.read_concern + ) + + return CommandCursor( + aggregation_collection, cursor, sock_info.address, + batch_size=self._batch_size or 0, + max_await_time_ms=self._max_await_time_ms, + session=session, explicit_session=explicit_session) + + def _create_cursor(self): + with self._database.client._tmp_session(self._session, close=False) as s: + return self._run_aggregation_cmd( + session=s, + explicit_session=self._session is not None + ) + + def _resume(self): + """Reestablish this change stream after a resumable error.""" + try: + self._cursor.close() + except PyMongoError: + pass + self._cursor = self._create_cursor() + + def close(self): + """Close this ChangeStream.""" + self._cursor.close() + + def __iter__(self): + return self + + def next(self): + """Advance the cursor. + + This method blocks until the next change document is returned or an + unrecoverable error is raised. This method is used when iterating over + all changes in the cursor. For example:: + + try: + with db.collection.watch( + [{'$match': {'operationType': 'insert'}}]) as stream: + for insert_change in stream: + print(insert_change) + except pymongo.errors.PyMongoError: + # The ChangeStream encountered an unrecoverable error or the + # resume attempt failed to recreate the cursor. + logging.error('...') + + Raises :exc:`StopIteration` if this ChangeStream is closed. + """ + while self.alive: + doc = self.try_next() + if doc is not None: + return doc + + raise StopIteration + + __next__ = next + + @property + def alive(self): + """Does this cursor have the potential to return more data? + + .. note:: Even if :attr:`alive` is ``True``, :meth:`next` can raise + :exc:`StopIteration` and :meth:`try_next` can return ``None``. + + .. versionadded:: 3.8 + """ + return self._cursor.alive + + def try_next(self): + """Advance the cursor without blocking indefinitely. + + This method returns the next change document without waiting + indefinitely for the next change. For example:: + + with db.collection.watch() as stream: + while stream.alive: + change = stream.try_next() + if change is not None: + print(change) + elif stream.alive: + # We end up here when there are no recent changes. + # Sleep for a while to avoid flooding the server with + # getMore requests when no changes are available. + time.sleep(10) + + If no change document is cached locally then this method runs a single + getMore command. If the getMore yields any documents, the next + document is returned, otherwise, if the getMore returns no documents + (because there have been no changes) then ``None`` is returned. + + :Returns: + The next change document or ``None`` when no document is available + after running a single getMore or when the cursor is closed. + + .. versionadded:: 3.8 + """ + # Attempt to get the next change with at most one getMore and at most + # one resume attempt. + try: + change = self._cursor._try_next(True) + except ConnectionFailure: + self._resume() + change = self._cursor._try_next(False) + except OperationFailure as exc: + if exc.code in _NON_RESUMABLE_GETMORE_ERRORS: + raise + self._resume() + change = self._cursor._try_next(False) + + # No changes are available. + if change is None: + return None + + try: + resume_token = change['_id'] + except KeyError: + self.close() + raise InvalidOperation( + "Cannot provide resume functionality when the resume " + "token is missing.") + self._resume_token = copy.copy(resume_token) + self._start_at_operation_time = None + + if self._decode_custom: + return _bson_to_dict(change.raw, self._orig_codec_options) + return change + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + + +class CollectionChangeStream(ChangeStream): + """A change stream that watches changes on a single collection. + + Should not be called directly by application developers. Use + helper method :meth:`pymongo.collection.Collection.watch` instead. + + .. versionadded:: 3.7 + """ + @property + def _aggregation_target(self): + return self._target.name + + @property + def _database(self): + return self._target.database + + +class DatabaseChangeStream(ChangeStream): + """A change stream that watches changes on all collections in a database. + + Should not be called directly by application developers. Use + helper method :meth:`pymongo.database.Database.watch` instead. + + .. versionadded:: 3.7 + """ + @property + def _aggregation_target(self): + return 1 + + @property + def _database(self): + return self._target + + +class ClusterChangeStream(DatabaseChangeStream): + """A change stream that watches changes on all collections in the cluster. + + Should not be called directly by application developers. Use + helper method :meth:`pymongo.mongo_client.MongoClient.watch` instead. + + .. versionadded:: 3.7 + """ + def _pipeline_options(self): + options = super(ClusterChangeStream, self)._pipeline_options() + options["allChangesForCluster"] = True + return options diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/client_options.py b/mongo_mac/lib/python3.6/site-packages/pymongo/client_options.py new file mode 100644 index 0000000..3c3865b --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/client_options.py @@ -0,0 +1,237 @@ +# Copyright 2014-present MongoDB, Inc. +# +# 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. + +"""Tools to parse mongo client options.""" + +from bson.codec_options import _parse_codec_options +from pymongo.auth import _build_credentials_tuple +from pymongo.common import validate_boolean +from pymongo import common +from pymongo.compression_support import CompressionSettings +from pymongo.errors import ConfigurationError +from pymongo.monitoring import _EventListeners +from pymongo.pool import PoolOptions +from pymongo.read_concern import ReadConcern +from pymongo.read_preferences import (make_read_preference, + read_pref_mode_from_name) +from pymongo.server_selectors import any_server_selector +from pymongo.ssl_support import get_ssl_context +from pymongo.write_concern import WriteConcern + + +def _parse_credentials(username, password, database, options): + """Parse authentication credentials.""" + mechanism = options.get('authmechanism', 'DEFAULT' if username else None) + source = options.get('authsource') + if username or mechanism: + return _build_credentials_tuple( + mechanism, source, username, password, options, database) + return None + + +def _parse_read_preference(options): + """Parse read preference options.""" + if 'read_preference' in options: + return options['read_preference'] + + name = options.get('readpreference', 'primary') + mode = read_pref_mode_from_name(name) + tags = options.get('readpreferencetags') + max_staleness = options.get('maxstalenessseconds', -1) + return make_read_preference(mode, tags, max_staleness) + + +def _parse_write_concern(options): + """Parse write concern options.""" + concern = options.get('w') + wtimeout = options.get('wtimeout', options.get('wtimeoutms')) + j = options.get('j', options.get('journal')) + fsync = options.get('fsync') + return WriteConcern(concern, wtimeout, j, fsync) + + +def _parse_read_concern(options): + """Parse read concern options.""" + concern = options.get('readconcernlevel') + return ReadConcern(concern) + + +def _parse_ssl_options(options): + """Parse ssl options.""" + use_ssl = options.get('ssl') + if use_ssl is not None: + validate_boolean('ssl', use_ssl) + + certfile = options.get('ssl_certfile') + keyfile = options.get('ssl_keyfile') + passphrase = options.get('ssl_pem_passphrase') + ca_certs = options.get('ssl_ca_certs') + cert_reqs = options.get('ssl_cert_reqs') + match_hostname = options.get('ssl_match_hostname', True) + crlfile = options.get('ssl_crlfile') + + ssl_kwarg_keys = [k for k in options + if k.startswith('ssl_') and options[k]] + if use_ssl == False and ssl_kwarg_keys: + raise ConfigurationError("ssl has not been enabled but the " + "following ssl parameters have been set: " + "%s. Please set `ssl=True` or remove." + % ', '.join(ssl_kwarg_keys)) + + if ssl_kwarg_keys and use_ssl is None: + # ssl options imply ssl = True + use_ssl = True + + if use_ssl is True: + ctx = get_ssl_context( + certfile, + keyfile, + passphrase, + ca_certs, + cert_reqs, + crlfile, + match_hostname) + return ctx, match_hostname + return None, match_hostname + + +def _parse_pool_options(options): + """Parse connection pool options.""" + max_pool_size = options.get('maxpoolsize', common.MAX_POOL_SIZE) + min_pool_size = options.get('minpoolsize', common.MIN_POOL_SIZE) + default_idle_seconds = common.validate_timeout_or_none( + 'maxidletimems', common.MAX_IDLE_TIME_MS) + max_idle_time_seconds = options.get('maxidletimems', default_idle_seconds) + if max_pool_size is not None and min_pool_size > max_pool_size: + raise ValueError("minPoolSize must be smaller or equal to maxPoolSize") + connect_timeout = options.get('connecttimeoutms', common.CONNECT_TIMEOUT) + socket_keepalive = options.get('socketkeepalive', True) + socket_timeout = options.get('sockettimeoutms') + wait_queue_timeout = options.get('waitqueuetimeoutms') + wait_queue_multiple = options.get('waitqueuemultiple') + event_listeners = options.get('event_listeners') + appname = options.get('appname') + driver = options.get('driver') + compression_settings = CompressionSettings( + options.get('compressors', []), + options.get('zlibcompressionlevel', -1)) + ssl_context, ssl_match_hostname = _parse_ssl_options(options) + return PoolOptions(max_pool_size, + min_pool_size, + max_idle_time_seconds, + connect_timeout, socket_timeout, + wait_queue_timeout, wait_queue_multiple, + ssl_context, ssl_match_hostname, socket_keepalive, + _EventListeners(event_listeners), + appname, + driver, + compression_settings) + + +class ClientOptions(object): + + """ClientOptions""" + + def __init__(self, username, password, database, options): + self.__options = options + + self.__codec_options = _parse_codec_options(options) + self.__credentials = _parse_credentials( + username, password, database, options) + self.__local_threshold_ms = options.get( + 'localthresholdms', common.LOCAL_THRESHOLD_MS) + # self.__server_selection_timeout is in seconds. Must use full name for + # common.SERVER_SELECTION_TIMEOUT because it is set directly by tests. + self.__server_selection_timeout = options.get( + 'serverselectiontimeoutms', common.SERVER_SELECTION_TIMEOUT) + self.__pool_options = _parse_pool_options(options) + self.__read_preference = _parse_read_preference(options) + self.__replica_set_name = options.get('replicaset') + self.__write_concern = _parse_write_concern(options) + self.__read_concern = _parse_read_concern(options) + self.__connect = options.get('connect') + self.__heartbeat_frequency = options.get( + 'heartbeatfrequencyms', common.HEARTBEAT_FREQUENCY) + self.__retry_writes = options.get('retrywrites', common.RETRY_WRITES) + self.__server_selector = options.get( + 'server_selector', any_server_selector) + + @property + def _options(self): + """The original options used to create this ClientOptions.""" + return self.__options + + @property + def connect(self): + """Whether to begin discovering a MongoDB topology automatically.""" + return self.__connect + + @property + def codec_options(self): + """A :class:`~bson.codec_options.CodecOptions` instance.""" + return self.__codec_options + + @property + def credentials(self): + """A :class:`~pymongo.auth.MongoCredentials` instance or None.""" + return self.__credentials + + @property + def local_threshold_ms(self): + """The local threshold for this instance.""" + return self.__local_threshold_ms + + @property + def server_selection_timeout(self): + """The server selection timeout for this instance in seconds.""" + return self.__server_selection_timeout + + @property + def server_selector(self): + return self.__server_selector + + @property + def heartbeat_frequency(self): + """The monitoring frequency in seconds.""" + return self.__heartbeat_frequency + + @property + def pool_options(self): + """A :class:`~pymongo.pool.PoolOptions` instance.""" + return self.__pool_options + + @property + def read_preference(self): + """A read preference instance.""" + return self.__read_preference + + @property + def replica_set_name(self): + """Replica set name or None.""" + return self.__replica_set_name + + @property + def write_concern(self): + """A :class:`~pymongo.write_concern.WriteConcern` instance.""" + return self.__write_concern + + @property + def read_concern(self): + """A :class:`~pymongo.read_concern.ReadConcern` instance.""" + return self.__read_concern + + @property + def retry_writes(self): + """If this instance should retry supported write operations.""" + return self.__retry_writes diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/client_session.py b/mongo_mac/lib/python3.6/site-packages/pymongo/client_session.py new file mode 100644 index 0000000..d610f61 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/client_session.py @@ -0,0 +1,655 @@ +# Copyright 2017 MongoDB, Inc. +# +# 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. + +"""Logical sessions for ordering sequential operations. + +Requires MongoDB 3.6. + +.. versionadded:: 3.6 + +Causally Consistent Reads +========================= + +.. code-block:: python + + with client.start_session(causal_consistency=True) as session: + collection = client.db.collection + collection.update_one({'_id': 1}, {'$set': {'x': 10}}, session=session) + secondary_c = collection.with_options( + read_preference=ReadPreference.SECONDARY) + + # A secondary read waits for replication of the write. + secondary_c.find_one({'_id': 1}, session=session) + +If `causal_consistency` is True (the default), read operations that use +the session are causally after previous read and write operations. Using a +causally consistent session, an application can read its own writes and is +guaranteed monotonic reads, even when reading from replica set secondaries. + +.. mongodoc:: causal-consistency + +.. _transactions-ref: + +Transactions +============ + +MongoDB 4.0 adds support for transactions on replica set primaries. A +transaction is associated with a :class:`ClientSession`. To start a transaction +on a session, use :meth:`ClientSession.start_transaction` in a with-statement. +Then, execute an operation within the transaction by passing the session to the +operation: + +.. code-block:: python + + orders = client.db.orders + inventory = client.db.inventory + with client.start_session() as session: + with session.start_transaction(): + orders.insert_one({"sku": "abc123", "qty": 100}, session=session) + inventory.update_one({"sku": "abc123", "qty": {"$gte": 100}}, + {"$inc": {"qty": -100}}, session=session) + +Upon normal completion of ``with session.start_transaction()`` block, the +transaction automatically calls :meth:`ClientSession.commit_transaction`. +If the block exits with an exception, the transaction automatically calls +:meth:`ClientSession.abort_transaction`. + +For multi-document transactions, you can only specify read/write (CRUD) +operations on existing collections. For example, a multi-document transaction +cannot include a create or drop collection/index operations, including an +insert operation that would result in the creation of a new collection. + +A session may only have a single active transaction at a time, multiple +transactions on the same session can be executed in sequence. + +.. versionadded:: 3.7 + +.. mongodoc:: transactions + +Classes +======= +""" + +import collections +import sys +import uuid + +from bson.binary import Binary +from bson.int64 import Int64 +from bson.py3compat import abc, reraise_instance +from bson.timestamp import Timestamp + +from pymongo import monotonic, __version__ +from pymongo.errors import (ConfigurationError, + ConnectionFailure, + InvalidOperation, + OperationFailure, + ServerSelectionTimeoutError, + WriteConcernError, + WTimeoutError) +from pymongo.helpers import _RETRYABLE_ERROR_CODES +from pymongo.read_concern import ReadConcern +from pymongo.read_preferences import ReadPreference, _ServerMode +from pymongo.write_concern import WriteConcern + + +class SessionOptions(object): + """Options for a new :class:`ClientSession`. + + :Parameters: + - `causal_consistency` (optional): If True (the default), read + operations are causally ordered within the session. + - `default_transaction_options` (optional): The default + TransactionOptions to use for transactions started on this session. + """ + def __init__(self, + causal_consistency=True, + default_transaction_options=None): + self._causal_consistency = causal_consistency + if default_transaction_options is not None: + if not isinstance(default_transaction_options, TransactionOptions): + raise TypeError( + "default_transaction_options must be an instance of " + "pymongo.client_session.TransactionOptions, not: %r" % + (default_transaction_options,)) + self._default_transaction_options = default_transaction_options + + @property + def causal_consistency(self): + """Whether causal consistency is configured.""" + return self._causal_consistency + + @property + def default_transaction_options(self): + """The default TransactionOptions to use for transactions started on + this session. + + .. versionadded:: 3.7 + """ + return self._default_transaction_options + + +class TransactionOptions(object): + """Options for :meth:`ClientSession.start_transaction`. + + :Parameters: + - `read_concern`: The :class:`~pymongo.read_concern.ReadConcern` to use + for this transaction. + - `write_concern`: The :class:`~pymongo.write_concern.WriteConcern` to + use for this transaction. + + .. versionadded:: 3.7 + """ + def __init__(self, read_concern=None, write_concern=None, + read_preference=None): + self._read_concern = read_concern + self._write_concern = write_concern + self._read_preference = read_preference + if read_concern is not None: + if not isinstance(read_concern, ReadConcern): + raise TypeError("read_concern must be an instance of " + "pymongo.read_concern.ReadConcern, not: %r" % + (read_concern,)) + if write_concern is not None: + if not isinstance(write_concern, WriteConcern): + raise TypeError("write_concern must be an instance of " + "pymongo.write_concern.WriteConcern, not: %r" % + (write_concern,)) + if not write_concern.acknowledged: + raise ConfigurationError( + "transactions do not support unacknowledged write concern" + ": %r" % (write_concern,)) + if read_preference is not None: + if not isinstance(read_preference, _ServerMode): + raise TypeError("%r is not valid for read_preference. See " + "pymongo.read_preferences for valid " + "options." % (read_preference,)) + + @property + def read_concern(self): + """This transaction's :class:`~pymongo.read_concern.ReadConcern`.""" + return self._read_concern + + @property + def write_concern(self): + """This transaction's :class:`~pymongo.write_concern.WriteConcern`.""" + return self._write_concern + + @property + def read_preference(self): + """This transaction's :class:`~pymongo.read_preferences.ReadPreference`. + """ + return self._read_preference + + +def _validate_session_write_concern(session, write_concern): + """Validate that an explicit session is not used with an unack'ed write. + + Returns the session to use for the next operation. + """ + if session: + if write_concern is not None and not write_concern.acknowledged: + # For unacknowledged writes without an explicit session, + # drivers SHOULD NOT use an implicit session. If a driver + # creates an implicit session for unacknowledged writes + # without an explicit session, the driver MUST NOT send the + # session ID. + if session._implicit: + return None + else: + raise ConfigurationError( + 'Explicit sessions are incompatible with ' + 'unacknowledged write concern: %r' % ( + write_concern,)) + return session + + +class _TransactionContext(object): + """Internal transaction context manager for start_transaction.""" + def __init__(self, session): + self.__session = session + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + if self.__session._in_transaction: + if exc_val is None: + self.__session.commit_transaction() + else: + self.__session.abort_transaction() + + +class _TxnState(object): + NONE = 1 + STARTING = 2 + IN_PROGRESS = 3 + COMMITTED = 4 + COMMITTED_EMPTY = 5 + ABORTED = 6 + + +class _Transaction(object): + """Internal class to hold transaction information in a ClientSession.""" + def __init__(self, opts): + self.opts = opts + self.state = _TxnState.NONE + self.transaction_id = 0 + + def active(self): + return self.state in (_TxnState.STARTING, _TxnState.IN_PROGRESS) + + +def _reraise_with_unknown_commit(exc): + """Re-raise an exception with the UnknownTransactionCommitResult label.""" + exc._add_error_label("UnknownTransactionCommitResult") + reraise_instance(exc, trace=sys.exc_info()[2]) + + +# From the transactions spec, all the retryable writes errors plus +# WriteConcernFailed. +_UNKNOWN_COMMIT_ERROR_CODES = _RETRYABLE_ERROR_CODES | frozenset([ + 64, # WriteConcernFailed +]) + +_MONGOS_NOT_SUPPORTED_MSG = ( + 'PyMongo %s does not support running multi-document transactions on ' + 'sharded clusters') % (__version__,) + + +class ClientSession(object): + """A session for ordering sequential operations.""" + def __init__(self, client, server_session, options, authset, implicit): + # A MongoClient, a _ServerSession, a SessionOptions, and a set. + self._client = client + self._server_session = server_session + self._options = options + self._authset = authset + self._cluster_time = None + self._operation_time = None + # Is this an implicitly created session? + self._implicit = implicit + self._transaction = _Transaction(None) + + def end_session(self): + """Finish this session. If a transaction has started, abort it. + + It is an error to use the session after the session has ended. + """ + self._end_session(lock=True) + + def _end_session(self, lock): + if self._server_session is not None: + try: + if self._in_transaction: + self.abort_transaction() + finally: + self._client._return_server_session(self._server_session, lock) + self._server_session = None + + def _check_ended(self): + if self._server_session is None: + raise InvalidOperation("Cannot use ended session") + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self._end_session(lock=True) + + @property + def client(self): + """The :class:`~pymongo.mongo_client.MongoClient` this session was + created from. + """ + return self._client + + @property + def options(self): + """The :class:`SessionOptions` this session was created with.""" + return self._options + + @property + def session_id(self): + """A BSON document, the opaque server session identifier.""" + self._check_ended() + return self._server_session.session_id + + @property + def cluster_time(self): + """The cluster time returned by the last operation executed + in this session. + """ + return self._cluster_time + + @property + def operation_time(self): + """The operation time returned by the last operation executed + in this session. + """ + return self._operation_time + + def _inherit_option(self, name, val): + """Return the inherited TransactionOption value.""" + if val: + return val + txn_opts = self.options.default_transaction_options + val = txn_opts and getattr(txn_opts, name) + if val: + return val + return getattr(self.client, name) + + def start_transaction(self, read_concern=None, write_concern=None, + read_preference=None): + """Start a multi-statement transaction. + + Takes the same arguments as :class:`TransactionOptions`. + + .. versionadded:: 3.7 + """ + self._check_ended() + + if self._client._is_mongos_non_blocking(): + raise ConfigurationError(_MONGOS_NOT_SUPPORTED_MSG) + + if self._in_transaction: + raise InvalidOperation("Transaction already in progress") + + read_concern = self._inherit_option("read_concern", read_concern) + write_concern = self._inherit_option("write_concern", write_concern) + read_preference = self._inherit_option( + "read_preference", read_preference) + + self._transaction.opts = TransactionOptions( + read_concern, write_concern, read_preference) + self._transaction.state = _TxnState.STARTING + self._start_retryable_write() + self._transaction.transaction_id = self._server_session.transaction_id + return _TransactionContext(self) + + def commit_transaction(self): + """Commit a multi-statement transaction. + + .. versionadded:: 3.7 + """ + self._check_ended() + + state = self._transaction.state + if state is _TxnState.NONE: + raise InvalidOperation("No transaction started") + elif state in (_TxnState.STARTING, _TxnState.COMMITTED_EMPTY): + # Server transaction was never started, no need to send a command. + self._transaction.state = _TxnState.COMMITTED_EMPTY + return + elif state is _TxnState.ABORTED: + raise InvalidOperation( + "Cannot call commitTransaction after calling abortTransaction") + + try: + self._finish_transaction_with_retry("commitTransaction") + except ConnectionFailure as exc: + # We do not know if the commit was successfully applied on the + # server or if it satisfied the provided write concern, set the + # unknown commit error label. + exc._remove_error_label("TransientTransactionError") + _reraise_with_unknown_commit(exc) + except WTimeoutError as exc: + # We do not know if the commit has satisfied the provided write + # concern, add the unknown commit error label. + _reraise_with_unknown_commit(exc) + except OperationFailure as exc: + if exc.code not in _UNKNOWN_COMMIT_ERROR_CODES: + # The server reports errorLabels in the case. + raise + # We do not know if the commit was successfully applied on the + # server or if it satisfied the provided write concern, set the + # unknown commit error label. + _reraise_with_unknown_commit(exc) + finally: + self._transaction.state = _TxnState.COMMITTED + + def abort_transaction(self): + """Abort a multi-statement transaction. + + .. versionadded:: 3.7 + """ + self._check_ended() + + state = self._transaction.state + if state is _TxnState.NONE: + raise InvalidOperation("No transaction started") + elif state is _TxnState.STARTING: + # Server transaction was never started, no need to send a command. + self._transaction.state = _TxnState.ABORTED + return + elif state is _TxnState.ABORTED: + raise InvalidOperation("Cannot call abortTransaction twice") + elif state in (_TxnState.COMMITTED, _TxnState.COMMITTED_EMPTY): + raise InvalidOperation( + "Cannot call abortTransaction after calling commitTransaction") + + try: + self._finish_transaction_with_retry("abortTransaction") + except (OperationFailure, ConnectionFailure): + # The transactions spec says to ignore abortTransaction errors. + pass + finally: + self._transaction.state = _TxnState.ABORTED + + def _finish_transaction(self, command_name): + with self._client._socket_for_writes() as sock_info: + return self._client.admin._command( + sock_info, + command_name, + txnNumber=self._transaction.transaction_id, + autocommit=False, + session=self, + write_concern=self._transaction.opts.write_concern, + parse_write_concern_error=True) + + def _finish_transaction_with_retry(self, command_name): + # This can be refactored with MongoClient._retry_with_session. + try: + return self._finish_transaction(command_name) + except ServerSelectionTimeoutError: + raise + except ConnectionFailure as exc: + try: + return self._finish_transaction(command_name) + except ServerSelectionTimeoutError: + # Raise the original error so the application can infer that + # an attempt was made. + raise exc + except OperationFailure as exc: + if exc.code not in _RETRYABLE_ERROR_CODES: + raise + try: + return self._finish_transaction(command_name) + except ServerSelectionTimeoutError: + # Raise the original error so the application can infer that + # an attempt was made. + raise exc + + def _advance_cluster_time(self, cluster_time): + """Internal cluster time helper.""" + if self._cluster_time is None: + self._cluster_time = cluster_time + elif cluster_time is not None: + if cluster_time["clusterTime"] > self._cluster_time["clusterTime"]: + self._cluster_time = cluster_time + + def advance_cluster_time(self, cluster_time): + """Update the cluster time for this session. + + :Parameters: + - `cluster_time`: The + :data:`~pymongo.client_session.ClientSession.cluster_time` from + another `ClientSession` instance. + """ + if not isinstance(cluster_time, abc.Mapping): + raise TypeError( + "cluster_time must be a subclass of collections.Mapping") + if not isinstance(cluster_time.get("clusterTime"), Timestamp): + raise ValueError("Invalid cluster_time") + self._advance_cluster_time(cluster_time) + + def _advance_operation_time(self, operation_time): + """Internal operation time helper.""" + if self._operation_time is None: + self._operation_time = operation_time + elif operation_time is not None: + if operation_time > self._operation_time: + self._operation_time = operation_time + + def advance_operation_time(self, operation_time): + """Update the operation time for this session. + + :Parameters: + - `operation_time`: The + :data:`~pymongo.client_session.ClientSession.operation_time` from + another `ClientSession` instance. + """ + if not isinstance(operation_time, Timestamp): + raise TypeError("operation_time must be an instance " + "of bson.timestamp.Timestamp") + self._advance_operation_time(operation_time) + + @property + def has_ended(self): + """True if this session is finished.""" + return self._server_session is None + + @property + def _in_transaction(self): + """True if this session has an active multi-statement transaction.""" + return self._transaction.active() + + def _txn_read_preference(self): + """Return read preference of this transaction or None.""" + if self._in_transaction: + return self._transaction.opts.read_preference + return None + + def _apply_to(self, command, is_retryable, read_preference, sock_info): + self._check_ended() + + self._server_session.last_use = monotonic.time() + command['lsid'] = self._server_session.session_id + + if not self._in_transaction: + self._transaction.state = _TxnState.NONE + + if is_retryable: + command['txnNumber'] = self._server_session.transaction_id + return + + if self._in_transaction: + if sock_info.is_mongos: + raise ConfigurationError(_MONGOS_NOT_SUPPORTED_MSG) + + if read_preference != ReadPreference.PRIMARY: + raise InvalidOperation( + 'read preference in a transaction must be primary, not: ' + '%r' % (read_preference,)) + + if self._transaction.state == _TxnState.STARTING: + # First command begins a new transaction. + self._transaction.state = _TxnState.IN_PROGRESS + command['startTransaction'] = True + + if self._transaction.opts.read_concern: + rc = self._transaction.opts.read_concern.document + else: + rc = {} + + if (self.options.causal_consistency + and self.operation_time is not None): + rc['afterClusterTime'] = self.operation_time + + if rc: + command['readConcern'] = rc + + command['txnNumber'] = self._server_session.transaction_id + command['autocommit'] = False + + def _start_retryable_write(self): + self._check_ended() + self._server_session.inc_transaction_id() + + +class _ServerSession(object): + def __init__(self): + # Ensure id is type 4, regardless of CodecOptions.uuid_representation. + self.session_id = {'id': Binary(uuid.uuid4().bytes, 4)} + self.last_use = monotonic.time() + self._transaction_id = 0 + + def timed_out(self, session_timeout_minutes): + idle_seconds = monotonic.time() - self.last_use + + # Timed out if we have less than a minute to live. + return idle_seconds > (session_timeout_minutes - 1) * 60 + + @property + def transaction_id(self): + """Positive 64-bit integer.""" + return Int64(self._transaction_id) + + def inc_transaction_id(self): + self._transaction_id += 1 + + +class _ServerSessionPool(collections.deque): + """Pool of _ServerSession objects. + + This class is not thread-safe, access it while holding the Topology lock. + """ + def pop_all(self): + ids = [] + while self: + ids.append(self.pop().session_id) + return ids + + def get_server_session(self, session_timeout_minutes): + # Although the Driver Sessions Spec says we only clear stale sessions + # in return_server_session, PyMongo can't take a lock when returning + # sessions from a __del__ method (like in Cursor.__die), so it can't + # clear stale sessions there. In case many sessions were returned via + # __del__, check for stale sessions here too. + self._clear_stale(session_timeout_minutes) + + # The most recently used sessions are on the left. + while self: + s = self.popleft() + if not s.timed_out(session_timeout_minutes): + return s + + return _ServerSession() + + def return_server_session(self, server_session, session_timeout_minutes): + self._clear_stale(session_timeout_minutes) + if not server_session.timed_out(session_timeout_minutes): + self.appendleft(server_session) + + def return_server_session_no_lock(self, server_session): + self.appendleft(server_session) + + def _clear_stale(self, session_timeout_minutes): + # Clear stale sessions. The least recently used are on the right. + while self: + if self[-1].timed_out(session_timeout_minutes): + self.pop() + else: + # The remaining sessions also haven't timed out. + break diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/collation.py b/mongo_mac/lib/python3.6/site-packages/pymongo/collation.py new file mode 100644 index 0000000..873d603 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/collation.py @@ -0,0 +1,225 @@ +# Copyright 2016 MongoDB, Inc. +# +# 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. + +"""Tools for working with `collations`_. + +.. _collations: http://userguide.icu-project.org/collation/concepts +""" + +from pymongo import common + + +class CollationStrength(object): + """ + An enum that defines values for `strength` on a + :class:`~pymongo.collation.Collation`. + """ + + PRIMARY = 1 + """Differentiate base (unadorned) characters.""" + + SECONDARY = 2 + """Differentiate character accents.""" + + TERTIARY = 3 + """Differentiate character case.""" + + QUATERNARY = 4 + """Differentiate words with and without punctuation.""" + + IDENTICAL = 5 + """Differentiate unicode code point (characters are exactly identical).""" + + +class CollationAlternate(object): + """ + An enum that defines values for `alternate` on a + :class:`~pymongo.collation.Collation`. + """ + + NON_IGNORABLE = 'non-ignorable' + """Spaces and punctuation are treated as base characters.""" + + SHIFTED = 'shifted' + """Spaces and punctuation are *not* considered base characters. + + Spaces and punctuation are distinguished regardless when the + :class:`~pymongo.collation.Collation` strength is at least + :data:`~pymongo.collation.CollationStrength.QUATERNARY`. + + """ + + +class CollationMaxVariable(object): + """ + An enum that defines values for `max_variable` on a + :class:`~pymongo.collation.Collation`. + """ + + PUNCT = 'punct' + """Both punctuation and spaces are ignored.""" + + SPACE = 'space' + """Spaces alone are ignored.""" + + +class CollationCaseFirst(object): + """ + An enum that defines values for `case_first` on a + :class:`~pymongo.collation.Collation`. + """ + + UPPER = 'upper' + """Sort uppercase characters first.""" + + LOWER = 'lower' + """Sort lowercase characters first.""" + + OFF = 'off' + """Default for locale or collation strength.""" + + +class Collation(object): + """Collation + + :Parameters: + - `locale`: (string) The locale of the collation. This should be a string + that identifies an `ICU locale ID` exactly. For example, ``en_US`` is + valid, but ``en_us`` and ``en-US`` are not. Consult the MongoDB + documentation for a list of supported locales. + - `caseLevel`: (optional) If ``True``, turn on case sensitivity if + `strength` is 1 or 2 (case sensitivity is implied if `strength` is + greater than 2). Defaults to ``False``. + - `caseFirst`: (optional) Specify that either uppercase or lowercase + characters take precedence. Must be one of the following values: + + * :data:`~CollationCaseFirst.UPPER` + * :data:`~CollationCaseFirst.LOWER` + * :data:`~CollationCaseFirst.OFF` (the default) + + - `strength`: (optional) Specify the comparison strength. This is also + known as the ICU comparison level. This must be one of the following + values: + + * :data:`~CollationStrength.PRIMARY` + * :data:`~CollationStrength.SECONDARY` + * :data:`~CollationStrength.TERTIARY` (the default) + * :data:`~CollationStrength.QUATERNARY` + * :data:`~CollationStrength.IDENTICAL` + + Each successive level builds upon the previous. For example, a + `strength` of :data:`~CollationStrength.SECONDARY` differentiates + characters based both on the unadorned base character and its accents. + + - `numericOrdering`: (optional) If ``True``, order numbers numerically + instead of in collation order (defaults to ``False``). + - `alternate`: (optional) Specify whether spaces and punctuation are + considered base characters. This must be one of the following values: + + * :data:`~CollationAlternate.NON_IGNORABLE` (the default) + * :data:`~CollationAlternate.SHIFTED` + + - `maxVariable`: (optional) When `alternate` is + :data:`~CollationAlternate.SHIFTED`, this option specifies what + characters may be ignored. This must be one of the following values: + + * :data:`~CollationMaxVariable.PUNCT` (the default) + * :data:`~CollationMaxVariable.SPACE` + + - `normalization`: (optional) If ``True``, normalizes text into Unicode + NFD. Defaults to ``False``. + - `backwards`: (optional) If ``True``, accents on characters are + considered from the back of the word to the front, as it is done in some + French dictionary ordering traditions. Defaults to ``False``. + - `kwargs`: (optional) Keyword arguments supplying any additional options + to be sent with this Collation object. + + .. versionadded: 3.4 + + """ + + __slots__ = ("__document",) + + def __init__(self, locale, + caseLevel=None, + caseFirst=None, + strength=None, + numericOrdering=None, + alternate=None, + maxVariable=None, + normalization=None, + backwards=None, + **kwargs): + locale = common.validate_string('locale', locale) + self.__document = {'locale': locale} + if caseLevel is not None: + self.__document['caseLevel'] = common.validate_boolean( + 'caseLevel', caseLevel) + if caseFirst is not None: + self.__document['caseFirst'] = common.validate_string( + 'caseFirst', caseFirst) + if strength is not None: + self.__document['strength'] = common.validate_integer( + 'strength', strength) + if numericOrdering is not None: + self.__document['numericOrdering'] = common.validate_boolean( + 'numericOrdering', numericOrdering) + if alternate is not None: + self.__document['alternate'] = common.validate_string( + 'alternate', alternate) + if maxVariable is not None: + self.__document['maxVariable'] = common.validate_string( + 'maxVariable', maxVariable) + if normalization is not None: + self.__document['normalization'] = common.validate_boolean( + 'normalization', normalization) + if backwards is not None: + self.__document['backwards'] = common.validate_boolean( + 'backwards', backwards) + self.__document.update(kwargs) + + @property + def document(self): + """The document representation of this collation. + + .. note:: + :class:`Collation` is immutable. Mutating the value of + :attr:`document` does not mutate this :class:`Collation`. + """ + return self.__document.copy() + + def __repr__(self): + document = self.document + return 'Collation(%s)' % ( + ', '.join('%s=%r' % (key, document[key]) for key in document),) + + def __eq__(self, other): + if isinstance(other, Collation): + return self.document == other.document + return NotImplemented + + def __ne__(self, other): + return not self == other + + +def validate_collation_or_none(value): + if value is None: + return None + if isinstance(value, Collation): + return value.document + if isinstance(value, dict): + return value + raise TypeError( + 'collation must be a dict, an instance of collation.Collation, ' + 'or None.') diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/collection.py b/mongo_mac/lib/python3.6/site-packages/pymongo/collection.py new file mode 100644 index 0000000..2f1e521 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/collection.py @@ -0,0 +1,3356 @@ +# Copyright 2009-present MongoDB, Inc. +# +# 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. + +"""Collection level utilities for Mongo.""" + +import datetime +import warnings + +from bson.code import Code +from bson.objectid import ObjectId +from bson.py3compat import (_unicode, + abc, + integer_types, + string_type) +from bson.raw_bson import RawBSONDocument +from bson.codec_options import CodecOptions +from bson.son import SON +from pymongo import (common, + helpers, + message) +from pymongo.bulk import BulkOperationBuilder, _Bulk +from pymongo.command_cursor import CommandCursor, RawBatchCommandCursor +from pymongo.common import ORDERED_TYPES +from pymongo.collation import validate_collation_or_none +from pymongo.change_stream import CollectionChangeStream +from pymongo.cursor import Cursor, RawBatchCursor +from pymongo.errors import (BulkWriteError, + ConfigurationError, + InvalidName, + OperationFailure) +from pymongo.helpers import (_check_write_command_response, + _raise_last_error) +from pymongo.message import _UNICODE_REPLACE_CODEC_OPTIONS +from pymongo.operations import IndexModel +from pymongo.read_preferences import ReadPreference +from pymongo.results import (BulkWriteResult, + DeleteResult, + InsertOneResult, + InsertManyResult, + UpdateResult) +from pymongo.write_concern import WriteConcern + +_NO_OBJ_ERROR = "No matching object found" +_UJOIN = u"%s.%s" +_FIND_AND_MODIFY_DOC_FIELDS = {'value': 1} + + +class ReturnDocument(object): + """An enum used with + :meth:`~pymongo.collection.Collection.find_one_and_replace` and + :meth:`~pymongo.collection.Collection.find_one_and_update`. + """ + BEFORE = False + """Return the original document before it was updated/replaced, or + ``None`` if no document matches the query. + """ + AFTER = True + """Return the updated/replaced or inserted document.""" + + +class Collection(common.BaseObject): + """A Mongo collection. + """ + + def __init__(self, database, name, create=False, codec_options=None, + read_preference=None, write_concern=None, read_concern=None, + session=None, **kwargs): + """Get / create a Mongo collection. + + Raises :class:`TypeError` if `name` is not an instance of + :class:`basestring` (:class:`str` in python 3). Raises + :class:`~pymongo.errors.InvalidName` if `name` is not a valid + collection name. Any additional keyword arguments will be used + as options passed to the create command. See + :meth:`~pymongo.database.Database.create_collection` for valid + options. + + If `create` is ``True``, `collation` is specified, or any additional + keyword arguments are present, a ``create`` command will be + sent, using ``session`` if specified. Otherwise, a ``create`` command + will not be sent and the collection will be created implicitly on first + use. The optional ``session`` argument is *only* used for the ``create`` + command, it is not associated with the collection afterward. + + :Parameters: + - `database`: the database to get a collection from + - `name`: the name of the collection to get + - `create` (optional): if ``True``, force collection + creation even without options being set + - `codec_options` (optional): An instance of + :class:`~bson.codec_options.CodecOptions`. If ``None`` (the + default) database.codec_options is used. + - `read_preference` (optional): The read preference to use. If + ``None`` (the default) database.read_preference is used. + - `write_concern` (optional): An instance of + :class:`~pymongo.write_concern.WriteConcern`. If ``None`` (the + default) database.write_concern is used. + - `read_concern` (optional): An instance of + :class:`~pymongo.read_concern.ReadConcern`. If ``None`` (the + default) database.read_concern is used. + - `collation` (optional): An instance of + :class:`~pymongo.collation.Collation`. If a collation is provided, + it will be passed to the create collection command. This option is + only supported on MongoDB 3.4 and above. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` that is used with + the create collection command + - `**kwargs` (optional): additional keyword arguments will + be passed as options for the create collection command + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.4 + Support the `collation` option. + + .. versionchanged:: 3.2 + Added the read_concern option. + + .. versionchanged:: 3.0 + Added the codec_options, read_preference, and write_concern options. + Removed the uuid_subtype attribute. + :class:`~pymongo.collection.Collection` no longer returns an + instance of :class:`~pymongo.collection.Collection` for attribute + names with leading underscores. You must use dict-style lookups + instead:: + + collection['__my_collection__'] + + Not: + + collection.__my_collection__ + + .. versionchanged:: 2.2 + Removed deprecated argument: options + + .. versionadded:: 2.1 + uuid_subtype attribute + + .. mongodoc:: collections + """ + super(Collection, self).__init__( + codec_options or database.codec_options, + read_preference or database.read_preference, + write_concern or database.write_concern, + read_concern or database.read_concern) + + if not isinstance(name, string_type): + raise TypeError("name must be an instance " + "of %s" % (string_type.__name__,)) + + if not name or ".." in name: + raise InvalidName("collection names cannot be empty") + if "$" in name and not (name.startswith("oplog.$main") or + name.startswith("$cmd")): + raise InvalidName("collection names must not " + "contain '$': %r" % name) + if name[0] == "." or name[-1] == ".": + raise InvalidName("collection names must not start " + "or end with '.': %r" % name) + if "\x00" in name: + raise InvalidName("collection names must not contain the " + "null character") + collation = validate_collation_or_none(kwargs.pop('collation', None)) + + self.__database = database + self.__name = _unicode(name) + self.__full_name = _UJOIN % (self.__database.name, self.__name) + if create or kwargs or collation: + self.__create(kwargs, collation, session) + + self.__write_response_codec_options = self.codec_options._replace( + unicode_decode_error_handler='replace', + document_class=dict) + + def _socket_for_reads(self, session): + return self.__database.client._socket_for_reads( + self._read_preference_for(session)) + + def _socket_for_primary_reads(self, session): + read_pref = ((session and session._txn_read_preference()) + or ReadPreference.PRIMARY) + return self.__database.client._socket_for_reads(read_pref), read_pref + + def _socket_for_writes(self): + return self.__database.client._socket_for_writes() + + def _command(self, sock_info, command, slave_ok=False, + read_preference=None, + codec_options=None, check=True, allowable_errors=None, + read_concern=None, + write_concern=None, + collation=None, + session=None, + retryable_write=False, + user_fields=None): + """Internal command helper. + + :Parameters: + - `sock_info` - A SocketInfo instance. + - `command` - The command itself, as a SON instance. + - `slave_ok`: whether to set the SlaveOkay wire protocol bit. + - `codec_options` (optional) - An instance of + :class:`~bson.codec_options.CodecOptions`. + - `check`: raise OperationFailure if there are errors + - `allowable_errors`: errors to ignore if `check` is True + - `read_concern` (optional) - An instance of + :class:`~pymongo.read_concern.ReadConcern`. + - `write_concern`: An instance of + :class:`~pymongo.write_concern.WriteConcern`. This option is only + valid for MongoDB 3.4 and above. + - `collation` (optional) - An instance of + :class:`~pymongo.collation.Collation`. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `retryable_write` (optional): True if this command is a retryable + write. + - `user_fields` (optional): Response fields that should be decoded + using the TypeDecoders from codec_options, passed to + bson._decode_all_selective. + + :Returns: + The result document. + """ + with self.__database.client._tmp_session(session) as s: + return sock_info.command( + self.__database.name, + command, + slave_ok, + read_preference or self._read_preference_for(session), + codec_options or self.codec_options, + check, + allowable_errors, + read_concern=read_concern, + write_concern=write_concern, + parse_write_concern_error=True, + collation=collation, + session=s, + client=self.__database.client, + retryable_write=retryable_write, + user_fields=user_fields) + + def __create(self, options, collation, session): + """Sends a create command with the given options. + """ + cmd = SON([("create", self.__name)]) + if options: + if "size" in options: + options["size"] = float(options["size"]) + cmd.update(options) + with self._socket_for_writes() as sock_info: + self._command( + sock_info, cmd, read_preference=ReadPreference.PRIMARY, + write_concern=self._write_concern_for(session), + collation=collation, session=session) + + def __getattr__(self, name): + """Get a sub-collection of this collection by name. + + Raises InvalidName if an invalid collection name is used. + + :Parameters: + - `name`: the name of the collection to get + """ + if name.startswith('_'): + full_name = _UJOIN % (self.__name, name) + raise AttributeError( + "Collection has no attribute %r. To access the %s" + " collection, use database['%s']." % ( + name, full_name, full_name)) + return self.__getitem__(name) + + def __getitem__(self, name): + return Collection(self.__database, + _UJOIN % (self.__name, name), + False, + self.codec_options, + self.read_preference, + self.write_concern, + self.read_concern) + + def __repr__(self): + return "Collection(%r, %r)" % (self.__database, self.__name) + + def __eq__(self, other): + if isinstance(other, Collection): + return (self.__database == other.database and + self.__name == other.name) + return NotImplemented + + def __ne__(self, other): + return not self == other + + @property + def full_name(self): + """The full name of this :class:`Collection`. + + The full name is of the form `database_name.collection_name`. + """ + return self.__full_name + + @property + def name(self): + """The name of this :class:`Collection`.""" + return self.__name + + @property + def database(self): + """The :class:`~pymongo.database.Database` that this + :class:`Collection` is a part of. + """ + return self.__database + + def with_options(self, codec_options=None, read_preference=None, + write_concern=None, read_concern=None): + """Get a clone of this collection changing the specified settings. + + >>> coll1.read_preference + Primary() + >>> from pymongo import ReadPreference + >>> coll2 = coll1.with_options(read_preference=ReadPreference.SECONDARY) + >>> coll1.read_preference + Primary() + >>> coll2.read_preference + Secondary(tag_sets=None) + + :Parameters: + - `codec_options` (optional): An instance of + :class:`~bson.codec_options.CodecOptions`. If ``None`` (the + default) the :attr:`codec_options` of this :class:`Collection` + is used. + - `read_preference` (optional): The read preference to use. If + ``None`` (the default) the :attr:`read_preference` of this + :class:`Collection` is used. See :mod:`~pymongo.read_preferences` + for options. + - `write_concern` (optional): An instance of + :class:`~pymongo.write_concern.WriteConcern`. If ``None`` (the + default) the :attr:`write_concern` of this :class:`Collection` + is used. + - `read_concern` (optional): An instance of + :class:`~pymongo.read_concern.ReadConcern`. If ``None`` (the + default) the :attr:`read_concern` of this :class:`Collection` + is used. + """ + return Collection(self.__database, + self.__name, + False, + codec_options or self.codec_options, + read_preference or self.read_preference, + write_concern or self.write_concern, + read_concern or self.read_concern) + + def initialize_unordered_bulk_op(self, bypass_document_validation=False): + """**DEPRECATED** - Initialize an unordered batch of write operations. + + Operations will be performed on the server in arbitrary order, + possibly in parallel. All operations will be attempted. + + :Parameters: + - `bypass_document_validation`: (optional) If ``True``, allows the + write to opt-out of document level validation. Default is + ``False``. + + Returns a :class:`~pymongo.bulk.BulkOperationBuilder` instance. + + See :ref:`unordered_bulk` for examples. + + .. note:: `bypass_document_validation` requires server version + **>= 3.2** + + .. versionchanged:: 3.5 + Deprecated. Use :meth:`~pymongo.collection.Collection.bulk_write` + instead. + + .. versionchanged:: 3.2 + Added bypass_document_validation support + + .. versionadded:: 2.7 + """ + warnings.warn("initialize_unordered_bulk_op is deprecated", + DeprecationWarning, stacklevel=2) + return BulkOperationBuilder(self, False, bypass_document_validation) + + def initialize_ordered_bulk_op(self, bypass_document_validation=False): + """**DEPRECATED** - Initialize an ordered batch of write operations. + + Operations will be performed on the server serially, in the + order provided. If an error occurs all remaining operations + are aborted. + + :Parameters: + - `bypass_document_validation`: (optional) If ``True``, allows the + write to opt-out of document level validation. Default is + ``False``. + + Returns a :class:`~pymongo.bulk.BulkOperationBuilder` instance. + + See :ref:`ordered_bulk` for examples. + + .. note:: `bypass_document_validation` requires server version + **>= 3.2** + + .. versionchanged:: 3.5 + Deprecated. Use :meth:`~pymongo.collection.Collection.bulk_write` + instead. + + .. versionchanged:: 3.2 + Added bypass_document_validation support + + .. versionadded:: 2.7 + """ + warnings.warn("initialize_ordered_bulk_op is deprecated", + DeprecationWarning, stacklevel=2) + return BulkOperationBuilder(self, True, bypass_document_validation) + + def bulk_write(self, requests, ordered=True, + bypass_document_validation=False, session=None): + """Send a batch of write operations to the server. + + Requests are passed as a list of write operation instances ( + :class:`~pymongo.operations.InsertOne`, + :class:`~pymongo.operations.UpdateOne`, + :class:`~pymongo.operations.UpdateMany`, + :class:`~pymongo.operations.ReplaceOne`, + :class:`~pymongo.operations.DeleteOne`, or + :class:`~pymongo.operations.DeleteMany`). + + >>> for doc in db.test.find({}): + ... print(doc) + ... + {u'x': 1, u'_id': ObjectId('54f62e60fba5226811f634ef')} + {u'x': 1, u'_id': ObjectId('54f62e60fba5226811f634f0')} + >>> # DeleteMany, UpdateOne, and UpdateMany are also available. + ... + >>> from pymongo import InsertOne, DeleteOne, ReplaceOne + >>> requests = [InsertOne({'y': 1}), DeleteOne({'x': 1}), + ... ReplaceOne({'w': 1}, {'z': 1}, upsert=True)] + >>> result = db.test.bulk_write(requests) + >>> result.inserted_count + 1 + >>> result.deleted_count + 1 + >>> result.modified_count + 0 + >>> result.upserted_ids + {2: ObjectId('54f62ee28891e756a6e1abd5')} + >>> for doc in db.test.find({}): + ... print(doc) + ... + {u'x': 1, u'_id': ObjectId('54f62e60fba5226811f634f0')} + {u'y': 1, u'_id': ObjectId('54f62ee2fba5226811f634f1')} + {u'z': 1, u'_id': ObjectId('54f62ee28891e756a6e1abd5')} + + :Parameters: + - `requests`: A list of write operations (see examples above). + - `ordered` (optional): If ``True`` (the default) requests will be + performed on the server serially, in the order provided. If an error + occurs all remaining operations are aborted. If ``False`` requests + will be performed on the server in arbitrary order, possibly in + parallel, and all operations will be attempted. + - `bypass_document_validation`: (optional) If ``True``, allows the + write to opt-out of document level validation. Default is + ``False``. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + :Returns: + An instance of :class:`~pymongo.results.BulkWriteResult`. + + .. seealso:: :ref:`writes-and-ids` + + .. note:: `bypass_document_validation` requires server version + **>= 3.2** + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.2 + Added bypass_document_validation support + + .. versionadded:: 3.0 + """ + common.validate_list("requests", requests) + + blk = _Bulk(self, ordered, bypass_document_validation) + for request in requests: + try: + request._add_to_bulk(blk) + except AttributeError: + raise TypeError("%r is not a valid request" % (request,)) + + write_concern = self._write_concern_for(session) + bulk_api_result = blk.execute(write_concern, session) + if bulk_api_result is not None: + return BulkWriteResult(bulk_api_result, True) + return BulkWriteResult({}, False) + + def _legacy_write(self, sock_info, name, cmd, op_id, + bypass_doc_val, func, *args): + """Internal legacy unacknowledged write helper.""" + # Cannot have both unacknowledged write and bypass document validation. + if bypass_doc_val and sock_info.max_wire_version >= 4: + raise OperationFailure("Cannot set bypass_document_validation with" + " unacknowledged write concern") + listeners = self.database.client._event_listeners + publish = listeners.enabled_for_commands + + if publish: + start = datetime.datetime.now() + args = args + (sock_info.compression_context,) + rqst_id, msg, max_size = func(*args) + if publish: + duration = datetime.datetime.now() - start + listeners.publish_command_start( + cmd, self.__database.name, rqst_id, sock_info.address, op_id) + start = datetime.datetime.now() + try: + result = sock_info.legacy_write(rqst_id, msg, max_size, False) + except Exception as exc: + if publish: + dur = (datetime.datetime.now() - start) + duration + if isinstance(exc, OperationFailure): + details = exc.details + # Succeed if GLE was successful and this is a write error. + if details.get("ok") and "n" in details: + reply = message._convert_write_result( + name, cmd, details) + listeners.publish_command_success( + dur, reply, name, rqst_id, sock_info.address, op_id) + raise + else: + details = message._convert_exception(exc) + listeners.publish_command_failure( + dur, details, name, rqst_id, sock_info.address, op_id) + raise + if publish: + if result is not None: + reply = message._convert_write_result(name, cmd, result) + else: + # Comply with APM spec. + reply = {'ok': 1} + duration = (datetime.datetime.now() - start) + duration + listeners.publish_command_success( + duration, reply, name, rqst_id, sock_info.address, op_id) + return result + + def _insert_one( + self, doc, ordered, + check_keys, manipulate, write_concern, op_id, bypass_doc_val, + session): + """Internal helper for inserting a single document.""" + if manipulate: + doc = self.__database._apply_incoming_manipulators(doc, self) + if not isinstance(doc, RawBSONDocument) and '_id' not in doc: + doc['_id'] = ObjectId() + doc = self.__database._apply_incoming_copying_manipulators(doc, + self) + write_concern = write_concern or self.write_concern + acknowledged = write_concern.acknowledged + command = SON([('insert', self.name), + ('ordered', ordered), + ('documents', [doc])]) + if not write_concern.is_server_default: + command['writeConcern'] = write_concern.document + + def _insert_command(session, sock_info, retryable_write): + if not sock_info.op_msg_enabled and not acknowledged: + # Legacy OP_INSERT. + return self._legacy_write( + sock_info, 'insert', command, op_id, + bypass_doc_val, message.insert, self.__full_name, + [doc], check_keys, False, write_concern.document, False, + self.__write_response_codec_options) + + if bypass_doc_val and sock_info.max_wire_version >= 4: + command['bypassDocumentValidation'] = True + + result = sock_info.command( + self.__database.name, + command, + write_concern=write_concern, + codec_options=self.__write_response_codec_options, + check_keys=check_keys, + session=session, + client=self.__database.client, + retryable_write=retryable_write) + + _check_write_command_response(result) + + self.__database.client._retryable_write( + acknowledged, _insert_command, session) + + if not isinstance(doc, RawBSONDocument): + return doc.get('_id') + + def _insert(self, docs, ordered=True, check_keys=True, + manipulate=False, write_concern=None, op_id=None, + bypass_doc_val=False, session=None): + """Internal insert helper.""" + if isinstance(docs, abc.Mapping): + return self._insert_one( + docs, ordered, check_keys, manipulate, write_concern, op_id, + bypass_doc_val, session) + + ids = [] + + if manipulate: + def gen(): + """Generator that applies SON manipulators to each document + and adds _id if necessary. + """ + _db = self.__database + for doc in docs: + # Apply user-configured SON manipulators. This order of + # operations is required for backwards compatibility, + # see PYTHON-709. + doc = _db._apply_incoming_manipulators(doc, self) + if not (isinstance(doc, RawBSONDocument) or '_id' in doc): + doc['_id'] = ObjectId() + + doc = _db._apply_incoming_copying_manipulators(doc, self) + ids.append(doc['_id']) + yield doc + else: + def gen(): + """Generator that only tracks existing _ids.""" + for doc in docs: + # Don't inflate RawBSONDocument by touching fields. + if not isinstance(doc, RawBSONDocument): + ids.append(doc.get('_id')) + yield doc + + write_concern = write_concern or self._write_concern_for(session) + blk = _Bulk(self, ordered, bypass_doc_val) + blk.ops = [(message._INSERT, doc) for doc in gen()] + try: + blk.execute(write_concern, session=session) + except BulkWriteError as bwe: + _raise_last_error(bwe.details) + return ids + + def insert_one(self, document, bypass_document_validation=False, + session=None): + """Insert a single document. + + >>> db.test.count_documents({'x': 1}) + 0 + >>> result = db.test.insert_one({'x': 1}) + >>> result.inserted_id + ObjectId('54f112defba522406c9cc208') + >>> db.test.find_one({'x': 1}) + {u'x': 1, u'_id': ObjectId('54f112defba522406c9cc208')} + + :Parameters: + - `document`: The document to insert. Must be a mutable mapping + type. If the document does not have an _id field one will be + added automatically. + - `bypass_document_validation`: (optional) If ``True``, allows the + write to opt-out of document level validation. Default is + ``False``. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + :Returns: + - An instance of :class:`~pymongo.results.InsertOneResult`. + + .. seealso:: :ref:`writes-and-ids` + + .. note:: `bypass_document_validation` requires server version + **>= 3.2** + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.2 + Added bypass_document_validation support + + .. versionadded:: 3.0 + """ + common.validate_is_document_type("document", document) + if not (isinstance(document, RawBSONDocument) or "_id" in document): + document["_id"] = ObjectId() + + write_concern = self._write_concern_for(session) + return InsertOneResult( + self._insert(document, + write_concern=write_concern, + bypass_doc_val=bypass_document_validation, + session=session), + write_concern.acknowledged) + + def insert_many(self, documents, ordered=True, + bypass_document_validation=False, session=None): + """Insert an iterable of documents. + + >>> db.test.count_documents({}) + 0 + >>> result = db.test.insert_many([{'x': i} for i in range(2)]) + >>> result.inserted_ids + [ObjectId('54f113fffba522406c9cc20e'), ObjectId('54f113fffba522406c9cc20f')] + >>> db.test.count_documents({}) + 2 + + :Parameters: + - `documents`: A iterable of documents to insert. + - `ordered` (optional): If ``True`` (the default) documents will be + inserted on the server serially, in the order provided. If an error + occurs all remaining inserts are aborted. If ``False``, documents + will be inserted on the server in arbitrary order, possibly in + parallel, and all document inserts will be attempted. + - `bypass_document_validation`: (optional) If ``True``, allows the + write to opt-out of document level validation. Default is + ``False``. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + :Returns: + An instance of :class:`~pymongo.results.InsertManyResult`. + + .. seealso:: :ref:`writes-and-ids` + + .. note:: `bypass_document_validation` requires server version + **>= 3.2** + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.2 + Added bypass_document_validation support + + .. versionadded:: 3.0 + """ + if not isinstance(documents, abc.Iterable) or not documents: + raise TypeError("documents must be a non-empty list") + inserted_ids = [] + def gen(): + """A generator that validates documents and handles _ids.""" + for document in documents: + common.validate_is_document_type("document", document) + if not isinstance(document, RawBSONDocument): + if "_id" not in document: + document["_id"] = ObjectId() + inserted_ids.append(document["_id"]) + yield (message._INSERT, document) + + write_concern = self._write_concern_for(session) + blk = _Bulk(self, ordered, bypass_document_validation) + blk.ops = [doc for doc in gen()] + blk.execute(write_concern, session=session) + return InsertManyResult(inserted_ids, write_concern.acknowledged) + + def _update(self, sock_info, criteria, document, upsert=False, + check_keys=True, multi=False, manipulate=False, + write_concern=None, op_id=None, ordered=True, + bypass_doc_val=False, collation=None, array_filters=None, + session=None, retryable_write=False): + """Internal update / replace helper.""" + common.validate_boolean("upsert", upsert) + if manipulate: + document = self.__database._fix_incoming(document, self) + collation = validate_collation_or_none(collation) + write_concern = write_concern or self.write_concern + acknowledged = write_concern.acknowledged + update_doc = SON([('q', criteria), + ('u', document), + ('multi', multi), + ('upsert', upsert)]) + if collation is not None: + if sock_info.max_wire_version < 5: + raise ConfigurationError( + 'Must be connected to MongoDB 3.4+ to use collations.') + elif not acknowledged: + raise ConfigurationError( + 'Collation is unsupported for unacknowledged writes.') + else: + update_doc['collation'] = collation + if array_filters is not None: + if sock_info.max_wire_version < 6: + raise ConfigurationError( + 'Must be connected to MongoDB 3.6+ to use array_filters.') + elif not acknowledged: + raise ConfigurationError( + 'arrayFilters is unsupported for unacknowledged writes.') + else: + update_doc['arrayFilters'] = array_filters + command = SON([('update', self.name), + ('ordered', ordered), + ('updates', [update_doc])]) + if not write_concern.is_server_default: + command['writeConcern'] = write_concern.document + + if not sock_info.op_msg_enabled and not acknowledged: + # Legacy OP_UPDATE. + return self._legacy_write( + sock_info, 'update', command, op_id, + bypass_doc_val, message.update, self.__full_name, upsert, + multi, criteria, document, False, write_concern.document, + check_keys, self.__write_response_codec_options) + + # Update command. + if bypass_doc_val and sock_info.max_wire_version >= 4: + command['bypassDocumentValidation'] = True + + # The command result has to be published for APM unmodified + # so we make a shallow copy here before adding updatedExisting. + result = sock_info.command( + self.__database.name, + command, + write_concern=write_concern, + codec_options=self.__write_response_codec_options, + session=session, + client=self.__database.client, + retryable_write=retryable_write).copy() + _check_write_command_response(result) + # Add the updatedExisting field for compatibility. + if result.get('n') and 'upserted' not in result: + result['updatedExisting'] = True + else: + result['updatedExisting'] = False + # MongoDB >= 2.6.0 returns the upsert _id in an array + # element. Break it out for backward compatibility. + if 'upserted' in result: + result['upserted'] = result['upserted'][0]['_id'] + + if not acknowledged: + return None + return result + + def _update_retryable( + self, criteria, document, upsert=False, + check_keys=True, multi=False, manipulate=False, + write_concern=None, op_id=None, ordered=True, + bypass_doc_val=False, collation=None, array_filters=None, + session=None): + """Internal update / replace helper.""" + def _update(session, sock_info, retryable_write): + return self._update( + sock_info, criteria, document, upsert=upsert, + check_keys=check_keys, multi=multi, manipulate=manipulate, + write_concern=write_concern, op_id=op_id, ordered=ordered, + bypass_doc_val=bypass_doc_val, collation=collation, + array_filters=array_filters, session=session, + retryable_write=retryable_write) + + return self.__database.client._retryable_write( + (write_concern or self.write_concern).acknowledged and not multi, + _update, session) + + def replace_one(self, filter, replacement, upsert=False, + bypass_document_validation=False, collation=None, + session=None): + """Replace a single document matching the filter. + + >>> for doc in db.test.find({}): + ... print(doc) + ... + {u'x': 1, u'_id': ObjectId('54f4c5befba5220aa4d6dee7')} + >>> result = db.test.replace_one({'x': 1}, {'y': 1}) + >>> result.matched_count + 1 + >>> result.modified_count + 1 + >>> for doc in db.test.find({}): + ... print(doc) + ... + {u'y': 1, u'_id': ObjectId('54f4c5befba5220aa4d6dee7')} + + The *upsert* option can be used to insert a new document if a matching + document does not exist. + + >>> result = db.test.replace_one({'x': 1}, {'x': 1}, True) + >>> result.matched_count + 0 + >>> result.modified_count + 0 + >>> result.upserted_id + ObjectId('54f11e5c8891e756a6e1abd4') + >>> db.test.find_one({'x': 1}) + {u'x': 1, u'_id': ObjectId('54f11e5c8891e756a6e1abd4')} + + :Parameters: + - `filter`: A query that matches the document to replace. + - `replacement`: The new document. + - `upsert` (optional): If ``True``, perform an insert if no documents + match the filter. + - `bypass_document_validation`: (optional) If ``True``, allows the + write to opt-out of document level validation. Default is + ``False``. + - `collation` (optional): An instance of + :class:`~pymongo.collation.Collation`. This option is only supported + on MongoDB 3.4 and above. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + :Returns: + - An instance of :class:`~pymongo.results.UpdateResult`. + + .. note:: `bypass_document_validation` requires server version + **>= 3.2** + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.4 + Added the `collation` option. + + .. versionchanged:: 3.2 + Added bypass_document_validation support + + .. versionadded:: 3.0 + """ + common.validate_is_mapping("filter", filter) + common.validate_ok_for_replace(replacement) + + write_concern = self._write_concern_for(session) + return UpdateResult( + self._update_retryable( + filter, replacement, upsert, + write_concern=write_concern, + bypass_doc_val=bypass_document_validation, + collation=collation, session=session), + write_concern.acknowledged) + + def update_one(self, filter, update, upsert=False, + bypass_document_validation=False, + collation=None, array_filters=None, session=None): + """Update a single document matching the filter. + + >>> for doc in db.test.find(): + ... print(doc) + ... + {u'x': 1, u'_id': 0} + {u'x': 1, u'_id': 1} + {u'x': 1, u'_id': 2} + >>> result = db.test.update_one({'x': 1}, {'$inc': {'x': 3}}) + >>> result.matched_count + 1 + >>> result.modified_count + 1 + >>> for doc in db.test.find(): + ... print(doc) + ... + {u'x': 4, u'_id': 0} + {u'x': 1, u'_id': 1} + {u'x': 1, u'_id': 2} + + :Parameters: + - `filter`: A query that matches the document to update. + - `update`: The modifications to apply. + - `upsert` (optional): If ``True``, perform an insert if no documents + match the filter. + - `bypass_document_validation`: (optional) If ``True``, allows the + write to opt-out of document level validation. Default is + ``False``. + - `collation` (optional): An instance of + :class:`~pymongo.collation.Collation`. This option is only supported + on MongoDB 3.4 and above. + - `array_filters` (optional): A list of filters specifying which + array elements an update should apply. Requires MongoDB 3.6+. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + :Returns: + - An instance of :class:`~pymongo.results.UpdateResult`. + + .. note:: `bypass_document_validation` requires server version + **>= 3.2** + + .. versionchanged:: 3.6 + Added the `array_filters` and ``session`` parameters. + + .. versionchanged:: 3.4 + Added the `collation` option. + + .. versionchanged:: 3.2 + Added bypass_document_validation support + + .. versionadded:: 3.0 + """ + common.validate_is_mapping("filter", filter) + common.validate_ok_for_update(update) + common.validate_list_or_none('array_filters', array_filters) + + write_concern = self._write_concern_for(session) + return UpdateResult( + self._update_retryable( + filter, update, upsert, check_keys=False, + write_concern=write_concern, + bypass_doc_val=bypass_document_validation, + collation=collation, array_filters=array_filters, + session=session), + write_concern.acknowledged) + + def update_many(self, filter, update, upsert=False, array_filters=None, + bypass_document_validation=False, collation=None, + session=None): + """Update one or more documents that match the filter. + + >>> for doc in db.test.find(): + ... print(doc) + ... + {u'x': 1, u'_id': 0} + {u'x': 1, u'_id': 1} + {u'x': 1, u'_id': 2} + >>> result = db.test.update_many({'x': 1}, {'$inc': {'x': 3}}) + >>> result.matched_count + 3 + >>> result.modified_count + 3 + >>> for doc in db.test.find(): + ... print(doc) + ... + {u'x': 4, u'_id': 0} + {u'x': 4, u'_id': 1} + {u'x': 4, u'_id': 2} + + :Parameters: + - `filter`: A query that matches the documents to update. + - `update`: The modifications to apply. + - `upsert` (optional): If ``True``, perform an insert if no documents + match the filter. + - `bypass_document_validation` (optional): If ``True``, allows the + write to opt-out of document level validation. Default is + ``False``. + - `collation` (optional): An instance of + :class:`~pymongo.collation.Collation`. This option is only supported + on MongoDB 3.4 and above. + - `array_filters` (optional): A list of filters specifying which + array elements an update should apply. Requires MongoDB 3.6+. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + :Returns: + - An instance of :class:`~pymongo.results.UpdateResult`. + + .. note:: `bypass_document_validation` requires server version + **>= 3.2** + + .. versionchanged:: 3.6 + Added ``array_filters`` and ``session`` parameters. + + .. versionchanged:: 3.4 + Added the `collation` option. + + .. versionchanged:: 3.2 + Added bypass_document_validation support + + .. versionadded:: 3.0 + """ + common.validate_is_mapping("filter", filter) + common.validate_ok_for_update(update) + common.validate_list_or_none('array_filters', array_filters) + + write_concern = self._write_concern_for(session) + return UpdateResult( + self._update_retryable( + filter, update, upsert, check_keys=False, multi=True, + write_concern=write_concern, + bypass_doc_val=bypass_document_validation, + collation=collation, array_filters=array_filters, + session=session), + write_concern.acknowledged) + + def drop(self, session=None): + """Alias for :meth:`~pymongo.database.Database.drop_collection`. + + :Parameters: + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + The following two calls are equivalent: + + >>> db.foo.drop() + >>> db.drop_collection("foo") + + .. versionchanged:: 3.7 + :meth:`drop` now respects this :class:`Collection`'s :attr:`write_concern`. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + dbo = self.__database.client.get_database( + self.__database.name, + self.codec_options, + self.read_preference, + self.write_concern, + self.read_concern) + dbo.drop_collection(self.__name, session=session) + + def _delete( + self, sock_info, criteria, multi, + write_concern=None, op_id=None, ordered=True, + collation=None, session=None, retryable_write=False): + """Internal delete helper.""" + common.validate_is_mapping("filter", criteria) + write_concern = write_concern or self.write_concern + acknowledged = write_concern.acknowledged + delete_doc = SON([('q', criteria), + ('limit', int(not multi))]) + collation = validate_collation_or_none(collation) + if collation is not None: + if sock_info.max_wire_version < 5: + raise ConfigurationError( + 'Must be connected to MongoDB 3.4+ to use collations.') + elif not acknowledged: + raise ConfigurationError( + 'Collation is unsupported for unacknowledged writes.') + else: + delete_doc['collation'] = collation + command = SON([('delete', self.name), + ('ordered', ordered), + ('deletes', [delete_doc])]) + if not write_concern.is_server_default: + command['writeConcern'] = write_concern.document + + if not sock_info.op_msg_enabled and not acknowledged: + # Legacy OP_DELETE. + return self._legacy_write( + sock_info, 'delete', command, op_id, + False, message.delete, self.__full_name, criteria, + False, write_concern.document, + self.__write_response_codec_options, + int(not multi)) + # Delete command. + result = sock_info.command( + self.__database.name, + command, + write_concern=write_concern, + codec_options=self.__write_response_codec_options, + session=session, + client=self.__database.client, + retryable_write=retryable_write) + _check_write_command_response(result) + return result + + def _delete_retryable( + self, criteria, multi, + write_concern=None, op_id=None, ordered=True, + collation=None, session=None): + """Internal delete helper.""" + def _delete(session, sock_info, retryable_write): + return self._delete( + sock_info, criteria, multi, + write_concern=write_concern, op_id=op_id, ordered=ordered, + collation=collation, session=session, + retryable_write=retryable_write) + + return self.__database.client._retryable_write( + (write_concern or self.write_concern).acknowledged and not multi, + _delete, session) + + def delete_one(self, filter, collation=None, session=None): + """Delete a single document matching the filter. + + >>> db.test.count_documents({'x': 1}) + 3 + >>> result = db.test.delete_one({'x': 1}) + >>> result.deleted_count + 1 + >>> db.test.count_documents({'x': 1}) + 2 + + :Parameters: + - `filter`: A query that matches the document to delete. + - `collation` (optional): An instance of + :class:`~pymongo.collation.Collation`. This option is only supported + on MongoDB 3.4 and above. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + :Returns: + - An instance of :class:`~pymongo.results.DeleteResult`. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.4 + Added the `collation` option. + + .. versionadded:: 3.0 + """ + write_concern = self._write_concern_for(session) + return DeleteResult( + self._delete_retryable( + filter, False, + write_concern=write_concern, + collation=collation, session=session), + write_concern.acknowledged) + + def delete_many(self, filter, collation=None, session=None): + """Delete one or more documents matching the filter. + + >>> db.test.count_documents({'x': 1}) + 3 + >>> result = db.test.delete_many({'x': 1}) + >>> result.deleted_count + 3 + >>> db.test.count_documents({'x': 1}) + 0 + + :Parameters: + - `filter`: A query that matches the documents to delete. + - `collation` (optional): An instance of + :class:`~pymongo.collation.Collation`. This option is only supported + on MongoDB 3.4 and above. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + :Returns: + - An instance of :class:`~pymongo.results.DeleteResult`. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.4 + Added the `collation` option. + + .. versionadded:: 3.0 + """ + write_concern = self._write_concern_for(session) + return DeleteResult( + self._delete_retryable( + filter, True, + write_concern=write_concern, + collation=collation, session=session), + write_concern.acknowledged) + + def find_one(self, filter=None, *args, **kwargs): + """Get a single document from the database. + + All arguments to :meth:`find` are also valid arguments for + :meth:`find_one`, although any `limit` argument will be + ignored. Returns a single document, or ``None`` if no matching + document is found. + + The :meth:`find_one` method obeys the :attr:`read_preference` of + this :class:`Collection`. + + :Parameters: + + - `filter` (optional): a dictionary specifying + the query to be performed OR any other type to be used as + the value for a query for ``"_id"``. + + - `*args` (optional): any additional positional arguments + are the same as the arguments to :meth:`find`. + + - `**kwargs` (optional): any additional keyword arguments + are the same as the arguments to :meth:`find`. + + >>> collection.find_one(max_time_ms=100) + """ + if (filter is not None and not + isinstance(filter, abc.Mapping)): + filter = {"_id": filter} + + cursor = self.find(filter, *args, **kwargs) + for result in cursor.limit(-1): + return result + return None + + def find(self, *args, **kwargs): + """Query the database. + + The `filter` argument is a prototype document that all results + must match. For example: + + >>> db.test.find({"hello": "world"}) + + only matches documents that have a key "hello" with value + "world". Matches can have other keys *in addition* to + "hello". The `projection` argument is used to specify a subset + of fields that should be included in the result documents. By + limiting results to a certain subset of fields you can cut + down on network traffic and decoding time. + + Raises :class:`TypeError` if any of the arguments are of + improper type. Returns an instance of + :class:`~pymongo.cursor.Cursor` corresponding to this query. + + The :meth:`find` method obeys the :attr:`read_preference` of + this :class:`Collection`. + + :Parameters: + - `filter` (optional): a SON object specifying elements which + must be present for a document to be included in the + result set + - `projection` (optional): a list of field names that should be + returned in the result set or a dict specifying the fields + to include or exclude. If `projection` is a list "_id" will + always be returned. Use a dict to exclude fields from + the result (e.g. projection={'_id': False}). + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `skip` (optional): the number of documents to omit (from + the start of the result set) when returning the results + - `limit` (optional): the maximum number of results to + return. A limit of 0 (the default) is equivalent to setting no + limit. + - `no_cursor_timeout` (optional): if False (the default), any + returned cursor is closed by the server after 10 minutes of + inactivity. If set to True, the returned cursor will never + time out on the server. Care should be taken to ensure that + cursors with no_cursor_timeout turned on are properly closed. + - `cursor_type` (optional): the type of cursor to return. The valid + options are defined by :class:`~pymongo.cursor.CursorType`: + + - :attr:`~pymongo.cursor.CursorType.NON_TAILABLE` - the result of + this find call will return a standard cursor over the result set. + - :attr:`~pymongo.cursor.CursorType.TAILABLE` - the result of this + find call will be a tailable cursor - tailable cursors are only + for use with capped collections. They are not closed when the + last data is retrieved but are kept open and the cursor location + marks the final document position. If more data is received + iteration of the cursor will continue from the last document + received. For details, see the `tailable cursor documentation + <http://www.mongodb.org/display/DOCS/Tailable+Cursors>`_. + - :attr:`~pymongo.cursor.CursorType.TAILABLE_AWAIT` - the result + of this find call will be a tailable cursor with the await flag + set. The server will wait for a few seconds after returning the + full result set so that it can capture and return additional data + added during the query. + - :attr:`~pymongo.cursor.CursorType.EXHAUST` - the result of this + find call will be an exhaust cursor. MongoDB will stream batched + results to the client without waiting for the client to request + each batch, reducing latency. See notes on compatibility below. + + - `sort` (optional): a list of (key, direction) pairs + specifying the sort order for this query. See + :meth:`~pymongo.cursor.Cursor.sort` for details. + - `allow_partial_results` (optional): if True, mongos will return + partial results if some shards are down instead of returning an + error. + - `oplog_replay` (optional): If True, set the oplogReplay query + flag. + - `batch_size` (optional): Limits the number of documents returned in + a single batch. + - `manipulate` (optional): **DEPRECATED** - If True (the default), + apply any outgoing SON manipulators before returning. + - `collation` (optional): An instance of + :class:`~pymongo.collation.Collation`. This option is only supported + on MongoDB 3.4 and above. + - `return_key` (optional): If True, return only the index keys in + each document. + - `show_record_id` (optional): If True, adds a field ``$recordId`` in + each document with the storage engine's internal record identifier. + - `snapshot` (optional): **DEPRECATED** - If True, prevents the + cursor from returning a document more than once because of an + intervening write operation. + - `hint` (optional): An index, in the same format as passed to + :meth:`~pymongo.collection.Collection.create_index` (e.g. + ``[('field', ASCENDING)]``). Pass this as an alternative to calling + :meth:`~pymongo.cursor.Cursor.hint` on the cursor to tell Mongo the + proper index to use for the query. + - `max_time_ms` (optional): Specifies a time limit for a query + operation. If the specified time is exceeded, the operation will be + aborted and :exc:`~pymongo.errors.ExecutionTimeout` is raised. Pass + this as an alternative to calling + :meth:`~pymongo.cursor.Cursor.max_time_ms` on the cursor. + - `max_scan` (optional): **DEPRECATED** - The maximum number of + documents to scan. Pass this as an alternative to calling + :meth:`~pymongo.cursor.Cursor.max_scan` on the cursor. + - `min` (optional): A list of field, limit pairs specifying the + inclusive lower bound for all keys of a specific index in order. + Pass this as an alternative to calling + :meth:`~pymongo.cursor.Cursor.min` on the cursor. ``hint`` must + also be passed to ensure the query utilizes the correct index. + - `max` (optional): A list of field, limit pairs specifying the + exclusive upper bound for all keys of a specific index in order. + Pass this as an alternative to calling + :meth:`~pymongo.cursor.Cursor.max` on the cursor. ``hint`` must + also be passed to ensure the query utilizes the correct index. + - `comment` (optional): A string to attach to the query to help + interpret and trace the operation in the server logs and in profile + data. Pass this as an alternative to calling + :meth:`~pymongo.cursor.Cursor.comment` on the cursor. + - `modifiers` (optional): **DEPRECATED** - A dict specifying + additional MongoDB query modifiers. Use the keyword arguments listed + above instead. + + .. note:: There are a number of caveats to using + :attr:`~pymongo.cursor.CursorType.EXHAUST` as cursor_type: + + - The `limit` option can not be used with an exhaust cursor. + + - Exhaust cursors are not supported by mongos and can not be + used with a sharded cluster. + + - A :class:`~pymongo.cursor.Cursor` instance created with the + :attr:`~pymongo.cursor.CursorType.EXHAUST` cursor_type requires an + exclusive :class:`~socket.socket` connection to MongoDB. If the + :class:`~pymongo.cursor.Cursor` is discarded without being + completely iterated the underlying :class:`~socket.socket` + connection will be closed and discarded without being returned to + the connection pool. + + .. versionchanged:: 3.7 + Deprecated the `snapshot` option, which is deprecated in MongoDB + 3.6 and removed in MongoDB 4.0. + Deprecated the `max_scan` option. Support for this option is + deprecated in MongoDB 4.0. Use `max_time_ms` instead to limit server + side execution time. + + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.5 + Added the options `return_key`, `show_record_id`, `snapshot`, + `hint`, `max_time_ms`, `max_scan`, `min`, `max`, and `comment`. + Deprecated the option `modifiers`. + + .. versionchanged:: 3.4 + Support the `collation` option. + + .. versionchanged:: 3.0 + Changed the parameter names `spec`, `fields`, `timeout`, and + `partial` to `filter`, `projection`, `no_cursor_timeout`, and + `allow_partial_results` respectively. + Added the `cursor_type`, `oplog_replay`, and `modifiers` options. + Removed the `network_timeout`, `read_preference`, `tag_sets`, + `secondary_acceptable_latency_ms`, `max_scan`, `snapshot`, + `tailable`, `await_data`, `exhaust`, `as_class`, and slave_okay + parameters. Removed `compile_re` option: PyMongo now always + represents BSON regular expressions as :class:`~bson.regex.Regex` + objects. Use :meth:`~bson.regex.Regex.try_compile` to attempt to + convert from a BSON regular expression to a Python regular + expression object. Soft deprecated the `manipulate` option. + + .. versionchanged:: 2.7 + Added `compile_re` option. If set to False, PyMongo represented BSON + regular expressions as :class:`~bson.regex.Regex` objects instead of + attempting to compile BSON regular expressions as Python native + regular expressions, thus preventing errors for some incompatible + patterns, see `PYTHON-500`_. + + .. versionadded:: 2.3 + The `tag_sets` and `secondary_acceptable_latency_ms` parameters. + + .. _PYTHON-500: https://jira.mongodb.org/browse/PYTHON-500 + + .. mongodoc:: find + + """ + return Cursor(self, *args, **kwargs) + + def find_raw_batches(self, *args, **kwargs): + """Query the database and retrieve batches of raw BSON. + + Similar to the :meth:`find` method but returns a + :class:`~pymongo.cursor.RawBatchCursor`. + + This example demonstrates how to work with raw batches, but in practice + raw batches should be passed to an external library that can decode + BSON into another data type, rather than used with PyMongo's + :mod:`bson` module. + + >>> import bson + >>> cursor = db.test.find_raw_batches() + >>> for batch in cursor: + ... print(bson.decode_all(batch)) + + .. note:: find_raw_batches does not support sessions. + + .. versionadded:: 3.6 + """ + # OP_MSG with document stream returns is required to support + # sessions. + if "session" in kwargs: + raise ConfigurationError( + "find_raw_batches does not support sessions") + return RawBatchCursor(self, *args, **kwargs) + + def parallel_scan(self, num_cursors, session=None, **kwargs): + """**DEPRECATED**: Scan this entire collection in parallel. + + Returns a list of up to ``num_cursors`` cursors that can be iterated + concurrently. As long as the collection is not modified during + scanning, each document appears once in one of the cursors result + sets. + + For example, to process each document in a collection using some + thread-safe ``process_document()`` function: + + >>> def process_cursor(cursor): + ... for document in cursor: + ... # Some thread-safe processing function: + ... process_document(document) + >>> + >>> # Get up to 4 cursors. + ... + >>> cursors = collection.parallel_scan(4) + >>> threads = [ + ... threading.Thread(target=process_cursor, args=(cursor,)) + ... for cursor in cursors] + >>> + >>> for thread in threads: + ... thread.start() + >>> + >>> for thread in threads: + ... thread.join() + >>> + >>> # All documents have now been processed. + + The :meth:`parallel_scan` method obeys the :attr:`read_preference` of + this :class:`Collection`. + + :Parameters: + - `num_cursors`: the number of cursors to return + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs`: additional options for the parallelCollectionScan + command can be passed as keyword arguments. + + .. note:: Requires server version **>= 2.5.5**. + + .. versionchanged:: 3.7 + Deprecated. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.4 + Added back support for arbitrary keyword arguments. MongoDB 3.4 + adds support for maxTimeMS as an option to the + parallelCollectionScan command. + + .. versionchanged:: 3.0 + Removed support for arbitrary keyword arguments, since + the parallelCollectionScan command has no optional arguments. + """ + warnings.warn("parallel_scan is deprecated. MongoDB 4.2 will remove " + "the parallelCollectionScan command.", + DeprecationWarning, stacklevel=2) + cmd = SON([('parallelCollectionScan', self.__name), + ('numCursors', num_cursors)]) + cmd.update(kwargs) + + with self._socket_for_reads(session) as (sock_info, slave_ok): + # We call sock_info.command here directly, instead of + # calling self._command to avoid using an implicit session. + result = sock_info.command( + self.__database.name, + cmd, + slave_ok, + self._read_preference_for(session), + self.codec_options, + read_concern=self.read_concern, + parse_write_concern_error=True, + session=session, + client=self.__database.client) + + cursors = [] + for cursor in result['cursors']: + cursors.append(CommandCursor( + self, cursor['cursor'], sock_info.address, + session=session, explicit_session=session is not None)) + + return cursors + + def _count(self, cmd, collation=None, session=None): + """Internal count helper.""" + with self._socket_for_reads(session) as (sock_info, slave_ok): + res = self._command( + sock_info, + cmd, + slave_ok, + allowable_errors=["ns missing"], + codec_options=self.__write_response_codec_options, + read_concern=self.read_concern, + collation=collation, + session=session) + if res.get("errmsg", "") == "ns missing": + return 0 + return int(res["n"]) + + def _aggregate_one_result( + self, sock_info, slave_ok, cmd, collation=None, session=None): + """Internal helper to run an aggregate that returns a single result.""" + result = self._command( + sock_info, + cmd, + slave_ok, + codec_options=self.__write_response_codec_options, + read_concern=self.read_concern, + collation=collation, + session=session) + batch = result['cursor']['firstBatch'] + return batch[0] if batch else None + + def estimated_document_count(self, **kwargs): + """Get an estimate of the number of documents in this collection using + collection metadata. + + The :meth:`estimated_document_count` method is **not** supported in a + transaction. + + All optional parameters should be passed as keyword arguments + to this method. Valid options include: + + - `maxTimeMS` (int): The maximum amount of time to allow this + operation to run, in milliseconds. + + :Parameters: + - `**kwargs` (optional): See list of options above. + + .. versionadded:: 3.7 + """ + if 'session' in kwargs: + raise ConfigurationError( + 'estimated_document_count does not support sessions') + cmd = SON([('count', self.__name)]) + cmd.update(kwargs) + return self._count(cmd) + + def count_documents(self, filter, session=None, **kwargs): + """Count the number of documents in this collection. + + The :meth:`count_documents` method is supported in a transaction. + + All optional parameters should be passed as keyword arguments + to this method. Valid options include: + + - `skip` (int): The number of matching documents to skip before + returning results. + - `limit` (int): The maximum number of documents to count. Must be + a positive integer. If not provided, no limit is imposed. + - `maxTimeMS` (int): The maximum amount of time to allow this + operation to run, in milliseconds. + - `collation` (optional): An instance of + :class:`~pymongo.collation.Collation`. This option is only supported + on MongoDB 3.4 and above. + - `hint` (string or list of tuples): The index to use. Specify either + the index name as a string or the index specification as a list of + tuples (e.g. [('a', pymongo.ASCENDING), ('b', pymongo.ASCENDING)]). + This option is only supported on MongoDB 3.6 and above. + + The :meth:`count_documents` method obeys the :attr:`read_preference` of + this :class:`Collection`. + + .. note:: When migrating from :meth:`count` to :meth:`count_documents` + the following query operators must be replaced: + + +-------------+-------------------------------------+ + | Operator | Replacement | + +=============+=====================================+ + | $where | `$expr`_ | + +-------------+-------------------------------------+ + | $near | `$geoWithin`_ with `$center`_ | + +-------------+-------------------------------------+ + | $nearSphere | `$geoWithin`_ with `$centerSphere`_ | + +-------------+-------------------------------------+ + + $expr requires MongoDB 3.6+ + + :Parameters: + - `filter` (required): A query document that selects which documents + to count in the collection. Can be an empty document to count all + documents. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs` (optional): See list of options above. + + .. versionadded:: 3.7 + + .. _$expr: https://docs.mongodb.com/manual/reference/operator/query/expr/ + .. _$geoWithin: https://docs.mongodb.com/manual/reference/operator/query/geoWithin/ + .. _$center: https://docs.mongodb.com/manual/reference/operator/query/center/#op._S_center + .. _$centerSphere: https://docs.mongodb.com/manual/reference/operator/query/centerSphere/#op._S_centerSphere + """ + pipeline = [{'$match': filter}] + if 'skip' in kwargs: + pipeline.append({'$skip': kwargs.pop('skip')}) + if 'limit' in kwargs: + pipeline.append({'$limit': kwargs.pop('limit')}) + pipeline.append({'$group': {'_id': None, 'n': {'$sum': 1}}}) + cmd = SON([('aggregate', self.__name), + ('pipeline', pipeline), + ('cursor', {})]) + if "hint" in kwargs and not isinstance(kwargs["hint"], string_type): + kwargs["hint"] = helpers._index_document(kwargs["hint"]) + collation = validate_collation_or_none(kwargs.pop('collation', None)) + cmd.update(kwargs) + with self._socket_for_reads(session) as (sock_info, slave_ok): + result = self._aggregate_one_result( + sock_info, slave_ok, cmd, collation, session) + if not result: + return 0 + return result['n'] + + def count(self, filter=None, session=None, **kwargs): + """**DEPRECATED** - Get the number of documents in this collection. + + The :meth:`count` method is deprecated and **not** supported in a + transaction. Please use :meth:`count_documents` or + :meth:`estimated_document_count` instead. + + All optional count parameters should be passed as keyword arguments + to this method. Valid options include: + + - `skip` (int): The number of matching documents to skip before + returning results. + - `limit` (int): The maximum number of documents to count. A limit + of 0 (the default) is equivalent to setting no limit. + - `maxTimeMS` (int): The maximum amount of time to allow the count + command to run, in milliseconds. + - `collation` (optional): An instance of + :class:`~pymongo.collation.Collation`. This option is only supported + on MongoDB 3.4 and above. + - `hint` (string or list of tuples): The index to use. Specify either + the index name as a string or the index specification as a list of + tuples (e.g. [('a', pymongo.ASCENDING), ('b', pymongo.ASCENDING)]). + + The :meth:`count` method obeys the :attr:`read_preference` of + this :class:`Collection`. + + .. note:: When migrating from :meth:`count` to :meth:`count_documents` + the following query operators must be replaced: + + +-------------+-------------------------------------+ + | Operator | Replacement | + +=============+=====================================+ + | $where | `$expr`_ | + +-------------+-------------------------------------+ + | $near | `$geoWithin`_ with `$center`_ | + +-------------+-------------------------------------+ + | $nearSphere | `$geoWithin`_ with `$centerSphere`_ | + +-------------+-------------------------------------+ + + $expr requires MongoDB 3.6+ + + :Parameters: + - `filter` (optional): A query document that selects which documents + to count in the collection. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs` (optional): See list of options above. + + .. versionchanged:: 3.7 + Deprecated. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.4 + Support the `collation` option. + + .. _$expr: https://docs.mongodb.com/manual/reference/operator/query/expr/ + .. _$geoWithin: https://docs.mongodb.com/manual/reference/operator/query/geoWithin/ + .. _$center: https://docs.mongodb.com/manual/reference/operator/query/center/#op._S_center + .. _$centerSphere: https://docs.mongodb.com/manual/reference/operator/query/centerSphere/#op._S_centerSphere + """ + warnings.warn("count is deprecated. Use estimated_document_count or " + "count_documents instead. Please note that $where must " + "be replaced by $expr, $near must be replaced by " + "$geoWithin with $center, and $nearSphere must be " + "replaced by $geoWithin with $centerSphere", + DeprecationWarning, stacklevel=2) + cmd = SON([("count", self.__name)]) + if filter is not None: + if "query" in kwargs: + raise ConfigurationError("can't pass both filter and query") + kwargs["query"] = filter + if "hint" in kwargs and not isinstance(kwargs["hint"], string_type): + kwargs["hint"] = helpers._index_document(kwargs["hint"]) + collation = validate_collation_or_none(kwargs.pop('collation', None)) + cmd.update(kwargs) + return self._count(cmd, collation, session) + + def create_indexes(self, indexes, session=None, **kwargs): + """Create one or more indexes on this collection. + + >>> from pymongo import IndexModel, ASCENDING, DESCENDING + >>> index1 = IndexModel([("hello", DESCENDING), + ... ("world", ASCENDING)], name="hello_world") + >>> index2 = IndexModel([("goodbye", DESCENDING)]) + >>> db.test.create_indexes([index1, index2]) + ["hello_world", "goodbye_-1"] + + :Parameters: + - `indexes`: A list of :class:`~pymongo.operations.IndexModel` + instances. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs` (optional): optional arguments to the createIndexes + command (like maxTimeMS) can be passed as keyword arguments. + + .. note:: `create_indexes` uses the `createIndexes`_ command + introduced in MongoDB **2.6** and cannot be used with earlier + versions. + + .. note:: The :attr:`~pymongo.collection.Collection.write_concern` of + this collection is automatically applied to this operation when using + MongoDB >= 3.4. + + .. versionchanged:: 3.6 + Added ``session`` parameter. Added support for arbitrary keyword + arguments. + + .. versionchanged:: 3.4 + Apply this collection's write concern automatically to this operation + when connected to MongoDB >= 3.4. + .. versionadded:: 3.0 + + .. _createIndexes: https://docs.mongodb.com/manual/reference/command/createIndexes/ + """ + common.validate_list('indexes', indexes) + names = [] + with self._socket_for_writes() as sock_info: + supports_collations = sock_info.max_wire_version >= 5 + def gen_indexes(): + for index in indexes: + if not isinstance(index, IndexModel): + raise TypeError( + "%r is not an instance of " + "pymongo.operations.IndexModel" % (index,)) + document = index.document + if "collation" in document and not supports_collations: + raise ConfigurationError( + "Must be connected to MongoDB " + "3.4+ to use collations.") + names.append(document["name"]) + yield document + cmd = SON([('createIndexes', self.name), + ('indexes', list(gen_indexes()))]) + cmd.update(kwargs) + self._command( + sock_info, cmd, read_preference=ReadPreference.PRIMARY, + codec_options=_UNICODE_REPLACE_CODEC_OPTIONS, + write_concern=self._write_concern_for(session), + session=session) + return names + + def __create_index(self, keys, index_options, session, **kwargs): + """Internal create index helper. + + :Parameters: + - `keys`: a list of tuples [(key, type), (key, type), ...] + - `index_options`: a dict of index options. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + """ + index_doc = helpers._index_document(keys) + index = {"key": index_doc} + collation = validate_collation_or_none( + index_options.pop('collation', None)) + index.update(index_options) + + with self._socket_for_writes() as sock_info: + if collation is not None: + if sock_info.max_wire_version < 5: + raise ConfigurationError( + 'Must be connected to MongoDB 3.4+ to use collations.') + else: + index['collation'] = collation + cmd = SON([('createIndexes', self.name), ('indexes', [index])]) + cmd.update(kwargs) + self._command( + sock_info, cmd, read_preference=ReadPreference.PRIMARY, + codec_options=_UNICODE_REPLACE_CODEC_OPTIONS, + write_concern=self._write_concern_for(session), + session=session) + + def create_index(self, keys, session=None, **kwargs): + """Creates an index on this collection. + + Takes either a single key or a list of (key, direction) pairs. + The key(s) must be an instance of :class:`basestring` + (:class:`str` in python 3), and the direction(s) must be one of + (:data:`~pymongo.ASCENDING`, :data:`~pymongo.DESCENDING`, + :data:`~pymongo.GEO2D`, :data:`~pymongo.GEOHAYSTACK`, + :data:`~pymongo.GEOSPHERE`, :data:`~pymongo.HASHED`, + :data:`~pymongo.TEXT`). + + To create a single key ascending index on the key ``'mike'`` we just + use a string argument:: + + >>> my_collection.create_index("mike") + + For a compound index on ``'mike'`` descending and ``'eliot'`` + ascending we need to use a list of tuples:: + + >>> my_collection.create_index([("mike", pymongo.DESCENDING), + ... ("eliot", pymongo.ASCENDING)]) + + All optional index creation parameters should be passed as + keyword arguments to this method. For example:: + + >>> my_collection.create_index([("mike", pymongo.DESCENDING)], + ... background=True) + + Valid options include, but are not limited to: + + - `name`: custom name to use for this index - if none is + given, a name will be generated. + - `unique`: if ``True`` creates a uniqueness constraint on the index. + - `background`: if ``True`` this index should be created in the + background. + - `sparse`: if ``True``, omit from the index any documents that lack + the indexed field. + - `bucketSize`: for use with geoHaystack indexes. + Number of documents to group together within a certain proximity + to a given longitude and latitude. + - `min`: minimum value for keys in a :data:`~pymongo.GEO2D` + index. + - `max`: maximum value for keys in a :data:`~pymongo.GEO2D` + index. + - `expireAfterSeconds`: <int> Used to create an expiring (TTL) + collection. MongoDB will automatically delete documents from + this collection after <int> seconds. The indexed field must + be a UTC datetime or the data will not expire. + - `partialFilterExpression`: A document that specifies a filter for + a partial index. + - `collation` (optional): An instance of + :class:`~pymongo.collation.Collation`. This option is only supported + on MongoDB 3.4 and above. + + See the MongoDB documentation for a full list of supported options by + server version. + + .. warning:: `dropDups` is not supported by MongoDB 3.0 or newer. The + option is silently ignored by the server and unique index builds + using the option will fail if a duplicate value is detected. + + .. note:: `partialFilterExpression` requires server version **>= 3.2** + + .. note:: The :attr:`~pymongo.collection.Collection.write_concern` of + this collection is automatically applied to this operation when using + MongoDB >= 3.4. + + :Parameters: + - `keys`: a single key or a list of (key, direction) + pairs specifying the index to create + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs` (optional): any additional index creation + options (see the above list) should be passed as keyword + arguments + + .. versionchanged:: 3.6 + Added ``session`` parameter. Added support for passing maxTimeMS + in kwargs. + .. versionchanged:: 3.4 + Apply this collection's write concern automatically to this operation + when connected to MongoDB >= 3.4. Support the `collation` option. + .. versionchanged:: 3.2 + Added partialFilterExpression to support partial indexes. + .. versionchanged:: 3.0 + Renamed `key_or_list` to `keys`. Removed the `cache_for` option. + :meth:`create_index` no longer caches index names. Removed support + for the drop_dups and bucket_size aliases. + + .. mongodoc:: indexes + """ + keys = helpers._index_list(keys) + name = kwargs.setdefault("name", helpers._gen_index_name(keys)) + cmd_options = {} + if "maxTimeMS" in kwargs: + cmd_options["maxTimeMS"] = kwargs.pop("maxTimeMS") + self.__create_index(keys, kwargs, session, **cmd_options) + return name + + def ensure_index(self, key_or_list, cache_for=300, **kwargs): + """**DEPRECATED** - Ensures that an index exists on this collection. + + .. versionchanged:: 3.0 + **DEPRECATED** + """ + warnings.warn("ensure_index is deprecated. Use create_index instead.", + DeprecationWarning, stacklevel=2) + # The types supported by datetime.timedelta. + if not (isinstance(cache_for, integer_types) or + isinstance(cache_for, float)): + raise TypeError("cache_for must be an integer or float.") + + if "drop_dups" in kwargs: + kwargs["dropDups"] = kwargs.pop("drop_dups") + + if "bucket_size" in kwargs: + kwargs["bucketSize"] = kwargs.pop("bucket_size") + + keys = helpers._index_list(key_or_list) + name = kwargs.setdefault("name", helpers._gen_index_name(keys)) + + # Note that there is a race condition here. One thread could + # check if the index is cached and be preempted before creating + # and caching the index. This means multiple threads attempting + # to create the same index concurrently could send the index + # to the server two or more times. This has no practical impact + # other than wasted round trips. + if not self.__database.client._cached(self.__database.name, + self.__name, name): + self.__create_index(keys, kwargs, session=None) + self.__database.client._cache_index(self.__database.name, + self.__name, name, cache_for) + return name + return None + + def drop_indexes(self, session=None, **kwargs): + """Drops all indexes on this collection. + + Can be used on non-existant collections or collections with no indexes. + Raises OperationFailure on an error. + + :Parameters: + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs` (optional): optional arguments to the createIndexes + command (like maxTimeMS) can be passed as keyword arguments. + + .. note:: The :attr:`~pymongo.collection.Collection.write_concern` of + this collection is automatically applied to this operation when using + MongoDB >= 3.4. + + .. versionchanged:: 3.6 + Added ``session`` parameter. Added support for arbitrary keyword + arguments. + + .. versionchanged:: 3.4 + Apply this collection's write concern automatically to this operation + when connected to MongoDB >= 3.4. + + """ + self.__database.client._purge_index(self.__database.name, self.__name) + self.drop_index("*", session=session, **kwargs) + + def drop_index(self, index_or_name, session=None, **kwargs): + """Drops the specified index on this collection. + + Can be used on non-existant collections or collections with no + indexes. Raises OperationFailure on an error (e.g. trying to + drop an index that does not exist). `index_or_name` + can be either an index name (as returned by `create_index`), + or an index specifier (as passed to `create_index`). An index + specifier should be a list of (key, direction) pairs. Raises + TypeError if index is not an instance of (str, unicode, list). + + .. warning:: + + if a custom name was used on index creation (by + passing the `name` parameter to :meth:`create_index` or + :meth:`ensure_index`) the index **must** be dropped by name. + + :Parameters: + - `index_or_name`: index (or name of index) to drop + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs` (optional): optional arguments to the createIndexes + command (like maxTimeMS) can be passed as keyword arguments. + + .. note:: The :attr:`~pymongo.collection.Collection.write_concern` of + this collection is automatically applied to this operation when using + MongoDB >= 3.4. + + .. versionchanged:: 3.6 + Added ``session`` parameter. Added support for arbitrary keyword + arguments. + + .. versionchanged:: 3.4 + Apply this collection's write concern automatically to this operation + when connected to MongoDB >= 3.4. + + """ + name = index_or_name + if isinstance(index_or_name, list): + name = helpers._gen_index_name(index_or_name) + + if not isinstance(name, string_type): + raise TypeError("index_or_name must be an index name or list") + + self.__database.client._purge_index( + self.__database.name, self.__name, name) + cmd = SON([("dropIndexes", self.__name), ("index", name)]) + cmd.update(kwargs) + with self._socket_for_writes() as sock_info: + self._command(sock_info, + cmd, + read_preference=ReadPreference.PRIMARY, + allowable_errors=["ns not found"], + write_concern=self._write_concern_for(session), + session=session) + + def reindex(self, session=None, **kwargs): + """Rebuilds all indexes on this collection. + + :Parameters: + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs` (optional): optional arguments to the reIndex + command (like maxTimeMS) can be passed as keyword arguments. + + .. warning:: reindex blocks all other operations (indexes + are built in the foreground) and will be slow for large + collections. + + .. versionchanged:: 3.6 + Added ``session`` parameter. Added support for arbitrary keyword + arguments. + + .. versionchanged:: 3.4 + Apply this collection's write concern automatically to this operation + when connected to MongoDB >= 3.4. + + .. versionchanged:: 3.5 + We no longer apply this collection's write concern to this operation. + MongoDB 3.4 silently ignored the write concern. MongoDB 3.6+ returns + an error if we include the write concern. + """ + cmd = SON([("reIndex", self.__name)]) + cmd.update(kwargs) + with self._socket_for_writes() as sock_info: + return self._command( + sock_info, cmd, read_preference=ReadPreference.PRIMARY, + session=session) + + def list_indexes(self, session=None): + """Get a cursor over the index documents for this collection. + + >>> for index in db.test.list_indexes(): + ... print(index) + ... + SON([(u'v', 1), (u'key', SON([(u'_id', 1)])), + (u'name', u'_id_'), (u'ns', u'test.test')]) + + :Parameters: + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + :Returns: + An instance of :class:`~pymongo.command_cursor.CommandCursor`. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionadded:: 3.0 + """ + codec_options = CodecOptions(SON) + coll = self.with_options(codec_options=codec_options, + read_preference=ReadPreference.PRIMARY) + sock_ctx, read_pref = self._socket_for_primary_reads(session) + with sock_ctx as (sock_info, slave_ok): + cmd = SON([("listIndexes", self.__name), ("cursor", {})]) + if sock_info.max_wire_version > 2: + with self.__database.client._tmp_session(session, False) as s: + try: + cursor = self._command(sock_info, cmd, slave_ok, + read_pref, + codec_options, + session=s)["cursor"] + except OperationFailure as exc: + # Ignore NamespaceNotFound errors to match the behavior + # of reading from *.system.indexes. + if exc.code != 26: + raise + cursor = {'id': 0, 'firstBatch': []} + return CommandCursor(coll, cursor, sock_info.address, + session=s, + explicit_session=session is not None) + else: + res = message._first_batch( + sock_info, self.__database.name, "system.indexes", + {"ns": self.__full_name}, 0, slave_ok, codec_options, + read_pref, cmd, + self.database.client._event_listeners) + cursor = res["cursor"] + # Note that a collection can only have 64 indexes, so there + # will never be a getMore call. + return CommandCursor(coll, cursor, sock_info.address) + + def index_information(self, session=None): + """Get information on this collection's indexes. + + Returns a dictionary where the keys are index names (as + returned by create_index()) and the values are dictionaries + containing information about each index. The dictionary is + guaranteed to contain at least a single key, ``"key"`` which + is a list of (key, direction) pairs specifying the index (as + passed to create_index()). It will also contain any other + metadata about the indexes, except for the ``"ns"`` and + ``"name"`` keys, which are cleaned. Example output might look + like this: + + >>> db.test.create_index("x", unique=True) + u'x_1' + >>> db.test.index_information() + {u'_id_': {u'key': [(u'_id', 1)]}, + u'x_1': {u'unique': True, u'key': [(u'x', 1)]}} + + :Parameters: + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + cursor = self.list_indexes(session=session) + info = {} + for index in cursor: + index["key"] = index["key"].items() + index = dict(index) + info[index.pop("name")] = index + return info + + def options(self, session=None): + """Get the options set on this collection. + + Returns a dictionary of options and their values - see + :meth:`~pymongo.database.Database.create_collection` for more + information on the possible options. Returns an empty + dictionary if the collection has not been created yet. + + :Parameters: + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + dbo = self.__database.client.get_database( + self.__database.name, + self.codec_options, + self.read_preference, + self.write_concern, + self.read_concern) + cursor = dbo.list_collections( + session=session, filter={"name": self.__name}) + + result = None + for doc in cursor: + result = doc + break + + if not result: + return {} + + options = result.get("options", {}) + if "create" in options: + del options["create"] + + return options + + def _aggregate(self, pipeline, cursor_class, first_batch_size, session, + explicit_session, **kwargs): + common.validate_list('pipeline', pipeline) + + if "explain" in kwargs: + raise ConfigurationError("The explain option is not supported. " + "Use Database.command instead.") + collation = validate_collation_or_none(kwargs.pop('collation', None)) + max_await_time_ms = kwargs.pop('maxAwaitTimeMS', None) + + cmd = SON([("aggregate", self.__name), + ("pipeline", pipeline)]) + + # Remove things that are not command options. + use_cursor = True + if "useCursor" in kwargs: + warnings.warn( + "The useCursor option is deprecated " + "and will be removed in PyMongo 4.0", + DeprecationWarning, stacklevel=2) + use_cursor = common.validate_boolean( + "useCursor", kwargs.pop("useCursor")) + batch_size = common.validate_non_negative_integer_or_none( + "batchSize", kwargs.pop("batchSize", None)) + # If the server does not support the "cursor" option we + # ignore useCursor and batchSize. + with self._socket_for_reads(session) as (sock_info, slave_ok): + dollar_out = pipeline and '$out' in pipeline[-1] + if use_cursor: + if "cursor" not in kwargs: + kwargs["cursor"] = {} + # Ignore batchSize when the $out pipeline stage is used. + # batchSize is meaningless in that case since the server + # doesn't return results. This also avoids SERVER-23923. + if first_batch_size is not None and not dollar_out: + kwargs["cursor"]["batchSize"] = first_batch_size + + cmd.update(kwargs) + # Apply this Collection's read concern if $out is not in the + # pipeline. + if (sock_info.max_wire_version >= 4 + and 'readConcern' not in cmd + and not dollar_out): + read_concern = self.read_concern + else: + read_concern = None + if 'writeConcern' not in cmd and dollar_out: + write_concern = self._write_concern_for(session) + else: + write_concern = None + + # Avoid auto-injecting a session: aggregate() passes a session, + # aggregate_raw_batches() passes none. + result = sock_info.command( + self.__database.name, + cmd, + slave_ok, + self._read_preference_for(session), + self.codec_options, + parse_write_concern_error=True, + read_concern=read_concern, + write_concern=write_concern, + collation=collation, + session=session, + client=self.__database.client, + user_fields={'cursor': {'firstBatch': 1}}) + + if "cursor" in result: + cursor = result["cursor"] + else: + # Pre-MongoDB 2.6 or unacknowledged write. Fake a cursor. + cursor = { + "id": 0, + "firstBatch": result.get("result", []), + "ns": self.full_name, + } + + return cursor_class( + self, cursor, sock_info.address, + batch_size=batch_size or 0, + max_await_time_ms=max_await_time_ms, + session=session, explicit_session=explicit_session) + + def aggregate(self, pipeline, session=None, **kwargs): + """Perform an aggregation using the aggregation framework on this + collection. + + All optional `aggregate command`_ parameters should be passed as + keyword arguments to this method. Valid options include, but are not + limited to: + + - `allowDiskUse` (bool): Enables writing to temporary files. When set + to True, aggregation stages can write data to the _tmp subdirectory + of the --dbpath directory. The default is False. + - `maxTimeMS` (int): The maximum amount of time to allow the operation + to run in milliseconds. + - `batchSize` (int): The maximum number of documents to return per + batch. Ignored if the connected mongod or mongos does not support + returning aggregate results using a cursor, or `useCursor` is + ``False``. + - `collation` (optional): An instance of + :class:`~pymongo.collation.Collation`. This option is only supported + on MongoDB 3.4 and above. + - `useCursor` (bool): Deprecated. Will be removed in PyMongo 4.0. + + The :meth:`aggregate` method obeys the :attr:`read_preference` of this + :class:`Collection`. Please note that using the ``$out`` pipeline stage + requires a read preference of + :attr:`~pymongo.read_preferences.ReadPreference.PRIMARY` (the default). + The server will raise an error if the ``$out`` pipeline stage is used + with any other read preference. + + .. note:: This method does not support the 'explain' option. Please + use :meth:`~pymongo.database.Database.command` instead. An + example is included in the :ref:`aggregate-examples` documentation. + + .. note:: The :attr:`~pymongo.collection.Collection.write_concern` of + this collection is automatically applied to this operation when using + MongoDB >= 3.4. + + :Parameters: + - `pipeline`: a list of aggregation pipeline stages + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs` (optional): See list of options above. + + :Returns: + A :class:`~pymongo.command_cursor.CommandCursor` over the result + set. + + .. versionchanged:: 3.6 + Added the `session` parameter. Added the `maxAwaitTimeMS` option. + Deprecated the `useCursor` option. + .. versionchanged:: 3.4 + Apply this collection's write concern automatically to this operation + when connected to MongoDB >= 3.4. Support the `collation` option. + .. versionchanged:: 3.0 + The :meth:`aggregate` method always returns a CommandCursor. The + pipeline argument must be a list. + .. versionchanged:: 2.7 + When the cursor option is used, return + :class:`~pymongo.command_cursor.CommandCursor` instead of + :class:`~pymongo.cursor.Cursor`. + .. versionchanged:: 2.6 + Added cursor support. + .. versionadded:: 2.3 + + .. seealso:: :doc:`/examples/aggregation` + + .. _aggregate command: + https://docs.mongodb.com/manual/reference/command/aggregate + """ + with self.__database.client._tmp_session(session, close=False) as s: + return self._aggregate(pipeline, + CommandCursor, + kwargs.get('batchSize'), + session=s, + explicit_session=session is not None, + **kwargs) + + def aggregate_raw_batches(self, pipeline, **kwargs): + """Perform an aggregation and retrieve batches of raw BSON. + + Similar to the :meth:`aggregate` method but returns a + :class:`~pymongo.cursor.RawBatchCursor`. + + This example demonstrates how to work with raw batches, but in practice + raw batches should be passed to an external library that can decode + BSON into another data type, rather than used with PyMongo's + :mod:`bson` module. + + >>> import bson + >>> cursor = db.test.aggregate_raw_batches([ + ... {'$project': {'x': {'$multiply': [2, '$x']}}}]) + >>> for batch in cursor: + ... print(bson.decode_all(batch)) + + .. note:: aggregate_raw_batches does not support sessions. + + .. versionadded:: 3.6 + """ + # OP_MSG with document stream returns is required to support + # sessions. + if "session" in kwargs: + raise ConfigurationError( + "aggregate_raw_batches does not support sessions") + return self._aggregate(pipeline, RawBatchCommandCursor, 0, + None, False, **kwargs) + + def watch(self, pipeline=None, full_document='default', resume_after=None, + max_await_time_ms=None, batch_size=None, collation=None, + start_at_operation_time=None, session=None): + """Watch changes on this collection. + + Performs an aggregation with an implicit initial ``$changeStream`` + stage and returns a + :class:`~pymongo.change_stream.CollectionChangeStream` cursor which + iterates over changes on this collection. + + Introduced in MongoDB 3.6. + + .. code-block:: python + + with db.collection.watch() as stream: + for change in stream: + print(change) + + The :class:`~pymongo.change_stream.CollectionChangeStream` iterable + blocks until the next change document is returned or an error is + raised. If the + :meth:`~pymongo.change_stream.CollectionChangeStream.next` method + encounters a network error when retrieving a batch from the server, + it will automatically attempt to recreate the cursor such that no + change events are missed. Any error encountered during the resume + attempt indicates there may be an outage and will be raised. + + .. code-block:: python + + try: + with db.collection.watch( + [{'$match': {'operationType': 'insert'}}]) as stream: + for insert_change in stream: + print(insert_change) + except pymongo.errors.PyMongoError: + # The ChangeStream encountered an unrecoverable error or the + # resume attempt failed to recreate the cursor. + logging.error('...') + + For a precise description of the resume process see the + `change streams specification`_. + + .. note:: Using this helper method is preferred to directly calling + :meth:`~pymongo.collection.Collection.aggregate` with a + ``$changeStream`` stage, for the purpose of supporting + resumability. + + .. warning:: This Collection's :attr:`read_concern` must be + ``ReadConcern("majority")`` in order to use the ``$changeStream`` + stage. + + :Parameters: + - `pipeline` (optional): A list of aggregation pipeline stages to + append to an initial ``$changeStream`` stage. Not all + pipeline stages are valid after a ``$changeStream`` stage, see the + MongoDB documentation on change streams for the supported stages. + - `full_document` (optional): The fullDocument to pass as an option + to the ``$changeStream`` stage. Allowed values: 'default', + 'updateLookup'. Defaults to 'default'. + When set to 'updateLookup', the change notification for partial + updates will include both a delta describing the changes to the + document, as well as a copy of the entire document that was + changed from some time after the change occurred. + - `resume_after` (optional): The logical starting point for this + change stream. + - `max_await_time_ms` (optional): The maximum time in milliseconds + for the server to wait for changes before responding to a getMore + operation. + - `batch_size` (optional): The maximum number of documents to return + per batch. + - `collation` (optional): The :class:`~pymongo.collation.Collation` + to use for the aggregation. + - `start_at_operation_time` (optional): If provided, the resulting + change stream will only return changes that occurred at or after + the specified :class:`~bson.timestamp.Timestamp`. Requires + MongoDB >= 4.0. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + :Returns: + A :class:`~pymongo.change_stream.CollectionChangeStream` cursor. + + .. versionchanged:: 3.7 + Added the ``start_at_operation_time`` parameter. + + .. versionadded:: 3.6 + + .. mongodoc:: changeStreams + + .. _change streams specification: + https://github.com/mongodb/specifications/blob/master/source/change-streams/change-streams.rst + """ + return CollectionChangeStream( + self, pipeline, full_document, resume_after, max_await_time_ms, + batch_size, collation, start_at_operation_time, session + ) + + def group(self, key, condition, initial, reduce, finalize=None, **kwargs): + """Perform a query similar to an SQL *group by* operation. + + **DEPRECATED** - The group command was deprecated in MongoDB 3.4. The + :meth:`~group` method is deprecated and will be removed in PyMongo 4.0. + Use :meth:`~aggregate` with the `$group` stage or :meth:`~map_reduce` + instead. + + .. versionchanged:: 3.5 + Deprecated the group method. + .. versionchanged:: 3.4 + Added the `collation` option. + .. versionchanged:: 2.2 + Removed deprecated argument: command + """ + warnings.warn("The group method is deprecated and will be removed in " + "PyMongo 4.0. Use the aggregate method with the $group " + "stage or the map_reduce method instead.", + DeprecationWarning, stacklevel=2) + group = {} + if isinstance(key, string_type): + group["$keyf"] = Code(key) + elif key is not None: + group = {"key": helpers._fields_list_to_dict(key, "key")} + group["ns"] = self.__name + group["$reduce"] = Code(reduce) + group["cond"] = condition + group["initial"] = initial + if finalize is not None: + group["finalize"] = Code(finalize) + + cmd = SON([("group", group)]) + collation = validate_collation_or_none(kwargs.pop('collation', None)) + cmd.update(kwargs) + + with self._socket_for_reads(session=None) as (sock_info, slave_ok): + return self._command(sock_info, cmd, slave_ok, + collation=collation, + user_fields={'retval': 1})["retval"] + + def rename(self, new_name, session=None, **kwargs): + """Rename this collection. + + If operating in auth mode, client must be authorized as an + admin to perform this operation. Raises :class:`TypeError` if + `new_name` is not an instance of :class:`basestring` + (:class:`str` in python 3). Raises :class:`~pymongo.errors.InvalidName` + if `new_name` is not a valid collection name. + + :Parameters: + - `new_name`: new name for this collection + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs` (optional): additional arguments to the rename command + may be passed as keyword arguments to this helper method + (i.e. ``dropTarget=True``) + + .. note:: The :attr:`~pymongo.collection.Collection.write_concern` of + this collection is automatically applied to this operation when using + MongoDB >= 3.4. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.4 + Apply this collection's write concern automatically to this operation + when connected to MongoDB >= 3.4. + + """ + if not isinstance(new_name, string_type): + raise TypeError("new_name must be an " + "instance of %s" % (string_type.__name__,)) + + if not new_name or ".." in new_name: + raise InvalidName("collection names cannot be empty") + if new_name[0] == "." or new_name[-1] == ".": + raise InvalidName("collecion names must not start or end with '.'") + if "$" in new_name and not new_name.startswith("oplog.$main"): + raise InvalidName("collection names must not contain '$'") + + new_name = "%s.%s" % (self.__database.name, new_name) + cmd = SON([("renameCollection", self.__full_name), ("to", new_name)]) + cmd.update(kwargs) + write_concern = self._write_concern_for_cmd(cmd, session) + + with self._socket_for_writes() as sock_info: + with self.__database.client._tmp_session(session) as s: + return sock_info.command( + 'admin', cmd, + write_concern=write_concern, + parse_write_concern_error=True, + session=s, client=self.__database.client) + + def distinct(self, key, filter=None, session=None, **kwargs): + """Get a list of distinct values for `key` among all documents + in this collection. + + Raises :class:`TypeError` if `key` is not an instance of + :class:`basestring` (:class:`str` in python 3). + + All optional distinct parameters should be passed as keyword arguments + to this method. Valid options include: + + - `maxTimeMS` (int): The maximum amount of time to allow the count + command to run, in milliseconds. + - `collation` (optional): An instance of + :class:`~pymongo.collation.Collation`. This option is only supported + on MongoDB 3.4 and above. + + The :meth:`distinct` method obeys the :attr:`read_preference` of + this :class:`Collection`. + + :Parameters: + - `key`: name of the field for which we want to get the distinct + values + - `filter` (optional): A query document that specifies the documents + from which to retrieve the distinct values. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs` (optional): See list of options above. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.4 + Support the `collation` option. + + """ + if not isinstance(key, string_type): + raise TypeError("key must be an " + "instance of %s" % (string_type.__name__,)) + cmd = SON([("distinct", self.__name), + ("key", key)]) + if filter is not None: + if "query" in kwargs: + raise ConfigurationError("can't pass both filter and query") + kwargs["query"] = filter + collation = validate_collation_or_none(kwargs.pop('collation', None)) + cmd.update(kwargs) + with self._socket_for_reads(session) as (sock_info, slave_ok): + return self._command(sock_info, cmd, slave_ok, + read_concern=self.read_concern, + collation=collation, + session=session, + user_fields={"values": 1})["values"] + + def map_reduce(self, map, reduce, out, full_response=False, session=None, + **kwargs): + """Perform a map/reduce operation on this collection. + + If `full_response` is ``False`` (default) returns a + :class:`~pymongo.collection.Collection` instance containing + the results of the operation. Otherwise, returns the full + response from the server to the `map reduce command`_. + + :Parameters: + - `map`: map function (as a JavaScript string) + - `reduce`: reduce function (as a JavaScript string) + - `out`: output collection name or `out object` (dict). See + the `map reduce command`_ documentation for available options. + Note: `out` options are order sensitive. :class:`~bson.son.SON` + can be used to specify multiple options. + e.g. SON([('replace', <collection name>), ('db', <database name>)]) + - `full_response` (optional): if ``True``, return full response to + this command - otherwise just return the result collection + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs` (optional): additional arguments to the + `map reduce command`_ may be passed as keyword arguments to this + helper method, e.g.:: + + >>> db.test.map_reduce(map, reduce, "myresults", limit=2) + + .. note:: The :meth:`map_reduce` method does **not** obey the + :attr:`read_preference` of this :class:`Collection`. To run + mapReduce on a secondary use the :meth:`inline_map_reduce` method + instead. + + .. note:: The :attr:`~pymongo.collection.Collection.write_concern` of + this collection is automatically applied to this operation (if the + output is not inline) when using MongoDB >= 3.4. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.4 + Apply this collection's write concern automatically to this operation + when connected to MongoDB >= 3.4. + + .. seealso:: :doc:`/examples/aggregation` + + .. versionchanged:: 3.4 + Added the `collation` option. + .. versionchanged:: 2.2 + Removed deprecated arguments: merge_output and reduce_output + + .. _map reduce command: http://docs.mongodb.org/manual/reference/command/mapReduce/ + + .. mongodoc:: mapreduce + + """ + if not isinstance(out, (string_type, abc.Mapping)): + raise TypeError("'out' must be an instance of " + "%s or a mapping" % (string_type.__name__,)) + + cmd = SON([("mapreduce", self.__name), + ("map", map), + ("reduce", reduce), + ("out", out)]) + collation = validate_collation_or_none(kwargs.pop('collation', None)) + cmd.update(kwargs) + + inline = 'inline' in cmd['out'] + sock_ctx, read_pref = self._socket_for_primary_reads(session) + with sock_ctx as (sock_info, slave_ok): + if (sock_info.max_wire_version >= 4 and 'readConcern' not in cmd and + inline): + read_concern = self.read_concern + else: + read_concern = None + if 'writeConcern' not in cmd and not inline: + write_concern = self._write_concern_for(session) + else: + write_concern = None + if inline: + user_fields = {'results': 1} + else: + user_fields = None + + response = self._command( + sock_info, cmd, slave_ok, read_pref, + read_concern=read_concern, + write_concern=write_concern, + collation=collation, session=session, + user_fields=user_fields) + + if full_response or not response.get('result'): + return response + elif isinstance(response['result'], dict): + dbase = response['result']['db'] + coll = response['result']['collection'] + return self.__database.client[dbase][coll] + else: + return self.__database[response["result"]] + + def inline_map_reduce(self, map, reduce, full_response=False, session=None, + **kwargs): + """Perform an inline map/reduce operation on this collection. + + Perform the map/reduce operation on the server in RAM. A result + collection is not created. The result set is returned as a list + of documents. + + If `full_response` is ``False`` (default) returns the + result documents in a list. Otherwise, returns the full + response from the server to the `map reduce command`_. + + The :meth:`inline_map_reduce` method obeys the :attr:`read_preference` + of this :class:`Collection`. + + :Parameters: + - `map`: map function (as a JavaScript string) + - `reduce`: reduce function (as a JavaScript string) + - `full_response` (optional): if ``True``, return full response to + this command - otherwise just return the result collection + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs` (optional): additional arguments to the + `map reduce command`_ may be passed as keyword arguments to this + helper method, e.g.:: + + >>> db.test.inline_map_reduce(map, reduce, limit=2) + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.4 + Added the `collation` option. + + """ + cmd = SON([("mapreduce", self.__name), + ("map", map), + ("reduce", reduce), + ("out", {"inline": 1})]) + user_fields = {'results': 1} + collation = validate_collation_or_none(kwargs.pop('collation', None)) + cmd.update(kwargs) + with self._socket_for_reads(session) as (sock_info, slave_ok): + if sock_info.max_wire_version >= 4 and 'readConcern' not in cmd: + res = self._command(sock_info, cmd, slave_ok, + read_concern=self.read_concern, + collation=collation, session=session, + user_fields=user_fields) + else: + res = self._command(sock_info, cmd, slave_ok, + collation=collation, session=session, + user_fields=user_fields) + + if full_response: + return res + else: + return res.get("results") + + def _write_concern_for_cmd(self, cmd, session): + raw_wc = cmd.get('writeConcern') + if raw_wc is not None: + return WriteConcern(**raw_wc) + else: + return self._write_concern_for(session) + + def __find_and_modify(self, filter, projection, sort, upsert=None, + return_document=ReturnDocument.BEFORE, + array_filters=None, session=None, **kwargs): + """Internal findAndModify helper.""" + + common.validate_is_mapping("filter", filter) + if not isinstance(return_document, bool): + raise ValueError("return_document must be " + "ReturnDocument.BEFORE or ReturnDocument.AFTER") + collation = validate_collation_or_none(kwargs.pop('collation', None)) + cmd = SON([("findAndModify", self.__name), + ("query", filter), + ("new", return_document)]) + cmd.update(kwargs) + if projection is not None: + cmd["fields"] = helpers._fields_list_to_dict(projection, + "projection") + if sort is not None: + cmd["sort"] = helpers._index_document(sort) + if upsert is not None: + common.validate_boolean("upsert", upsert) + cmd["upsert"] = upsert + + write_concern = self._write_concern_for_cmd(cmd, session) + + def _find_and_modify(session, sock_info, retryable_write): + if array_filters is not None: + if sock_info.max_wire_version < 6: + raise ConfigurationError( + 'Must be connected to MongoDB 3.6+ to use ' + 'arrayFilters.') + if not write_concern.acknowledged: + raise ConfigurationError( + 'arrayFilters is unsupported for unacknowledged ' + 'writes.') + cmd["arrayFilters"] = array_filters + if (sock_info.max_wire_version >= 4 and + not write_concern.is_server_default): + cmd['writeConcern'] = write_concern.document + out = self._command(sock_info, cmd, + read_preference=ReadPreference.PRIMARY, + write_concern=write_concern, + allowable_errors=[_NO_OBJ_ERROR], + collation=collation, session=session, + retryable_write=retryable_write, + user_fields=_FIND_AND_MODIFY_DOC_FIELDS) + _check_write_command_response(out) + + return out.get("value") + + return self.__database.client._retryable_write( + write_concern.acknowledged, _find_and_modify, session) + + def find_one_and_delete(self, filter, + projection=None, sort=None, session=None, **kwargs): + """Finds a single document and deletes it, returning the document. + + >>> db.test.count_documents({'x': 1}) + 2 + >>> db.test.find_one_and_delete({'x': 1}) + {u'x': 1, u'_id': ObjectId('54f4e12bfba5220aa4d6dee8')} + >>> db.test.count_documents({'x': 1}) + 1 + + If multiple documents match *filter*, a *sort* can be applied. + + >>> for doc in db.test.find({'x': 1}): + ... print(doc) + ... + {u'x': 1, u'_id': 0} + {u'x': 1, u'_id': 1} + {u'x': 1, u'_id': 2} + >>> db.test.find_one_and_delete( + ... {'x': 1}, sort=[('_id', pymongo.DESCENDING)]) + {u'x': 1, u'_id': 2} + + The *projection* option can be used to limit the fields returned. + + >>> db.test.find_one_and_delete({'x': 1}, projection={'_id': False}) + {u'x': 1} + + :Parameters: + - `filter`: A query that matches the document to delete. + - `projection` (optional): a list of field names that should be + returned in the result document or a mapping specifying the fields + to include or exclude. If `projection` is a list "_id" will + always be returned. Use a mapping to exclude fields from + the result (e.g. projection={'_id': False}). + - `sort` (optional): a list of (key, direction) pairs + specifying the sort order for the query. If multiple documents + match the query, they are sorted and the first is deleted. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs` (optional): additional command arguments can be passed + as keyword arguments (for example maxTimeMS can be used with + recent server versions). + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.2 + Respects write concern. + + .. warning:: Starting in PyMongo 3.2, this command uses the + :class:`~pymongo.write_concern.WriteConcern` of this + :class:`~pymongo.collection.Collection` when connected to MongoDB >= + 3.2. Note that using an elevated write concern with this command may + be slower compared to using the default write concern. + + .. versionchanged:: 3.4 + Added the `collation` option. + .. versionadded:: 3.0 + + """ + kwargs['remove'] = True + return self.__find_and_modify(filter, projection, sort, + session=session, **kwargs) + + def find_one_and_replace(self, filter, replacement, + projection=None, sort=None, upsert=False, + return_document=ReturnDocument.BEFORE, + session=None, **kwargs): + """Finds a single document and replaces it, returning either the + original or the replaced document. + + The :meth:`find_one_and_replace` method differs from + :meth:`find_one_and_update` by replacing the document matched by + *filter*, rather than modifying the existing document. + + >>> for doc in db.test.find({}): + ... print(doc) + ... + {u'x': 1, u'_id': 0} + {u'x': 1, u'_id': 1} + {u'x': 1, u'_id': 2} + >>> db.test.find_one_and_replace({'x': 1}, {'y': 1}) + {u'x': 1, u'_id': 0} + >>> for doc in db.test.find({}): + ... print(doc) + ... + {u'y': 1, u'_id': 0} + {u'x': 1, u'_id': 1} + {u'x': 1, u'_id': 2} + + :Parameters: + - `filter`: A query that matches the document to replace. + - `replacement`: The replacement document. + - `projection` (optional): A list of field names that should be + returned in the result document or a mapping specifying the fields + to include or exclude. If `projection` is a list "_id" will + always be returned. Use a mapping to exclude fields from + the result (e.g. projection={'_id': False}). + - `sort` (optional): a list of (key, direction) pairs + specifying the sort order for the query. If multiple documents + match the query, they are sorted and the first is replaced. + - `upsert` (optional): When ``True``, inserts a new document if no + document matches the query. Defaults to ``False``. + - `return_document`: If + :attr:`ReturnDocument.BEFORE` (the default), + returns the original document before it was replaced, or ``None`` + if no document matches. If + :attr:`ReturnDocument.AFTER`, returns the replaced + or inserted document. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs` (optional): additional command arguments can be passed + as keyword arguments (for example maxTimeMS can be used with + recent server versions). + + .. versionchanged:: 3.6 + Added ``session`` parameter. + .. versionchanged:: 3.4 + Added the `collation` option. + .. versionchanged:: 3.2 + Respects write concern. + + .. warning:: Starting in PyMongo 3.2, this command uses the + :class:`~pymongo.write_concern.WriteConcern` of this + :class:`~pymongo.collection.Collection` when connected to MongoDB >= + 3.2. Note that using an elevated write concern with this command may + be slower compared to using the default write concern. + + .. versionadded:: 3.0 + """ + common.validate_ok_for_replace(replacement) + kwargs['update'] = replacement + return self.__find_and_modify(filter, projection, + sort, upsert, return_document, + session=session, **kwargs) + + def find_one_and_update(self, filter, update, + projection=None, sort=None, upsert=False, + return_document=ReturnDocument.BEFORE, + array_filters=None, session=None, **kwargs): + """Finds a single document and updates it, returning either the + original or the updated document. + + >>> db.test.find_one_and_update( + ... {'_id': 665}, {'$inc': {'count': 1}, '$set': {'done': True}}) + {u'_id': 665, u'done': False, u'count': 25}} + + Returns ``None`` if no document matches the filter. + + >>> db.test.find_one_and_update( + ... {'_exists': False}, {'$inc': {'count': 1}}) + + When the filter matches, by default :meth:`find_one_and_update` + returns the original version of the document before the update was + applied. To return the updated (or inserted in the case of + *upsert*) version of the document instead, use the *return_document* + option. + + >>> from pymongo import ReturnDocument + >>> db.example.find_one_and_update( + ... {'_id': 'userid'}, + ... {'$inc': {'seq': 1}}, + ... return_document=ReturnDocument.AFTER) + {u'_id': u'userid', u'seq': 1} + + You can limit the fields returned with the *projection* option. + + >>> db.example.find_one_and_update( + ... {'_id': 'userid'}, + ... {'$inc': {'seq': 1}}, + ... projection={'seq': True, '_id': False}, + ... return_document=ReturnDocument.AFTER) + {u'seq': 2} + + The *upsert* option can be used to create the document if it doesn't + already exist. + + >>> db.example.delete_many({}).deleted_count + 1 + >>> db.example.find_one_and_update( + ... {'_id': 'userid'}, + ... {'$inc': {'seq': 1}}, + ... projection={'seq': True, '_id': False}, + ... upsert=True, + ... return_document=ReturnDocument.AFTER) + {u'seq': 1} + + If multiple documents match *filter*, a *sort* can be applied. + + >>> for doc in db.test.find({'done': True}): + ... print(doc) + ... + {u'_id': 665, u'done': True, u'result': {u'count': 26}} + {u'_id': 701, u'done': True, u'result': {u'count': 17}} + >>> db.test.find_one_and_update( + ... {'done': True}, + ... {'$set': {'final': True}}, + ... sort=[('_id', pymongo.DESCENDING)]) + {u'_id': 701, u'done': True, u'result': {u'count': 17}} + + :Parameters: + - `filter`: A query that matches the document to update. + - `update`: The update operations to apply. + - `projection` (optional): A list of field names that should be + returned in the result document or a mapping specifying the fields + to include or exclude. If `projection` is a list "_id" will + always be returned. Use a dict to exclude fields from + the result (e.g. projection={'_id': False}). + - `sort` (optional): a list of (key, direction) pairs + specifying the sort order for the query. If multiple documents + match the query, they are sorted and the first is updated. + - `upsert` (optional): When ``True``, inserts a new document if no + document matches the query. Defaults to ``False``. + - `return_document`: If + :attr:`ReturnDocument.BEFORE` (the default), + returns the original document before it was updated. If + :attr:`ReturnDocument.AFTER`, returns the updated + or inserted document. + - `array_filters` (optional): A list of filters specifying which + array elements an update should apply. Requires MongoDB 3.6+. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs` (optional): additional command arguments can be passed + as keyword arguments (for example maxTimeMS can be used with + recent server versions). + + .. versionchanged:: 3.6 + Added the `array_filters` and `session` options. + .. versionchanged:: 3.4 + Added the `collation` option. + .. versionchanged:: 3.2 + Respects write concern. + + .. warning:: Starting in PyMongo 3.2, this command uses the + :class:`~pymongo.write_concern.WriteConcern` of this + :class:`~pymongo.collection.Collection` when connected to MongoDB >= + 3.2. Note that using an elevated write concern with this command may + be slower compared to using the default write concern. + + .. versionadded:: 3.0 + """ + common.validate_ok_for_update(update) + common.validate_list_or_none('array_filters', array_filters) + kwargs['update'] = update + return self.__find_and_modify(filter, projection, + sort, upsert, return_document, + array_filters, session=session, **kwargs) + + def save(self, to_save, manipulate=True, check_keys=True, **kwargs): + """Save a document in this collection. + + **DEPRECATED** - Use :meth:`insert_one` or :meth:`replace_one` instead. + + .. versionchanged:: 3.0 + Removed the `safe` parameter. Pass ``w=0`` for unacknowledged write + operations. + """ + warnings.warn("save is deprecated. Use insert_one or replace_one " + "instead", DeprecationWarning, stacklevel=2) + common.validate_is_document_type("to_save", to_save) + + write_concern = None + collation = validate_collation_or_none(kwargs.pop('collation', None)) + if kwargs: + write_concern = WriteConcern(**kwargs) + + if not (isinstance(to_save, RawBSONDocument) or "_id" in to_save): + return self._insert( + to_save, True, check_keys, manipulate, write_concern) + else: + self._update_retryable( + {"_id": to_save["_id"]}, to_save, True, + check_keys, False, manipulate, write_concern, + collation=collation) + return to_save.get("_id") + + def insert(self, doc_or_docs, manipulate=True, + check_keys=True, continue_on_error=False, **kwargs): + """Insert a document(s) into this collection. + + **DEPRECATED** - Use :meth:`insert_one` or :meth:`insert_many` instead. + + .. versionchanged:: 3.0 + Removed the `safe` parameter. Pass ``w=0`` for unacknowledged write + operations. + """ + warnings.warn("insert is deprecated. Use insert_one or insert_many " + "instead.", DeprecationWarning, stacklevel=2) + write_concern = None + if kwargs: + write_concern = WriteConcern(**kwargs) + return self._insert(doc_or_docs, not continue_on_error, + check_keys, manipulate, write_concern) + + def update(self, spec, document, upsert=False, manipulate=False, + multi=False, check_keys=True, **kwargs): + """Update a document(s) in this collection. + + **DEPRECATED** - Use :meth:`replace_one`, :meth:`update_one`, or + :meth:`update_many` instead. + + .. versionchanged:: 3.0 + Removed the `safe` parameter. Pass ``w=0`` for unacknowledged write + operations. + """ + warnings.warn("update is deprecated. Use replace_one, update_one or " + "update_many instead.", DeprecationWarning, stacklevel=2) + common.validate_is_mapping("spec", spec) + common.validate_is_mapping("document", document) + if document: + # If a top level key begins with '$' this is a modify operation + # and we should skip key validation. It doesn't matter which key + # we check here. Passing a document with a mix of top level keys + # starting with and without a '$' is invalid and the server will + # raise an appropriate exception. + first = next(iter(document)) + if first.startswith('$'): + check_keys = False + + write_concern = None + collation = validate_collation_or_none(kwargs.pop('collation', None)) + if kwargs: + write_concern = WriteConcern(**kwargs) + return self._update_retryable( + spec, document, upsert, check_keys, multi, manipulate, + write_concern, collation=collation) + + def remove(self, spec_or_id=None, multi=True, **kwargs): + """Remove a document(s) from this collection. + + **DEPRECATED** - Use :meth:`delete_one` or :meth:`delete_many` instead. + + .. versionchanged:: 3.0 + Removed the `safe` parameter. Pass ``w=0`` for unacknowledged write + operations. + """ + warnings.warn("remove is deprecated. Use delete_one or delete_many " + "instead.", DeprecationWarning, stacklevel=2) + if spec_or_id is None: + spec_or_id = {} + if not isinstance(spec_or_id, abc.Mapping): + spec_or_id = {"_id": spec_or_id} + write_concern = None + collation = validate_collation_or_none(kwargs.pop('collation', None)) + if kwargs: + write_concern = WriteConcern(**kwargs) + return self._delete_retryable( + spec_or_id, multi, write_concern, collation=collation) + + def find_and_modify(self, query={}, update=None, + upsert=False, sort=None, full_response=False, + manipulate=False, **kwargs): + """Update and return an object. + + **DEPRECATED** - Use :meth:`find_one_and_delete`, + :meth:`find_one_and_replace`, or :meth:`find_one_and_update` instead. + """ + warnings.warn("find_and_modify is deprecated, use find_one_and_delete" + ", find_one_and_replace, or find_one_and_update instead", + DeprecationWarning, stacklevel=2) + + if not update and not kwargs.get('remove', None): + raise ValueError("Must either update or remove") + + if update and kwargs.get('remove', None): + raise ValueError("Can't do both update and remove") + + # No need to include empty args + if query: + kwargs['query'] = query + if update: + kwargs['update'] = update + if upsert: + kwargs['upsert'] = upsert + if sort: + # Accept a list of tuples to match Cursor's sort parameter. + if isinstance(sort, list): + kwargs['sort'] = helpers._index_document(sort) + # Accept OrderedDict, SON, and dict with len == 1 so we + # don't break existing code already using find_and_modify. + elif (isinstance(sort, ORDERED_TYPES) or + isinstance(sort, dict) and len(sort) == 1): + warnings.warn("Passing mapping types for `sort` is deprecated," + " use a list of (key, direction) pairs instead", + DeprecationWarning, stacklevel=2) + kwargs['sort'] = sort + else: + raise TypeError("sort must be a list of (key, direction) " + "pairs, a dict of len 1, or an instance of " + "SON or OrderedDict") + + fields = kwargs.pop("fields", None) + if fields is not None: + kwargs["fields"] = helpers._fields_list_to_dict(fields, "fields") + + collation = validate_collation_or_none(kwargs.pop('collation', None)) + + cmd = SON([("findAndModify", self.__name)]) + cmd.update(kwargs) + + write_concern = self._write_concern_for_cmd(cmd, None) + + def _find_and_modify(session, sock_info, retryable_write): + if (sock_info.max_wire_version >= 4 and + not write_concern.is_server_default): + cmd['writeConcern'] = write_concern.document + result = self._command( + sock_info, cmd, read_preference=ReadPreference.PRIMARY, + allowable_errors=[_NO_OBJ_ERROR], collation=collation, + session=session, retryable_write=retryable_write, + user_fields=_FIND_AND_MODIFY_DOC_FIELDS) + + _check_write_command_response(result) + return result + + out = self.__database.client._retryable_write( + write_concern.acknowledged, _find_and_modify, None) + + if not out['ok']: + if out["errmsg"] == _NO_OBJ_ERROR: + return None + else: + # Should never get here b/c of allowable_errors + raise ValueError("Unexpected Error: %s" % (out,)) + + if full_response: + return out + else: + document = out.get('value') + if manipulate: + document = self.__database._fix_outgoing(document, self) + return document + + def __iter__(self): + return self + + def __next__(self): + raise TypeError("'Collection' object is not iterable") + + next = __next__ + + def __call__(self, *args, **kwargs): + """This is only here so that some API misusages are easier to debug. + """ + if "." not in self.__name: + raise TypeError("'Collection' object is not callable. If you " + "meant to call the '%s' method on a 'Database' " + "object it is failing because no such method " + "exists." % + self.__name) + raise TypeError("'Collection' object is not callable. If you meant to " + "call the '%s' method on a 'Collection' object it is " + "failing because no such method exists." % + self.__name.split(".")[-1]) diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/command_cursor.py b/mongo_mac/lib/python3.6/site-packages/pymongo/command_cursor.py new file mode 100644 index 0000000..9dc407e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/command_cursor.py @@ -0,0 +1,345 @@ +# Copyright 2014-present MongoDB, Inc. +# +# 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. + +"""CommandCursor class to iterate over command results.""" + +import datetime + +from collections import deque + +from bson.py3compat import integer_types +from pymongo import helpers +from pymongo.errors import (AutoReconnect, + InvalidOperation, + NotMasterError, + OperationFailure) +from pymongo.message import (_convert_exception, + _CursorAddress, + _GetMore, + _RawBatchGetMore) + + +class CommandCursor(object): + """A cursor / iterator over command cursors.""" + _getmore_class = _GetMore + + def __init__(self, collection, cursor_info, address, retrieved=0, + batch_size=0, max_await_time_ms=None, session=None, + explicit_session=False): + """Create a new command cursor. + + The parameter 'retrieved' is unused. + """ + self.__collection = collection + self.__id = cursor_info['id'] + self.__address = address + self.__data = deque(cursor_info['firstBatch']) + self.__batch_size = batch_size + self.__max_await_time_ms = max_await_time_ms + self.__session = session + self.__explicit_session = explicit_session + self.__killed = (self.__id == 0) + if self.__killed: + self.__end_session(True) + + if "ns" in cursor_info: + self.__ns = cursor_info["ns"] + else: + self.__ns = collection.full_name + + self.batch_size(batch_size) + + if (not isinstance(max_await_time_ms, integer_types) + and max_await_time_ms is not None): + raise TypeError("max_await_time_ms must be an integer or None") + + def __del__(self): + if self.__id and not self.__killed: + self.__die() + + def __die(self, synchronous=False): + """Closes this cursor. + """ + already_killed = self.__killed + self.__killed = True + if self.__id and not already_killed: + address = _CursorAddress( + self.__address, self.__collection.full_name) + if synchronous: + self.__collection.database.client._close_cursor_now( + self.__id, address, session=self.__session) + else: + # The cursor will be closed later in a different session. + self.__collection.database.client._close_cursor( + self.__id, address) + self.__end_session(synchronous) + + def __end_session(self, synchronous): + if self.__session and not self.__explicit_session: + self.__session._end_session(lock=synchronous) + self.__session = None + + def close(self): + """Explicitly close / kill this cursor. + """ + self.__die(True) + + def batch_size(self, batch_size): + """Limits the number of documents returned in one batch. Each batch + requires a round trip to the server. It can be adjusted to optimize + performance and limit data transfer. + + .. note:: batch_size can not override MongoDB's internal limits on the + amount of data it will return to the client in a single batch (i.e + if you set batch size to 1,000,000,000, MongoDB will currently only + return 4-16MB of results per batch). + + Raises :exc:`TypeError` if `batch_size` is not an integer. + Raises :exc:`ValueError` if `batch_size` is less than ``0``. + + :Parameters: + - `batch_size`: The size of each batch of results requested. + """ + if not isinstance(batch_size, integer_types): + raise TypeError("batch_size must be an integer") + if batch_size < 0: + raise ValueError("batch_size must be >= 0") + + self.__batch_size = batch_size == 1 and 2 or batch_size + return self + + def __send_message(self, operation): + """Send a getmore message and handle the response. + """ + def kill(): + self.__killed = True + self.__end_session(True) + + client = self.__collection.database.client + listeners = client._event_listeners + publish = listeners.enabled_for_commands + start = datetime.datetime.now() + + def duration(): return datetime.datetime.now() - start + + try: + response = client._send_message_with_response( + operation, address=self.__address) + except AutoReconnect: + # Don't try to send kill cursors on another socket + # or to another server. It can cause a _pinValue + # assertion on some server releases if we get here + # due to a socket timeout. + kill() + raise + + rqst_id = response.request_id + from_command = response.from_command + reply = response.data + + try: + user_fields = None + legacy_response = True + if from_command: + user_fields = {'cursor': {'nextBatch': 1}} + legacy_response = False + docs = self._unpack_response( + reply, self.__id, self.__collection.codec_options, + legacy_response=legacy_response, user_fields=user_fields) + if from_command: + first = docs[0] + client._receive_cluster_time(first, self.__session) + helpers._check_command_response(first) + + except OperationFailure as exc: + kill() + + if publish: + listeners.publish_command_failure( + duration(), exc.details, "getMore", rqst_id, self.__address) + + raise + except NotMasterError as exc: + # Don't send kill cursors to another server after a "not master" + # error. It's completely pointless. + kill() + + if publish: + listeners.publish_command_failure( + duration(), exc.details, "getMore", rqst_id, self.__address) + + client._reset_server_and_request_check(self.__address) + raise + except Exception as exc: + if publish: + listeners.publish_command_failure( + duration(), _convert_exception(exc), "getMore", rqst_id, + self.__address) + raise + + if from_command: + cursor = docs[0]['cursor'] + documents = cursor['nextBatch'] + self.__id = cursor['id'] + if publish: + listeners.publish_command_success( + duration(), docs[0], "getMore", rqst_id, + self.__address) + else: + documents = docs + self.__id = reply.cursor_id + + if publish: + # Must publish in getMore command response format. + res = {"cursor": {"id": self.__id, + "ns": self.__collection.full_name, + "nextBatch": documents}, + "ok": 1} + listeners.publish_command_success( + duration(), res, "getMore", rqst_id, self.__address) + + if self.__id == 0: + kill() + self.__data = deque(documents) + + def _unpack_response(self, response, cursor_id, codec_options, + user_fields=None, legacy_response=False): + return response.unpack_response(cursor_id, codec_options, user_fields, + legacy_response) + + def _refresh(self): + """Refreshes the cursor with more data from the server. + + Returns the length of self.__data after refresh. Will exit early if + self.__data is already non-empty. Raises OperationFailure when the + cursor cannot be refreshed due to an error on the query. + """ + if len(self.__data) or self.__killed: + return len(self.__data) + + if self.__id: # Get More + dbname, collname = self.__ns.split('.', 1) + read_pref = self.__collection._read_preference_for(self.session) + self.__send_message( + self._getmore_class(dbname, + collname, + self.__batch_size, + self.__id, + self.__collection.codec_options, + read_pref, + self.__session, + self.__collection.database.client, + self.__max_await_time_ms)) + else: # Cursor id is zero nothing else to return + self.__killed = True + self.__end_session(True) + + return len(self.__data) + + @property + def alive(self): + """Does this cursor have the potential to return more data? + + Even if :attr:`alive` is ``True``, :meth:`next` can raise + :exc:`StopIteration`. Best to use a for loop:: + + for doc in collection.aggregate(pipeline): + print(doc) + + .. note:: :attr:`alive` can be True while iterating a cursor from + a failed server. In this case :attr:`alive` will return False after + :meth:`next` fails to retrieve the next batch of results from the + server. + """ + return bool(len(self.__data) or (not self.__killed)) + + @property + def cursor_id(self): + """Returns the id of the cursor.""" + return self.__id + + @property + def address(self): + """The (host, port) of the server used, or None. + + .. versionadded:: 3.0 + """ + return self.__address + + @property + def session(self): + """The cursor's :class:`~pymongo.client_session.ClientSession`, or None. + + .. versionadded:: 3.6 + """ + if self.__explicit_session: + return self.__session + + def __iter__(self): + return self + + def next(self): + """Advance the cursor.""" + # Block until a document is returnable. + while self.alive: + doc = self._try_next(True) + if doc is not None: + return doc + + raise StopIteration + + __next__ = next + + def _try_next(self, get_more_allowed): + """Advance the cursor blocking for at most one getMore command.""" + if not len(self.__data) and not self.__killed and get_more_allowed: + self._refresh() + if len(self.__data): + coll = self.__collection + return coll.database._fix_outgoing(self.__data.popleft(), coll) + else: + return None + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + + +class RawBatchCommandCursor(CommandCursor): + _getmore_class = _RawBatchGetMore + + def __init__(self, collection, cursor_info, address, retrieved=0, + batch_size=0, max_await_time_ms=None, session=None, + explicit_session=False): + """Create a new cursor / iterator over raw batches of BSON data. + + Should not be called directly by application developers - + see :meth:`~pymongo.collection.Collection.aggregate_raw_batches` + instead. + + .. mongodoc:: cursors + """ + assert not cursor_info.get('firstBatch') + super(RawBatchCommandCursor, self).__init__( + collection, cursor_info, address, retrieved, batch_size, + max_await_time_ms, session, explicit_session) + + def _unpack_response(self, response, cursor_id, codec_options, + user_fields=None, legacy_response=False): + return response.raw_response(cursor_id) + + def __getitem__(self, index): + raise InvalidOperation("Cannot call __getitem__ on RawBatchCursor") diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/common.py b/mongo_mac/lib/python3.6/site-packages/pymongo/common.py new file mode 100644 index 0000000..291c8b4 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/common.py @@ -0,0 +1,733 @@ +# Copyright 2011-present MongoDB, Inc. +# +# 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. + + +"""Functions and classes common to multiple pymongo modules.""" + +import datetime +import warnings + +from bson import SON +from bson.binary import (STANDARD, PYTHON_LEGACY, + JAVA_LEGACY, CSHARP_LEGACY) +from bson.codec_options import CodecOptions, TypeRegistry +from bson.py3compat import abc, integer_types, iteritems, string_type +from bson.raw_bson import RawBSONDocument +from pymongo.auth import MECHANISMS +from pymongo.compression_support import (validate_compressors, + validate_zlib_compression_level) +from pymongo.driver_info import DriverInfo +from pymongo.errors import ConfigurationError +from pymongo.monitoring import _validate_event_listeners +from pymongo.read_concern import ReadConcern +from pymongo.read_preferences import _MONGOS_MODES, _ServerMode +from pymongo.ssl_support import validate_cert_reqs +from pymongo.write_concern import DEFAULT_WRITE_CONCERN, WriteConcern + +try: + from collections import OrderedDict + ORDERED_TYPES = (SON, OrderedDict) +except ImportError: + ORDERED_TYPES = (SON,) + + +# Defaults until we connect to a server and get updated limits. +MAX_BSON_SIZE = 16 * (1024 ** 2) +MAX_MESSAGE_SIZE = 2 * MAX_BSON_SIZE +MIN_WIRE_VERSION = 0 +MAX_WIRE_VERSION = 0 +MAX_WRITE_BATCH_SIZE = 1000 + +# What this version of PyMongo supports. +MIN_SUPPORTED_SERVER_VERSION = "2.6" +MIN_SUPPORTED_WIRE_VERSION = 2 +MAX_SUPPORTED_WIRE_VERSION = 5 + +# Frequency to call ismaster on servers, in seconds. +HEARTBEAT_FREQUENCY = 10 + +# Frequency to process kill-cursors, in seconds. See MongoClient.close_cursor. +KILL_CURSOR_FREQUENCY = 1 + +# Frequency to process events queue, in seconds. +EVENTS_QUEUE_FREQUENCY = 1 + +# How long to wait, in seconds, for a suitable server to be found before +# aborting an operation. For example, if the client attempts an insert +# during a replica set election, SERVER_SELECTION_TIMEOUT governs the +# longest it is willing to wait for a new primary to be found. +SERVER_SELECTION_TIMEOUT = 30 + +# Spec requires at least 500ms between ismaster calls. +MIN_HEARTBEAT_INTERVAL = 0.5 + +# Default connectTimeout in seconds. +CONNECT_TIMEOUT = 20.0 + +# Default value for maxPoolSize. +MAX_POOL_SIZE = 100 + +# Default value for minPoolSize. +MIN_POOL_SIZE = 0 + +# Default value for maxIdleTimeMS. +MAX_IDLE_TIME_MS = None + +# Default value for localThresholdMS. +LOCAL_THRESHOLD_MS = 15 + +# Default value for retryWrites. +RETRY_WRITES = False + +# mongod/s 2.6 and above return code 59 when a command doesn't exist. +COMMAND_NOT_FOUND_CODES = (59,) + +# Error codes to ignore if GridFS calls createIndex on a secondary +UNAUTHORIZED_CODES = (13, 16547, 16548) + +# Maximum number of sessions to send in a single endSessions command. +# From the driver sessions spec. +_MAX_END_SESSIONS = 10000 + + +def partition_node(node): + """Split a host:port string into (host, int(port)) pair.""" + host = node + port = 27017 + idx = node.rfind(':') + if idx != -1: + host, port = node[:idx], int(node[idx + 1:]) + if host.startswith('['): + host = host[1:-1] + return host, port + + +def clean_node(node): + """Split and normalize a node name from an ismaster response.""" + host, port = partition_node(node) + + # Normalize hostname to lowercase, since DNS is case-insensitive: + # http://tools.ietf.org/html/rfc4343 + # This prevents useless rediscovery if "foo.com" is in the seed list but + # "FOO.com" is in the ismaster response. + return host.lower(), port + + +def raise_config_error(key, dummy): + """Raise ConfigurationError with the given key name.""" + raise ConfigurationError("Unknown option %s" % (key,)) + + +# Mapping of URI uuid representation options to valid subtypes. +_UUID_REPRESENTATIONS = { + 'standard': STANDARD, + 'pythonLegacy': PYTHON_LEGACY, + 'javaLegacy': JAVA_LEGACY, + 'csharpLegacy': CSHARP_LEGACY +} + + +def validate_boolean(option, value): + """Validates that 'value' is True or False.""" + if isinstance(value, bool): + return value + raise TypeError("%s must be True or False" % (option,)) + + +def validate_boolean_or_string(option, value): + """Validates that value is True, False, 'true', or 'false'.""" + if isinstance(value, string_type): + if value not in ('true', 'false'): + raise ValueError("The value of %s must be " + "'true' or 'false'" % (option,)) + return value == 'true' + return validate_boolean(option, value) + + +def validate_integer(option, value): + """Validates that 'value' is an integer (or basestring representation). + """ + if isinstance(value, integer_types): + return value + elif isinstance(value, string_type): + try: + return int(value) + except ValueError: + raise ValueError("The value of %s must be " + "an integer" % (option,)) + raise TypeError("Wrong type for %s, value must be an integer" % (option,)) + + +def validate_positive_integer(option, value): + """Validate that 'value' is a positive integer, which does not include 0. + """ + val = validate_integer(option, value) + if val <= 0: + raise ValueError("The value of %s must be " + "a positive integer" % (option,)) + return val + + +def validate_non_negative_integer(option, value): + """Validate that 'value' is a positive integer or 0. + """ + val = validate_integer(option, value) + if val < 0: + raise ValueError("The value of %s must be " + "a non negative integer" % (option,)) + return val + + +def validate_readable(option, value): + """Validates that 'value' is file-like and readable. + """ + if value is None: + return value + # First make sure its a string py3.3 open(True, 'r') succeeds + # Used in ssl cert checking due to poor ssl module error reporting + value = validate_string(option, value) + open(value, 'r').close() + return value + + +def validate_positive_integer_or_none(option, value): + """Validate that 'value' is a positive integer or None. + """ + if value is None: + return value + return validate_positive_integer(option, value) + + +def validate_non_negative_integer_or_none(option, value): + """Validate that 'value' is a positive integer or 0 or None. + """ + if value is None: + return value + return validate_non_negative_integer(option, value) + + +def validate_string(option, value): + """Validates that 'value' is an instance of `basestring` for Python 2 + or `str` for Python 3. + """ + if isinstance(value, string_type): + return value + raise TypeError("Wrong type for %s, value must be " + "an instance of %s" % (option, string_type.__name__)) + + +def validate_string_or_none(option, value): + """Validates that 'value' is an instance of `basestring` or `None`. + """ + if value is None: + return value + return validate_string(option, value) + + +def validate_int_or_basestring(option, value): + """Validates that 'value' is an integer or string. + """ + if isinstance(value, integer_types): + return value + elif isinstance(value, string_type): + try: + return int(value) + except ValueError: + return value + raise TypeError("Wrong type for %s, value must be an " + "integer or a string" % (option,)) + + +def validate_non_negative_int_or_basestring(option, value): + """Validates that 'value' is an integer or string. + """ + if isinstance(value, integer_types): + return value + elif isinstance(value, string_type): + try: + val = int(value) + except ValueError: + return value + return validate_non_negative_integer(option, val) + raise TypeError("Wrong type for %s, value must be an " + "non negative integer or a string" % (option,)) + + +def validate_positive_float(option, value): + """Validates that 'value' is a float, or can be converted to one, and is + positive. + """ + errmsg = "%s must be an integer or float" % (option,) + try: + value = float(value) + except ValueError: + raise ValueError(errmsg) + except TypeError: + raise TypeError(errmsg) + + # float('inf') doesn't work in 2.4 or 2.5 on Windows, so just cap floats at + # one billion - this is a reasonable approximation for infinity + if not 0 < value < 1e9: + raise ValueError("%s must be greater than 0 and " + "less than one billion" % (option,)) + return value + + +def validate_positive_float_or_zero(option, value): + """Validates that 'value' is 0 or a positive float, or can be converted to + 0 or a positive float. + """ + if value == 0 or value == "0": + return 0 + return validate_positive_float(option, value) + + +def validate_timeout_or_none(option, value): + """Validates a timeout specified in milliseconds returning + a value in floating point seconds. + """ + if value is None: + return value + return validate_positive_float(option, value) / 1000.0 + + +def validate_timeout_or_zero(option, value): + """Validates a timeout specified in milliseconds returning + a value in floating point seconds for the case where None is an error + and 0 is valid. Setting the timeout to nothing in the URI string is a + config error. + """ + if value is None: + raise ConfigurationError("%s cannot be None" % (option, )) + if value == 0 or value == "0": + return 0 + return validate_positive_float(option, value) / 1000.0 + + +def validate_max_staleness(option, value): + """Validates maxStalenessSeconds according to the Max Staleness Spec.""" + if value == -1 or value == "-1": + # Default: No maximum staleness. + return -1 + return validate_positive_integer(option, value) + + +def validate_read_preference(dummy, value): + """Validate a read preference. + """ + if not isinstance(value, _ServerMode): + raise TypeError("%r is not a read preference." % (value,)) + return value + + +def validate_read_preference_mode(dummy, value): + """Validate read preference mode for a MongoReplicaSetClient. + + .. versionchanged:: 3.5 + Returns the original ``value`` instead of the validated read preference + mode. + """ + if value not in _MONGOS_MODES: + raise ValueError("%s is not a valid read preference" % (value,)) + return value + + +def validate_auth_mechanism(option, value): + """Validate the authMechanism URI option. + """ + # CRAM-MD5 is for server testing only. Undocumented, + # unsupported, may be removed at any time. You have + # been warned. + if value not in MECHANISMS and value != 'CRAM-MD5': + raise ValueError("%s must be in %s" % (option, tuple(MECHANISMS))) + return value + + +def validate_uuid_representation(dummy, value): + """Validate the uuid representation option selected in the URI. + """ + try: + return _UUID_REPRESENTATIONS[value] + except KeyError: + raise ValueError("%s is an invalid UUID representation. " + "Must be one of " + "%s" % (value, tuple(_UUID_REPRESENTATIONS))) + + +def validate_read_preference_tags(name, value): + """Parse readPreferenceTags if passed as a client kwarg. + """ + if not isinstance(value, list): + value = [value] + + tag_sets = [] + for tag_set in value: + if tag_set == '': + tag_sets.append({}) + continue + try: + tag_sets.append(dict([tag.split(":") + for tag in tag_set.split(",")])) + except Exception: + raise ValueError("%r not a valid " + "value for %s" % (tag_set, name)) + return tag_sets + + +_MECHANISM_PROPS = frozenset(['SERVICE_NAME', + 'CANONICALIZE_HOST_NAME', + 'SERVICE_REALM']) + + +def validate_auth_mechanism_properties(option, value): + """Validate authMechanismProperties.""" + value = validate_string(option, value) + props = {} + for opt in value.split(','): + try: + key, val = opt.split(':') + except ValueError: + raise ValueError("auth mechanism properties must be " + "key:value pairs like SERVICE_NAME:" + "mongodb, not %s." % (opt,)) + if key not in _MECHANISM_PROPS: + raise ValueError("%s is not a supported auth " + "mechanism property. Must be one of " + "%s." % (key, tuple(_MECHANISM_PROPS))) + if key == 'CANONICALIZE_HOST_NAME': + props[key] = validate_boolean_or_string(key, val) + else: + props[key] = val + + return props + + +def validate_document_class(option, value): + """Validate the document_class option.""" + if not issubclass(value, (abc.MutableMapping, RawBSONDocument)): + raise TypeError("%s must be dict, bson.son.SON, " + "bson.raw_bson.RawBSONDocument, or a " + "sublass of collections.MutableMapping" % (option,)) + return value + + +def validate_type_registry(option, value): + """Validate the type_registry option.""" + if value is not None and not isinstance(value, TypeRegistry): + raise TypeError("%s must be an instance of %s" % ( + option, TypeRegistry)) + return value + + +def validate_list(option, value): + """Validates that 'value' is a list.""" + if not isinstance(value, list): + raise TypeError("%s must be a list" % (option,)) + return value + + +def validate_list_or_none(option, value): + """Validates that 'value' is a list or None.""" + if value is None: + return value + return validate_list(option, value) + + +def validate_is_mapping(option, value): + """Validate the type of method arguments that expect a document.""" + if not isinstance(value, abc.Mapping): + raise TypeError("%s must be an instance of dict, bson.son.SON, or " + "other type that inherits from " + "collections.Mapping" % (option,)) + + +def validate_is_document_type(option, value): + """Validate the type of method arguments that expect a MongoDB document.""" + if not isinstance(value, (abc.MutableMapping, RawBSONDocument)): + raise TypeError("%s must be an instance of dict, bson.son.SON, " + "bson.raw_bson.RawBSONDocument, or " + "a type that inherits from " + "collections.MutableMapping" % (option,)) + + +def validate_appname_or_none(option, value): + """Validate the appname option.""" + if value is None: + return value + validate_string(option, value) + # We need length in bytes, so encode utf8 first. + if len(value.encode('utf-8')) > 128: + raise ValueError("%s must be <= 128 bytes" % (option,)) + return value + + +def validate_driver_or_none(option, value): + """Validate the driver keyword arg.""" + if value is None: + return value + if not isinstance(value, DriverInfo): + raise TypeError("%s must be an instance of DriverInfo" % (option,)) + return value + + +def validate_is_callable_or_none(option, value): + """Validates that 'value' is a callable.""" + if value is None: + return value + if not callable(value): + raise ValueError("%s must be a callable" % (option,)) + return value + + +def validate_ok_for_replace(replacement): + """Validate a replacement document.""" + validate_is_mapping("replacement", replacement) + # Replacement can be {} + if replacement and not isinstance(replacement, RawBSONDocument): + first = next(iter(replacement)) + if first.startswith('$'): + raise ValueError('replacement can not include $ operators') + + +def validate_ok_for_update(update): + """Validate an update document.""" + validate_is_mapping("update", update) + # Update can not be {} + if not update: + raise ValueError('update only works with $ operators') + first = next(iter(update)) + if not first.startswith('$'): + raise ValueError('update only works with $ operators') + + +_UNICODE_DECODE_ERROR_HANDLERS = frozenset(['strict', 'replace', 'ignore']) + + +def validate_unicode_decode_error_handler(dummy, value): + """Validate the Unicode decode error handler option of CodecOptions. + """ + if value not in _UNICODE_DECODE_ERROR_HANDLERS: + raise ValueError("%s is an invalid Unicode decode error handler. " + "Must be one of " + "%s" % (value, tuple(_UNICODE_DECODE_ERROR_HANDLERS))) + return value + + +def validate_tzinfo(dummy, value): + """Validate the tzinfo option + """ + if value is not None and not isinstance(value, datetime.tzinfo): + raise TypeError("%s must be an instance of datetime.tzinfo" % value) + return value + + +# journal is an alias for j, +# wtimeoutms is an alias for wtimeout, +URI_VALIDATORS = { + 'replicaset': validate_string_or_none, + 'w': validate_non_negative_int_or_basestring, + 'wtimeout': validate_non_negative_integer, + 'wtimeoutms': validate_non_negative_integer, + 'fsync': validate_boolean_or_string, + 'j': validate_boolean_or_string, + 'journal': validate_boolean_or_string, + 'maxpoolsize': validate_positive_integer_or_none, + 'socketkeepalive': validate_boolean_or_string, + 'waitqueuemultiple': validate_non_negative_integer_or_none, + 'ssl': validate_boolean_or_string, + 'ssl_keyfile': validate_readable, + 'ssl_certfile': validate_readable, + 'ssl_pem_passphrase': validate_string_or_none, + 'ssl_cert_reqs': validate_cert_reqs, + 'ssl_ca_certs': validate_readable, + 'ssl_match_hostname': validate_boolean_or_string, + 'ssl_crlfile': validate_readable, + 'readconcernlevel': validate_string_or_none, + 'readpreference': validate_read_preference_mode, + 'readpreferencetags': validate_read_preference_tags, + 'localthresholdms': validate_positive_float_or_zero, + 'authmechanism': validate_auth_mechanism, + 'authsource': validate_string, + 'authmechanismproperties': validate_auth_mechanism_properties, + 'tz_aware': validate_boolean_or_string, + 'uuidrepresentation': validate_uuid_representation, + 'connect': validate_boolean_or_string, + 'minpoolsize': validate_non_negative_integer, + 'appname': validate_appname_or_none, + 'driver': validate_driver_or_none, + 'unicode_decode_error_handler': validate_unicode_decode_error_handler, + 'retrywrites': validate_boolean_or_string, + 'compressors': validate_compressors, + 'zlibcompressionlevel': validate_zlib_compression_level, +} + +TIMEOUT_VALIDATORS = { + 'connecttimeoutms': validate_timeout_or_none, + 'sockettimeoutms': validate_timeout_or_none, + 'waitqueuetimeoutms': validate_timeout_or_none, + 'serverselectiontimeoutms': validate_timeout_or_zero, + 'heartbeatfrequencyms': validate_timeout_or_none, + 'maxidletimems': validate_timeout_or_none, + 'maxstalenessseconds': validate_max_staleness, +} + +KW_VALIDATORS = { + 'document_class': validate_document_class, + 'type_registry': validate_type_registry, + 'read_preference': validate_read_preference, + 'event_listeners': _validate_event_listeners, + 'tzinfo': validate_tzinfo, + 'username': validate_string_or_none, + 'password': validate_string_or_none, + 'server_selector': validate_is_callable_or_none, +} + +URI_VALIDATORS.update(TIMEOUT_VALIDATORS) +VALIDATORS = URI_VALIDATORS.copy() +VALIDATORS.update(KW_VALIDATORS) + + +_AUTH_OPTIONS = frozenset(['authmechanismproperties']) + + +def validate_auth_option(option, value): + """Validate optional authentication parameters. + """ + lower, value = validate(option, value) + if lower not in _AUTH_OPTIONS: + raise ConfigurationError('Unknown ' + 'authentication option: %s' % (option,)) + return lower, value + + +def validate(option, value): + """Generic validation function. + """ + lower = option.lower() + validator = VALIDATORS.get(lower, raise_config_error) + value = validator(option, value) + return lower, value + + +def get_validated_options(options, warn=True): + """Validate each entry in options and raise a warning if it is not valid. + Returns a copy of options with invalid entries removed + """ + validated_options = {} + for opt, value in iteritems(options): + lower = opt.lower() + try: + validator = URI_VALIDATORS.get(lower, raise_config_error) + value = validator(opt, value) + except (ValueError, ConfigurationError) as exc: + if warn: + warnings.warn(str(exc)) + else: + raise + else: + validated_options[lower] = value + return validated_options + + +WRITE_CONCERN_OPTIONS = frozenset([ + 'w', + 'wtimeout', + 'wtimeoutms', + 'fsync', + 'j', + 'journal' +]) + + +class BaseObject(object): + """A base class that provides attributes and methods common + to multiple pymongo classes. + + SHOULD NOT BE USED BY DEVELOPERS EXTERNAL TO MONGODB. + """ + + def __init__(self, codec_options, read_preference, write_concern, + read_concern): + + if not isinstance(codec_options, CodecOptions): + raise TypeError("codec_options must be an instance of " + "bson.codec_options.CodecOptions") + self.__codec_options = codec_options + + if not isinstance(read_preference, _ServerMode): + raise TypeError("%r is not valid for read_preference. See " + "pymongo.read_preferences for valid " + "options." % (read_preference,)) + self.__read_preference = read_preference + + if not isinstance(write_concern, WriteConcern): + raise TypeError("write_concern must be an instance of " + "pymongo.write_concern.WriteConcern") + self.__write_concern = write_concern + + if not isinstance(read_concern, ReadConcern): + raise TypeError("read_concern must be an instance of " + "pymongo.read_concern.ReadConcern") + self.__read_concern = read_concern + + @property + def codec_options(self): + """Read only access to the :class:`~bson.codec_options.CodecOptions` + of this instance. + """ + return self.__codec_options + + @property + def write_concern(self): + """Read only access to the :class:`~pymongo.write_concern.WriteConcern` + of this instance. + + .. versionchanged:: 3.0 + The :attr:`write_concern` attribute is now read only. + """ + return self.__write_concern + + def _write_concern_for(self, session): + """Read only access to the write concern of this instance or session. + """ + # Override this operation's write concern with the transaction's. + if session and session._in_transaction: + return DEFAULT_WRITE_CONCERN + return self.write_concern + + @property + def read_preference(self): + """Read only access to the read preference of this instance. + + .. versionchanged:: 3.0 + The :attr:`read_preference` attribute is now read only. + """ + return self.__read_preference + + def _read_preference_for(self, session): + """Read only access to the read preference of this instance or session. + """ + # Override this operation's read preference with the transaction's. + if session: + return session._txn_read_preference() or self.__read_preference + return self.__read_preference + + @property + def read_concern(self): + """Read only access to the :class:`~pymongo.read_concern.ReadConcern` + of this instance. + + .. versionadded:: 3.2 + """ + return self.__read_concern diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/compression_support.py b/mongo_mac/lib/python3.6/site-packages/pymongo/compression_support.py new file mode 100644 index 0000000..a4987df --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/compression_support.py @@ -0,0 +1,124 @@ +# Copyright 2018 MongoDB, Inc. +# +# 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 warnings + +try: + import snappy + _HAVE_SNAPPY = True +except ImportError: + # python-snappy isn't available. + _HAVE_SNAPPY = False + +try: + import zlib + _HAVE_ZLIB = True +except ImportError: + # Python built without zlib support. + _HAVE_ZLIB = False + +from pymongo.monitoring import _SENSITIVE_COMMANDS + +_SUPPORTED_COMPRESSORS = set(["snappy", "zlib"]) +_NO_COMPRESSION = set(['ismaster']) +_NO_COMPRESSION.update(_SENSITIVE_COMMANDS) + + +def validate_compressors(dummy, value): + compressors = value.split(",") + for compressor in compressors[:]: + if compressor not in _SUPPORTED_COMPRESSORS: + compressors.remove(compressor) + warnings.warn("Unsupported compressor: %s" % (compressor,)) + elif compressor == "snappy" and not _HAVE_SNAPPY: + compressors.remove(compressor) + warnings.warn( + "Wire protocol compression with snappy is not available. " + "You must install the python-snappy module for snappy support.") + elif compressor == "zlib" and not _HAVE_ZLIB: + compressors.remove(compressor) + warnings.warn( + "Wire protocol compression with zlib is not available. " + "The zlib module is not available.") + return compressors + + +def validate_zlib_compression_level(option, value): + try: + level = int(value) + except: + raise TypeError("%s must be an integer, not %r." % (option, value)) + if level < -1 or level > 9: + raise ValueError( + "%s must be between -1 and 9, not %d." % (option, level)) + return level + + +class CompressionSettings(object): + def __init__(self, compressors, zlib_compression_level): + self.compressors = compressors + self.zlib_compression_level = zlib_compression_level + + def get_compression_context(self, compressors): + if compressors: + chosen = compressors[0] + if chosen == "snappy": + return SnappyContext() + elif chosen == "zlib": + return ZlibContext(self.zlib_compression_level) + + +def _zlib_no_compress(data): + """Compress data with zlib level 0.""" + cobj = zlib.compressobj(0) + return b"".join([cobj.compress(data), cobj.flush()]) + + +class SnappyContext(object): + compressor_id = 1 + + @staticmethod + def compress(data): + return snappy.compress(data) + + +class ZlibContext(object): + compressor_id = 2 + + def __init__(self, level): + # Jython zlib.compress doesn't support -1 + if level == -1: + self.compress = zlib.compress + # Jython zlib.compress also doesn't support 0 + elif level == 0: + self.compress = _zlib_no_compress + else: + self.compress = lambda data: zlib.compress(data, level) + + +def decompress(data, compressor_id): + if compressor_id == SnappyContext.compressor_id: + # python-snappy doesn't support the buffer interface. + # https://github.com/andrix/python-snappy/issues/65 + # This only matters when data is a memoryview since + # id(bytes(data)) == id(data) when data is a bytes. + # NOTE: bytes(memoryview) returns the memoryview repr + # in Python 2.7. The right thing to do in 2.7 is call + # memoryview.tobytes(), but we currently only use + # memoryview in Python 3.x. + return snappy.uncompress(bytes(data)) + elif compressor_id == ZlibContext.compressor_id: + return zlib.decompress(data) + else: + raise ValueError("Unknown compressorId %d" % (compressor_id,)) diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/cursor.py b/mongo_mac/lib/python3.6/site-packages/pymongo/cursor.py new file mode 100644 index 0000000..5f804d7 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/cursor.py @@ -0,0 +1,1327 @@ +# Copyright 2009-present MongoDB, Inc. +# +# 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. + +"""Cursor class to iterate over Mongo query results.""" + +import copy +import datetime +import warnings + +from collections import deque + +from bson import RE_TYPE +from bson.code import Code +from bson.py3compat import (iteritems, + integer_types, + string_type) +from bson.son import SON +from pymongo import helpers +from pymongo.common import validate_boolean, validate_is_mapping +from pymongo.collation import validate_collation_or_none +from pymongo.errors import (AutoReconnect, + ConnectionFailure, + InvalidOperation, + NotMasterError, + OperationFailure) +from pymongo.message import (_convert_exception, + _CursorAddress, + _GetMore, + _RawBatchGetMore, + _Query, + _RawBatchQuery) + + +_QUERY_OPTIONS = { + "tailable_cursor": 2, + "slave_okay": 4, + "oplog_replay": 8, + "no_timeout": 16, + "await_data": 32, + "exhaust": 64, + "partial": 128} +_CURSOR_DOC_FIELDS = {'cursor': {'firstBatch': 1, 'nextBatch': 1}} + + +class CursorType(object): + NON_TAILABLE = 0 + """The standard cursor type.""" + + TAILABLE = _QUERY_OPTIONS["tailable_cursor"] + """The tailable cursor type. + + Tailable cursors are only for use with capped collections. They are not + closed when the last data is retrieved but are kept open and the cursor + location marks the final document position. If more data is received + iteration of the cursor will continue from the last document received. + """ + + TAILABLE_AWAIT = TAILABLE | _QUERY_OPTIONS["await_data"] + """A tailable cursor with the await option set. + + Creates a tailable cursor that will wait for a few seconds after returning + the full result set so that it can capture and return additional data added + during the query. + """ + + EXHAUST = _QUERY_OPTIONS["exhaust"] + """An exhaust cursor. + + MongoDB will stream batched results to the client without waiting for the + client to request each batch, reducing latency. + """ + + +# This has to be an old style class due to +# http://bugs.jython.org/issue1057 +class _SocketManager: + """Used with exhaust cursors to ensure the socket is returned. + """ + def __init__(self, sock, pool): + self.sock = sock + self.pool = pool + self.__closed = False + + def __del__(self): + self.close() + + def close(self): + """Return this instance's socket to the connection pool. + """ + if not self.__closed: + self.__closed = True + self.pool.return_socket(self.sock) + self.sock, self.pool = None, None + + +class Cursor(object): + """A cursor / iterator over Mongo query results. + """ + _query_class = _Query + _getmore_class = _GetMore + + def __init__(self, collection, filter=None, projection=None, skip=0, + limit=0, no_cursor_timeout=False, + cursor_type=CursorType.NON_TAILABLE, + sort=None, allow_partial_results=False, oplog_replay=False, + modifiers=None, batch_size=0, manipulate=True, + collation=None, hint=None, max_scan=None, max_time_ms=None, + max=None, min=None, return_key=False, show_record_id=False, + snapshot=False, comment=None, session=None): + """Create a new cursor. + + Should not be called directly by application developers - see + :meth:`~pymongo.collection.Collection.find` instead. + + .. mongodoc:: cursors + """ + # Initialize all attributes used in __del__ before possibly raising + # an error to avoid attribute errors during garbage collection. + self.__id = None + self.__exhaust = False + self.__exhaust_mgr = None + self.__killed = False + + if session: + self.__session = session + self.__explicit_session = True + else: + self.__session = None + self.__explicit_session = False + + spec = filter + if spec is None: + spec = {} + + validate_is_mapping("filter", spec) + if not isinstance(skip, int): + raise TypeError("skip must be an instance of int") + if not isinstance(limit, int): + raise TypeError("limit must be an instance of int") + validate_boolean("no_cursor_timeout", no_cursor_timeout) + if cursor_type not in (CursorType.NON_TAILABLE, CursorType.TAILABLE, + CursorType.TAILABLE_AWAIT, CursorType.EXHAUST): + raise ValueError("not a valid value for cursor_type") + validate_boolean("allow_partial_results", allow_partial_results) + validate_boolean("oplog_replay", oplog_replay) + if modifiers is not None: + warnings.warn("the 'modifiers' parameter is deprecated", + DeprecationWarning, stacklevel=2) + validate_is_mapping("modifiers", modifiers) + if not isinstance(batch_size, integer_types): + raise TypeError("batch_size must be an integer") + if batch_size < 0: + raise ValueError("batch_size must be >= 0") + + if projection is not None: + if not projection: + projection = {"_id": 1} + projection = helpers._fields_list_to_dict(projection, "projection") + + self.__collection = collection + self.__spec = spec + self.__projection = projection + self.__skip = skip + self.__limit = limit + self.__batch_size = batch_size + self.__modifiers = modifiers and modifiers.copy() or {} + self.__ordering = sort and helpers._index_document(sort) or None + self.__max_scan = max_scan + self.__explain = False + self.__comment = comment + self.__max_time_ms = max_time_ms + self.__max_await_time_ms = None + self.__max = max + self.__min = min + self.__manipulate = manipulate + self.__collation = validate_collation_or_none(collation) + self.__return_key = return_key + self.__show_record_id = show_record_id + self.__snapshot = snapshot + self.__set_hint(hint) + + # Exhaust cursor support + if cursor_type == CursorType.EXHAUST: + if self.__collection.database.client.is_mongos: + raise InvalidOperation('Exhaust cursors are ' + 'not supported by mongos') + if limit: + raise InvalidOperation("Can't use limit and exhaust together.") + self.__exhaust = True + + # This is ugly. People want to be able to do cursor[5:5] and + # get an empty result set (old behavior was an + # exception). It's hard to do that right, though, because the + # server uses limit(0) to mean 'no limit'. So we set __empty + # in that case and check for it when iterating. We also unset + # it anytime we change __limit. + self.__empty = False + + self.__data = deque() + self.__address = None + self.__retrieved = 0 + + self.__codec_options = collection.codec_options + # Read preference is set when the initial find is sent. + self.__read_preference = None + self.__read_concern = collection.read_concern + + self.__query_flags = cursor_type + if no_cursor_timeout: + self.__query_flags |= _QUERY_OPTIONS["no_timeout"] + if allow_partial_results: + self.__query_flags |= _QUERY_OPTIONS["partial"] + if oplog_replay: + self.__query_flags |= _QUERY_OPTIONS["oplog_replay"] + + @property + def collection(self): + """The :class:`~pymongo.collection.Collection` that this + :class:`Cursor` is iterating. + """ + return self.__collection + + @property + def retrieved(self): + """The number of documents retrieved so far. + """ + return self.__retrieved + + def __del__(self): + self.__die() + + def rewind(self): + """Rewind this cursor to its unevaluated state. + + Reset this cursor if it has been partially or completely evaluated. + Any options that are present on the cursor will remain in effect. + Future iterating performed on this cursor will cause new queries to + be sent to the server, even if the resultant data has already been + retrieved by this cursor. + """ + self.__data = deque() + self.__id = None + self.__address = None + self.__retrieved = 0 + self.__killed = False + + return self + + def clone(self): + """Get a clone of this cursor. + + Returns a new Cursor instance with options matching those that have + been set on the current instance. The clone will be completely + unevaluated, even if the current instance has been partially or + completely evaluated. + """ + return self._clone(True) + + def _clone(self, deepcopy=True, base=None): + """Internal clone helper.""" + if not base: + if self.__explicit_session: + base = self._clone_base(self.__session) + else: + base = self._clone_base(None) + + values_to_clone = ("spec", "projection", "skip", "limit", + "max_time_ms", "max_await_time_ms", "comment", + "max", "min", "ordering", "explain", "hint", + "batch_size", "max_scan", "manipulate", + "query_flags", "modifiers", "collation") + data = dict((k, v) for k, v in iteritems(self.__dict__) + if k.startswith('_Cursor__') and k[9:] in values_to_clone) + if deepcopy: + data = self._deepcopy(data) + base.__dict__.update(data) + return base + + def _clone_base(self, session): + """Creates an empty Cursor object for information to be copied into. + """ + return self.__class__(self.__collection, session=session) + + def __die(self, synchronous=False): + """Closes this cursor. + """ + already_killed = self.__killed + self.__killed = True + if self.__id and not already_killed: + if self.__exhaust and self.__exhaust_mgr: + # If this is an exhaust cursor and we haven't completely + # exhausted the result set we *must* close the socket + # to stop the server from sending more data. + self.__exhaust_mgr.sock.close() + else: + address = _CursorAddress( + self.__address, self.__collection.full_name) + if synchronous: + self.__collection.database.client._close_cursor_now( + self.__id, address, session=self.__session) + else: + # The cursor will be closed later in a different session. + self.__collection.database.client._close_cursor( + self.__id, address) + if self.__exhaust and self.__exhaust_mgr: + self.__exhaust_mgr.close() + if self.__session and not self.__explicit_session: + self.__session._end_session(lock=synchronous) + self.__session = None + + def close(self): + """Explicitly close / kill this cursor. + """ + self.__die(True) + + def __query_spec(self): + """Get the spec to use for a query. + """ + operators = self.__modifiers.copy() + if self.__ordering: + operators["$orderby"] = self.__ordering + if self.__explain: + operators["$explain"] = True + if self.__hint: + operators["$hint"] = self.__hint + if self.__comment: + operators["$comment"] = self.__comment + if self.__max_scan: + operators["$maxScan"] = self.__max_scan + if self.__max_time_ms is not None: + operators["$maxTimeMS"] = self.__max_time_ms + if self.__max: + operators["$max"] = self.__max + if self.__min: + operators["$min"] = self.__min + if self.__return_key: + operators["$returnKey"] = self.__return_key + if self.__show_record_id: + # This is upgraded to showRecordId for MongoDB 3.2+ "find" command. + operators["$showDiskLoc"] = self.__show_record_id + if self.__snapshot: + operators["$snapshot"] = self.__snapshot + + if operators: + # Make a shallow copy so we can cleanly rewind or clone. + spec = self.__spec.copy() + + # White-listed commands must be wrapped in $query. + if "$query" not in spec: + # $query has to come first + spec = SON([("$query", spec)]) + + if not isinstance(spec, SON): + # Ensure the spec is SON. As order is important this will + # ensure its set before merging in any extra operators. + spec = SON(spec) + + spec.update(operators) + return spec + # Have to wrap with $query if "query" is the first key. + # We can't just use $query anytime "query" is a key as + # that breaks commands like count and find_and_modify. + # Checking spec.keys()[0] covers the case that the spec + # was passed as an instance of SON or OrderedDict. + elif ("query" in self.__spec and + (len(self.__spec) == 1 or + next(iter(self.__spec)) == "query")): + return SON({"$query": self.__spec}) + + return self.__spec + + def __check_okay_to_chain(self): + """Check if it is okay to chain more options onto this cursor. + """ + if self.__retrieved or self.__id is not None: + raise InvalidOperation("cannot set options after executing query") + + def add_option(self, mask): + """Set arbitrary query flags using a bitmask. + + To set the tailable flag: + cursor.add_option(2) + """ + if not isinstance(mask, int): + raise TypeError("mask must be an int") + self.__check_okay_to_chain() + + if mask & _QUERY_OPTIONS["exhaust"]: + if self.__limit: + raise InvalidOperation("Can't use limit and exhaust together.") + if self.__collection.database.client.is_mongos: + raise InvalidOperation('Exhaust cursors are ' + 'not supported by mongos') + self.__exhaust = True + + self.__query_flags |= mask + return self + + def remove_option(self, mask): + """Unset arbitrary query flags using a bitmask. + + To unset the tailable flag: + cursor.remove_option(2) + """ + if not isinstance(mask, int): + raise TypeError("mask must be an int") + self.__check_okay_to_chain() + + if mask & _QUERY_OPTIONS["exhaust"]: + self.__exhaust = False + + self.__query_flags &= ~mask + return self + + def limit(self, limit): + """Limits the number of results to be returned by this cursor. + + Raises :exc:`TypeError` if `limit` is not an integer. Raises + :exc:`~pymongo.errors.InvalidOperation` if this :class:`Cursor` + has already been used. The last `limit` applied to this cursor + takes precedence. A limit of ``0`` is equivalent to no limit. + + :Parameters: + - `limit`: the number of results to return + + .. mongodoc:: limit + """ + if not isinstance(limit, integer_types): + raise TypeError("limit must be an integer") + if self.__exhaust: + raise InvalidOperation("Can't use limit and exhaust together.") + self.__check_okay_to_chain() + + self.__empty = False + self.__limit = limit + return self + + def batch_size(self, batch_size): + """Limits the number of documents returned in one batch. Each batch + requires a round trip to the server. It can be adjusted to optimize + performance and limit data transfer. + + .. note:: batch_size can not override MongoDB's internal limits on the + amount of data it will return to the client in a single batch (i.e + if you set batch size to 1,000,000,000, MongoDB will currently only + return 4-16MB of results per batch). + + Raises :exc:`TypeError` if `batch_size` is not an integer. + Raises :exc:`ValueError` if `batch_size` is less than ``0``. + Raises :exc:`~pymongo.errors.InvalidOperation` if this + :class:`Cursor` has already been used. The last `batch_size` + applied to this cursor takes precedence. + + :Parameters: + - `batch_size`: The size of each batch of results requested. + """ + if not isinstance(batch_size, integer_types): + raise TypeError("batch_size must be an integer") + if batch_size < 0: + raise ValueError("batch_size must be >= 0") + self.__check_okay_to_chain() + + self.__batch_size = batch_size + return self + + def skip(self, skip): + """Skips the first `skip` results of this cursor. + + Raises :exc:`TypeError` if `skip` is not an integer. Raises + :exc:`ValueError` if `skip` is less than ``0``. Raises + :exc:`~pymongo.errors.InvalidOperation` if this :class:`Cursor` has + already been used. The last `skip` applied to this cursor takes + precedence. + + :Parameters: + - `skip`: the number of results to skip + """ + if not isinstance(skip, integer_types): + raise TypeError("skip must be an integer") + if skip < 0: + raise ValueError("skip must be >= 0") + self.__check_okay_to_chain() + + self.__skip = skip + return self + + def max_time_ms(self, max_time_ms): + """Specifies a time limit for a query operation. If the specified + time is exceeded, the operation will be aborted and + :exc:`~pymongo.errors.ExecutionTimeout` is raised. If `max_time_ms` + is ``None`` no limit is applied. + + Raises :exc:`TypeError` if `max_time_ms` is not an integer or ``None``. + Raises :exc:`~pymongo.errors.InvalidOperation` if this :class:`Cursor` + has already been used. + + :Parameters: + - `max_time_ms`: the time limit after which the operation is aborted + """ + if (not isinstance(max_time_ms, integer_types) + and max_time_ms is not None): + raise TypeError("max_time_ms must be an integer or None") + self.__check_okay_to_chain() + + self.__max_time_ms = max_time_ms + return self + + def max_await_time_ms(self, max_await_time_ms): + """Specifies a time limit for a getMore operation on a + :attr:`~pymongo.cursor.CursorType.TAILABLE_AWAIT` cursor. For all other + types of cursor max_await_time_ms is ignored. + + Raises :exc:`TypeError` if `max_await_time_ms` is not an integer or + ``None``. Raises :exc:`~pymongo.errors.InvalidOperation` if this + :class:`Cursor` has already been used. + + .. note:: `max_await_time_ms` requires server version **>= 3.2** + + :Parameters: + - `max_await_time_ms`: the time limit after which the operation is + aborted + + .. versionadded:: 3.2 + """ + if (not isinstance(max_await_time_ms, integer_types) + and max_await_time_ms is not None): + raise TypeError("max_await_time_ms must be an integer or None") + self.__check_okay_to_chain() + + # Ignore max_await_time_ms if not tailable or await_data is False. + if self.__query_flags & CursorType.TAILABLE_AWAIT: + self.__max_await_time_ms = max_await_time_ms + + return self + + def __getitem__(self, index): + """Get a single document or a slice of documents from this cursor. + + Raises :class:`~pymongo.errors.InvalidOperation` if this + cursor has already been used. + + To get a single document use an integral index, e.g.:: + + >>> db.test.find()[50] + + An :class:`IndexError` will be raised if the index is negative + or greater than the amount of documents in this cursor. Any + limit previously applied to this cursor will be ignored. + + To get a slice of documents use a slice index, e.g.:: + + >>> db.test.find()[20:25] + + This will return this cursor with a limit of ``5`` and skip of + ``20`` applied. Using a slice index will override any prior + limits or skips applied to this cursor (including those + applied through previous calls to this method). Raises + :class:`IndexError` when the slice has a step, a negative + start value, or a stop value less than or equal to the start + value. + + :Parameters: + - `index`: An integer or slice index to be applied to this cursor + """ + self.__check_okay_to_chain() + self.__empty = False + if isinstance(index, slice): + if index.step is not None: + raise IndexError("Cursor instances do not support slice steps") + + skip = 0 + if index.start is not None: + if index.start < 0: + raise IndexError("Cursor instances do not support " + "negative indices") + skip = index.start + + if index.stop is not None: + limit = index.stop - skip + if limit < 0: + raise IndexError("stop index must be greater than start " + "index for slice %r" % index) + if limit == 0: + self.__empty = True + else: + limit = 0 + + self.__skip = skip + self.__limit = limit + return self + + if isinstance(index, integer_types): + if index < 0: + raise IndexError("Cursor instances do not support negative " + "indices") + clone = self.clone() + clone.skip(index + self.__skip) + clone.limit(-1) # use a hard limit + clone.__query_flags &= ~CursorType.TAILABLE_AWAIT # PYTHON-1371 + for doc in clone: + return doc + raise IndexError("no such item for Cursor instance") + raise TypeError("index %r cannot be applied to Cursor " + "instances" % index) + + def max_scan(self, max_scan): + """**DEPRECATED** - Limit the number of documents to scan when + performing the query. + + Raises :class:`~pymongo.errors.InvalidOperation` if this + cursor has already been used. Only the last :meth:`max_scan` + applied to this cursor has any effect. + + :Parameters: + - `max_scan`: the maximum number of documents to scan + + .. versionchanged:: 3.7 + Deprecated :meth:`max_scan`. Support for this option is deprecated in + MongoDB 4.0. Use :meth:`max_time_ms` instead to limit server side + execution time. + """ + self.__check_okay_to_chain() + self.__max_scan = max_scan + return self + + def max(self, spec): + """Adds ``max`` operator that specifies upper bound for specific index. + + When using ``max``, :meth:`~hint` should also be configured to ensure + the query uses the expected index and starting in MongoDB 4.2 + :meth:`~hint` will be required. + + :Parameters: + - `spec`: a list of field, limit pairs specifying the exclusive + upper bound for all keys of a specific index in order. + + .. versionchanged:: 3.8 + Deprecated cursors that use ``max`` without a :meth:`~hint`. + + .. versionadded:: 2.7 + """ + if not isinstance(spec, (list, tuple)): + raise TypeError("spec must be an instance of list or tuple") + + self.__check_okay_to_chain() + self.__max = SON(spec) + return self + + def min(self, spec): + """Adds ``min`` operator that specifies lower bound for specific index. + + When using ``min``, :meth:`~hint` should also be configured to ensure + the query uses the expected index and starting in MongoDB 4.2 + :meth:`~hint` will be required. + + :Parameters: + - `spec`: a list of field, limit pairs specifying the inclusive + lower bound for all keys of a specific index in order. + + .. versionchanged:: 3.8 + Deprecated cursors that use ``min`` without a :meth:`~hint`. + + .. versionadded:: 2.7 + """ + if not isinstance(spec, (list, tuple)): + raise TypeError("spec must be an instance of list or tuple") + + self.__check_okay_to_chain() + self.__min = SON(spec) + return self + + def sort(self, key_or_list, direction=None): + """Sorts this cursor's results. + + Pass a field name and a direction, either + :data:`~pymongo.ASCENDING` or :data:`~pymongo.DESCENDING`:: + + for doc in collection.find().sort('field', pymongo.ASCENDING): + print(doc) + + To sort by multiple fields, pass a list of (key, direction) pairs:: + + for doc in collection.find().sort([ + ('field1', pymongo.ASCENDING), + ('field2', pymongo.DESCENDING)]): + print(doc) + + Beginning with MongoDB version 2.6, text search results can be + sorted by relevance:: + + cursor = db.test.find( + {'$text': {'$search': 'some words'}}, + {'score': {'$meta': 'textScore'}}) + + # Sort by 'score' field. + cursor.sort([('score', {'$meta': 'textScore'})]) + + for doc in cursor: + print(doc) + + Raises :class:`~pymongo.errors.InvalidOperation` if this cursor has + already been used. Only the last :meth:`sort` applied to this + cursor has any effect. + + :Parameters: + - `key_or_list`: a single key or a list of (key, direction) + pairs specifying the keys to sort on + - `direction` (optional): only used if `key_or_list` is a single + key, if not given :data:`~pymongo.ASCENDING` is assumed + """ + self.__check_okay_to_chain() + keys = helpers._index_list(key_or_list, direction) + self.__ordering = helpers._index_document(keys) + return self + + def count(self, with_limit_and_skip=False): + """**DEPRECATED** - Get the size of the results set for this query. + + The :meth:`count` method is deprecated and **not** supported in a + transaction. Please use + :meth:`~pymongo.collection.Collection.count_documents` instead. + + Returns the number of documents in the results set for this query. Does + not take :meth:`limit` and :meth:`skip` into account by default - set + `with_limit_and_skip` to ``True`` if that is the desired behavior. + Raises :class:`~pymongo.errors.OperationFailure` on a database error. + + When used with MongoDB >= 2.6, :meth:`~count` uses any :meth:`~hint` + applied to the query. In the following example the hint is passed to + the count command: + + collection.find({'field': 'value'}).hint('field_1').count() + + The :meth:`count` method obeys the + :attr:`~pymongo.collection.Collection.read_preference` of the + :class:`~pymongo.collection.Collection` instance on which + :meth:`~pymongo.collection.Collection.find` was called. + + :Parameters: + - `with_limit_and_skip` (optional): take any :meth:`limit` or + :meth:`skip` that has been applied to this cursor into account when + getting the count + + .. note:: The `with_limit_and_skip` parameter requires server + version **>= 1.1.4-** + + .. versionchanged:: 3.7 + Deprecated. + + .. versionchanged:: 2.8 + The :meth:`~count` method now supports :meth:`~hint`. + """ + warnings.warn("count is deprecated. Use Collection.count_documents " + "instead.", DeprecationWarning, stacklevel=2) + validate_boolean("with_limit_and_skip", with_limit_and_skip) + cmd = SON([("count", self.__collection.name), + ("query", self.__spec)]) + if self.__max_time_ms is not None: + cmd["maxTimeMS"] = self.__max_time_ms + if self.__comment: + cmd["comment"] = self.__comment + + if self.__hint is not None: + cmd["hint"] = self.__hint + + if with_limit_and_skip: + if self.__limit: + cmd["limit"] = self.__limit + if self.__skip: + cmd["skip"] = self.__skip + + return self.__collection._count( + cmd, self.__collation, session=self.__session) + + def distinct(self, key): + """Get a list of distinct values for `key` among all documents + in the result set of this query. + + Raises :class:`TypeError` if `key` is not an instance of + :class:`basestring` (:class:`str` in python 3). + + The :meth:`distinct` method obeys the + :attr:`~pymongo.collection.Collection.read_preference` of the + :class:`~pymongo.collection.Collection` instance on which + :meth:`~pymongo.collection.Collection.find` was called. + + :Parameters: + - `key`: name of key for which we want to get the distinct values + + .. seealso:: :meth:`pymongo.collection.Collection.distinct` + """ + options = {} + if self.__spec: + options["query"] = self.__spec + if self.__max_time_ms is not None: + options['maxTimeMS'] = self.__max_time_ms + if self.__comment: + options['comment'] = self.__comment + if self.__collation is not None: + options['collation'] = self.__collation + + return self.__collection.distinct( + key, session=self.__session, **options) + + def explain(self): + """Returns an explain plan record for this cursor. + + .. note:: Starting with MongoDB 3.2 :meth:`explain` uses + the default verbosity mode of the `explain command + <https://docs.mongodb.com/manual/reference/command/explain/>`_, + ``allPlansExecution``. To use a different verbosity use + :meth:`~pymongo.database.Database.command` to run the explain + command directly. + + .. mongodoc:: explain + """ + c = self.clone() + c.__explain = True + + # always use a hard limit for explains + if c.__limit: + c.__limit = -abs(c.__limit) + return next(c) + + def __set_hint(self, index): + if index is None: + self.__hint = None + return + + if isinstance(index, string_type): + self.__hint = index + else: + self.__hint = helpers._index_document(index) + + def hint(self, index): + """Adds a 'hint', telling Mongo the proper index to use for the query. + + Judicious use of hints can greatly improve query + performance. When doing a query on multiple fields (at least + one of which is indexed) pass the indexed field as a hint to + the query. Raises :class:`~pymongo.errors.OperationFailure` if the + provided hint requires an index that does not exist on this collection, + and raises :class:`~pymongo.errors.InvalidOperation` if this cursor has + already been used. + + `index` should be an index as passed to + :meth:`~pymongo.collection.Collection.create_index` + (e.g. ``[('field', ASCENDING)]``) or the name of the index. + If `index` is ``None`` any existing hint for this query is + cleared. The last hint applied to this cursor takes precedence + over all others. + + :Parameters: + - `index`: index to hint on (as an index specifier) + + .. versionchanged:: 2.8 + The :meth:`~hint` method accepts the name of the index. + """ + self.__check_okay_to_chain() + self.__set_hint(index) + return self + + def comment(self, comment): + """Adds a 'comment' to the cursor. + + http://docs.mongodb.org/manual/reference/operator/comment/ + + :Parameters: + - `comment`: A string to attach to the query to help interpret and + trace the operation in the server logs and in profile data. + + .. versionadded:: 2.7 + """ + self.__check_okay_to_chain() + self.__comment = comment + return self + + def where(self, code): + """Adds a $where clause to this query. + + The `code` argument must be an instance of :class:`basestring` + (:class:`str` in python 3) or :class:`~bson.code.Code` + containing a JavaScript expression. This expression will be + evaluated for each document scanned. Only those documents + for which the expression evaluates to *true* will be returned + as results. The keyword *this* refers to the object currently + being scanned. + + Raises :class:`TypeError` if `code` is not an instance of + :class:`basestring` (:class:`str` in python 3). Raises + :class:`~pymongo.errors.InvalidOperation` if this + :class:`Cursor` has already been used. Only the last call to + :meth:`where` applied to a :class:`Cursor` has any effect. + + :Parameters: + - `code`: JavaScript expression to use as a filter + """ + self.__check_okay_to_chain() + if not isinstance(code, Code): + code = Code(code) + + self.__spec["$where"] = code + return self + + def collation(self, collation): + """Adds a :class:`~pymongo.collation.Collation` to this query. + + This option is only supported on MongoDB 3.4 and above. + + Raises :exc:`TypeError` if `collation` is not an instance of + :class:`~pymongo.collation.Collation` or a ``dict``. Raises + :exc:`~pymongo.errors.InvalidOperation` if this :class:`Cursor` has + already been used. Only the last collation applied to this cursor has + any effect. + + :Parameters: + - `collation`: An instance of :class:`~pymongo.collation.Collation`. + """ + self.__check_okay_to_chain() + self.__collation = validate_collation_or_none(collation) + return self + + def __send_message(self, operation): + """Send a query or getmore operation and handles the response. + + If operation is ``None`` this is an exhaust cursor, which reads + the next result batch off the exhaust socket instead of + sending getMore messages to the server. + + Can raise ConnectionFailure. + """ + client = self.__collection.database.client + listeners = client._event_listeners + publish = listeners.enabled_for_commands + from_command = False + start = datetime.datetime.now() + + def duration(): return datetime.datetime.now() - start + + if operation: + try: + response = client._send_message_with_response( + operation, exhaust=self.__exhaust, address=self.__address) + self.__address = response.address + if self.__exhaust: + # 'response' is an ExhaustResponse. + self.__exhaust_mgr = _SocketManager(response.socket_info, + response.pool) + + cmd_name = operation.name + reply = response.data + rqst_id = response.request_id + from_command = response.from_command + except AutoReconnect: + # Don't try to send kill cursors on another socket + # or to another server. It can cause a _pinValue + # assertion on some server releases if we get here + # due to a socket timeout. + self.__killed = True + self.__die() + raise + else: + # Exhaust cursor - no getMore message. + rqst_id = 0 + cmd_name = 'getMore' + if publish: + # Fake a getMore command. + cmd = SON([('getMore', self.__id), + ('collection', self.__collection.name)]) + if self.__batch_size: + cmd['batchSize'] = self.__batch_size + if self.__max_time_ms: + cmd['maxTimeMS'] = self.__max_time_ms + listeners.publish_command_start( + cmd, self.__collection.database.name, 0, self.__address) + try: + reply = self.__exhaust_mgr.sock.receive_message(None) + except Exception as exc: + if publish: + listeners.publish_command_failure( + duration(), _convert_exception(exc), cmd_name, rqst_id, + self.__address) + if isinstance(exc, ConnectionFailure): + self.__die() + raise + + try: + user_fields = None + legacy_response = True + if from_command: + user_fields = _CURSOR_DOC_FIELDS + legacy_response = False + docs = self._unpack_response( + reply, self.__id, self.__collection.codec_options, + legacy_response=legacy_response, user_fields=user_fields) + if from_command: + first = docs[0] + client._receive_cluster_time(first, self.__session) + helpers._check_command_response(first) + except OperationFailure as exc: + self.__killed = True + + # Make sure exhaust socket is returned immediately, if necessary. + self.__die() + + if publish: + listeners.publish_command_failure( + duration(), exc.details, cmd_name, rqst_id, self.__address) + + # If this is a tailable cursor the error is likely + # due to capped collection roll over. Setting + # self.__killed to True ensures Cursor.alive will be + # False. No need to re-raise. + if self.__query_flags & _QUERY_OPTIONS["tailable_cursor"]: + return + raise + except NotMasterError as exc: + # Don't send kill cursors to another server after a "not master" + # error. It's completely pointless. + self.__killed = True + + # Make sure exhaust socket is returned immediately, if necessary. + self.__die() + + if publish: + listeners.publish_command_failure( + duration(), exc.details, cmd_name, rqst_id, self.__address) + + client._reset_server_and_request_check(self.__address) + raise + except Exception as exc: + if publish: + listeners.publish_command_failure( + duration(), _convert_exception(exc), cmd_name, rqst_id, + self.__address) + raise + + if publish: + # Must publish in find / getMore / explain command response format. + if from_command: + res = docs[0] + elif cmd_name == "explain": + res = docs[0] if docs else {} + else: + res = {"cursor": {"id": reply.cursor_id, + "ns": self.__collection.full_name}, + "ok": 1} + if cmd_name == "find": + res["cursor"]["firstBatch"] = docs + else: + res["cursor"]["nextBatch"] = docs + listeners.publish_command_success( + duration(), res, cmd_name, rqst_id, self.__address) + + if from_command: + if cmd_name != "explain": + cursor = docs[0]['cursor'] + self.__id = cursor['id'] + if cmd_name == 'find': + documents = cursor['firstBatch'] + else: + documents = cursor['nextBatch'] + self.__data = deque(documents) + self.__retrieved += len(documents) + else: + self.__id = 0 + self.__data = deque(docs) + self.__retrieved += len(docs) + else: + self.__id = reply.cursor_id + self.__data = deque(docs) + self.__retrieved += reply.number_returned + + if self.__id == 0: + self.__killed = True + # Don't wait for garbage collection to call __del__, return the + # socket and the session to the pool now. + self.__die() + + if self.__limit and self.__id and self.__limit <= self.__retrieved: + self.__die() + + def _unpack_response(self, response, cursor_id, codec_options, + user_fields=None, legacy_response=False): + return response.unpack_response(cursor_id, codec_options, user_fields, + legacy_response) + + def _read_preference(self): + if self.__read_preference is None: + # Save the read preference for getMore commands. + self.__read_preference = self.__collection._read_preference_for( + self.session) + return self.__read_preference + + def _refresh(self): + """Refreshes the cursor with more data from Mongo. + + Returns the length of self.__data after refresh. Will exit early if + self.__data is already non-empty. Raises OperationFailure when the + cursor cannot be refreshed due to an error on the query. + """ + if len(self.__data) or self.__killed: + return len(self.__data) + + if not self.__session: + self.__session = self.__collection.database.client._ensure_session() + + if self.__id is None: # Query + if (self.__min or self.__max) and not self.__hint: + warnings.warn("using a min/max query operator without " + "specifying a Cursor.hint is deprecated. A " + "hint will be required when using min/max in " + "PyMongo 4.0", + DeprecationWarning, stacklevel=3) + q = self._query_class(self.__query_flags, + self.__collection.database.name, + self.__collection.name, + self.__skip, + self.__query_spec(), + self.__projection, + self.__codec_options, + self._read_preference(), + self.__limit, + self.__batch_size, + self.__read_concern, + self.__collation, + self.__session, + self.__collection.database.client) + self.__send_message(q) + elif self.__id: # Get More + if self.__limit: + limit = self.__limit - self.__retrieved + if self.__batch_size: + limit = min(limit, self.__batch_size) + else: + limit = self.__batch_size + + # Exhaust cursors don't send getMore messages. + if self.__exhaust: + self.__send_message(None) + else: + g = self._getmore_class(self.__collection.database.name, + self.__collection.name, + limit, + self.__id, + self.__codec_options, + self._read_preference(), + self.__session, + self.__collection.database.client, + self.__max_await_time_ms) + self.__send_message(g) + + return len(self.__data) + + @property + def alive(self): + """Does this cursor have the potential to return more data? + + This is mostly useful with `tailable cursors + <http://www.mongodb.org/display/DOCS/Tailable+Cursors>`_ + since they will stop iterating even though they *may* return more + results in the future. + + With regular cursors, simply use a for loop instead of :attr:`alive`:: + + for doc in collection.find(): + print(doc) + + .. note:: Even if :attr:`alive` is True, :meth:`next` can raise + :exc:`StopIteration`. :attr:`alive` can also be True while iterating + a cursor from a failed server. In this case :attr:`alive` will + return False after :meth:`next` fails to retrieve the next batch + of results from the server. + """ + return bool(len(self.__data) or (not self.__killed)) + + @property + def cursor_id(self): + """Returns the id of the cursor + + Useful if you need to manage cursor ids and want to handle killing + cursors manually using + :meth:`~pymongo.mongo_client.MongoClient.kill_cursors` + + .. versionadded:: 2.2 + """ + return self.__id + + @property + def address(self): + """The (host, port) of the server used, or None. + + .. versionchanged:: 3.0 + Renamed from "conn_id". + """ + return self.__address + + @property + def session(self): + """The cursor's :class:`~pymongo.client_session.ClientSession`, or None. + + .. versionadded:: 3.6 + """ + if self.__explicit_session: + return self.__session + + def __iter__(self): + return self + + def next(self): + """Advance the cursor.""" + if self.__empty: + raise StopIteration + if len(self.__data) or self._refresh(): + if self.__manipulate: + _db = self.__collection.database + return _db._fix_outgoing(self.__data.popleft(), + self.__collection) + else: + return self.__data.popleft() + else: + raise StopIteration + + __next__ = next + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + + def __copy__(self): + """Support function for `copy.copy()`. + + .. versionadded:: 2.4 + """ + return self._clone(deepcopy=False) + + def __deepcopy__(self, memo): + """Support function for `copy.deepcopy()`. + + .. versionadded:: 2.4 + """ + return self._clone(deepcopy=True) + + def _deepcopy(self, x, memo=None): + """Deepcopy helper for the data dictionary or list. + + Regular expressions cannot be deep copied but as they are immutable we + don't have to copy them when cloning. + """ + if not hasattr(x, 'items'): + y, is_list, iterator = [], True, enumerate(x) + else: + y, is_list, iterator = {}, False, iteritems(x) + + if memo is None: + memo = {} + val_id = id(x) + if val_id in memo: + return memo.get(val_id) + memo[val_id] = y + + for key, value in iterator: + if isinstance(value, (dict, list)) and not isinstance(value, SON): + value = self._deepcopy(value, memo) + elif not isinstance(value, RE_TYPE): + value = copy.deepcopy(value, memo) + + if is_list: + y.append(value) + else: + if not isinstance(key, RE_TYPE): + key = copy.deepcopy(key, memo) + y[key] = value + return y + + +class RawBatchCursor(Cursor): + """A cursor / iterator over raw batches of BSON data from a query result.""" + + _query_class = _RawBatchQuery + _getmore_class = _RawBatchGetMore + + def __init__(self, *args, **kwargs): + """Create a new cursor / iterator over raw batches of BSON data. + + Should not be called directly by application developers - + see :meth:`~pymongo.collection.Collection.find_raw_batches` + instead. + + .. mongodoc:: cursors + """ + manipulate = kwargs.get('manipulate') + kwargs['manipulate'] = False + super(RawBatchCursor, self).__init__(*args, **kwargs) + + # Throw only after cursor's initialized, to prevent errors in __del__. + if manipulate: + raise InvalidOperation( + "Cannot use RawBatchCursor with manipulate=True") + + def _unpack_response(self, response, cursor_id, codec_options, + user_fields=None, legacy_response=False): + return response.raw_response(cursor_id) + + def explain(self): + """Returns an explain plan record for this cursor. + + .. mongodoc:: explain + """ + clone = self._clone(deepcopy=True, base=Cursor(self.collection)) + return clone.explain() + + def __getitem__(self, index): + raise InvalidOperation("Cannot call __getitem__ on RawBatchCursor") diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/cursor_manager.py b/mongo_mac/lib/python3.6/site-packages/pymongo/cursor_manager.py new file mode 100644 index 0000000..c05cf30 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/cursor_manager.py @@ -0,0 +1,65 @@ +# Copyright 2009-present MongoDB, Inc. +# +# 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. + +"""DEPRECATED - A manager to handle when cursors are killed after they are +closed. + +New cursor managers should be defined as subclasses of CursorManager and can be +installed on a client by calling +:meth:`~pymongo.mongo_client.MongoClient.set_cursor_manager`. + +.. versionchanged:: 3.3 + Deprecated, for real this time. + +.. versionchanged:: 3.0 + Undeprecated. :meth:`~pymongo.cursor_manager.CursorManager.close` now + requires an `address` argument. The ``BatchCursorManager`` class is removed. +""" + +import warnings +import weakref +from bson.py3compat import integer_types + + +class CursorManager(object): + """DEPRECATED - The cursor manager base class.""" + + def __init__(self, client): + """Instantiate the manager. + + :Parameters: + - `client`: a MongoClient + """ + warnings.warn( + "Cursor managers are deprecated.", + DeprecationWarning, + stacklevel=2) + self.__client = weakref.ref(client) + + def close(self, cursor_id, address): + """Kill a cursor. + + Raises TypeError if cursor_id is not an instance of (int, long). + + :Parameters: + - `cursor_id`: cursor id to close + - `address`: the cursor's server's (host, port) pair + + .. versionchanged:: 3.0 + Now requires an `address` argument. + """ + if not isinstance(cursor_id, integer_types): + raise TypeError("cursor_id must be an integer") + + self.__client().kill_cursors([cursor_id], address) diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/database.py b/mongo_mac/lib/python3.6/site-packages/pymongo/database.py new file mode 100644 index 0000000..c4f7f47 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/database.py @@ -0,0 +1,1465 @@ +# Copyright 2009-present MongoDB, Inc. +# +# 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. + +"""Database level operations.""" + +import warnings + +from bson.code import Code +from bson.codec_options import DEFAULT_CODEC_OPTIONS +from bson.dbref import DBRef +from bson.py3compat import iteritems, string_type, _unicode +from bson.son import SON +from pymongo import auth, common +from pymongo.change_stream import DatabaseChangeStream +from pymongo.collection import Collection +from pymongo.command_cursor import CommandCursor +from pymongo.errors import (CollectionInvalid, + ConfigurationError, + InvalidName, + OperationFailure) +from pymongo.message import _first_batch +from pymongo.read_preferences import ReadPreference +from pymongo.son_manipulator import SONManipulator +from pymongo.write_concern import DEFAULT_WRITE_CONCERN + + +_INDEX_REGEX = {"name": {"$regex": r"^(?!.*\$)"}} +_SYSTEM_FILTER = {"filter": {"name": {"$regex": r"^(?!system\.)"}}} + + +def _check_name(name): + """Check if a database name is valid. + """ + if not name: + raise InvalidName("database name cannot be the empty string") + + for invalid_char in [' ', '.', '$', '/', '\\', '\x00', '"']: + if invalid_char in name: + raise InvalidName("database names cannot contain the " + "character %r" % invalid_char) + + +class Database(common.BaseObject): + """A Mongo database. + """ + + def __init__(self, client, name, codec_options=None, read_preference=None, + write_concern=None, read_concern=None): + """Get a database by client and name. + + Raises :class:`TypeError` if `name` is not an instance of + :class:`basestring` (:class:`str` in python 3). Raises + :class:`~pymongo.errors.InvalidName` if `name` is not a valid + database name. + + :Parameters: + - `client`: A :class:`~pymongo.mongo_client.MongoClient` instance. + - `name`: The database name. + - `codec_options` (optional): An instance of + :class:`~bson.codec_options.CodecOptions`. If ``None`` (the + default) client.codec_options is used. + - `read_preference` (optional): The read preference to use. If + ``None`` (the default) client.read_preference is used. + - `write_concern` (optional): An instance of + :class:`~pymongo.write_concern.WriteConcern`. If ``None`` (the + default) client.write_concern is used. + - `read_concern` (optional): An instance of + :class:`~pymongo.read_concern.ReadConcern`. If ``None`` (the + default) client.read_concern is used. + + .. mongodoc:: databases + + .. versionchanged:: 3.2 + Added the read_concern option. + + .. versionchanged:: 3.0 + Added the codec_options, read_preference, and write_concern options. + :class:`~pymongo.database.Database` no longer returns an instance + of :class:`~pymongo.collection.Collection` for attribute names + with leading underscores. You must use dict-style lookups instead:: + + db['__my_collection__'] + + Not: + + db.__my_collection__ + """ + super(Database, self).__init__( + codec_options or client.codec_options, + read_preference or client.read_preference, + write_concern or client.write_concern, + read_concern or client.read_concern) + + if not isinstance(name, string_type): + raise TypeError("name must be an instance " + "of %s" % (string_type.__name__,)) + + if name != '$external': + _check_name(name) + + self.__name = _unicode(name) + self.__client = client + + self.__incoming_manipulators = [] + self.__incoming_copying_manipulators = [] + self.__outgoing_manipulators = [] + self.__outgoing_copying_manipulators = [] + + def add_son_manipulator(self, manipulator): + """Add a new son manipulator to this database. + + **DEPRECATED** - `add_son_manipulator` is deprecated. + + .. versionchanged:: 3.0 + Deprecated add_son_manipulator. + """ + warnings.warn("add_son_manipulator is deprecated", + DeprecationWarning, stacklevel=2) + base = SONManipulator() + def method_overwritten(instance, method): + """Test if this method has been overridden.""" + return (getattr( + instance, method).__func__ != getattr(base, method).__func__) + + if manipulator.will_copy(): + if method_overwritten(manipulator, "transform_incoming"): + self.__incoming_copying_manipulators.insert(0, manipulator) + if method_overwritten(manipulator, "transform_outgoing"): + self.__outgoing_copying_manipulators.insert(0, manipulator) + else: + if method_overwritten(manipulator, "transform_incoming"): + self.__incoming_manipulators.insert(0, manipulator) + if method_overwritten(manipulator, "transform_outgoing"): + self.__outgoing_manipulators.insert(0, manipulator) + + @property + def system_js(self): + """**DEPRECATED**: :class:`SystemJS` helper for this :class:`Database`. + + See the documentation for :class:`SystemJS` for more details. + """ + return SystemJS(self) + + @property + def client(self): + """The client instance for this :class:`Database`.""" + return self.__client + + @property + def name(self): + """The name of this :class:`Database`.""" + return self.__name + + @property + def incoming_manipulators(self): + """**DEPRECATED**: All incoming SON manipulators. + + .. versionchanged:: 3.5 + Deprecated. + + .. versionadded:: 2.0 + """ + warnings.warn("Database.incoming_manipulators() is deprecated", + DeprecationWarning, stacklevel=2) + + return [manipulator.__class__.__name__ + for manipulator in self.__incoming_manipulators] + + @property + def incoming_copying_manipulators(self): + """**DEPRECATED**: All incoming SON copying manipulators. + + .. versionchanged:: 3.5 + Deprecated. + + .. versionadded:: 2.0 + """ + warnings.warn("Database.incoming_copying_manipulators() is deprecated", + DeprecationWarning, stacklevel=2) + + return [manipulator.__class__.__name__ + for manipulator in self.__incoming_copying_manipulators] + + @property + def outgoing_manipulators(self): + """**DEPRECATED**: All outgoing SON manipulators. + + .. versionchanged:: 3.5 + Deprecated. + + .. versionadded:: 2.0 + """ + warnings.warn("Database.outgoing_manipulators() is deprecated", + DeprecationWarning, stacklevel=2) + + return [manipulator.__class__.__name__ + for manipulator in self.__outgoing_manipulators] + + @property + def outgoing_copying_manipulators(self): + """**DEPRECATED**: All outgoing SON copying manipulators. + + .. versionchanged:: 3.5 + Deprecated. + + .. versionadded:: 2.0 + """ + warnings.warn("Database.outgoing_copying_manipulators() is deprecated", + DeprecationWarning, stacklevel=2) + + return [manipulator.__class__.__name__ + for manipulator in self.__outgoing_copying_manipulators] + + def with_options(self, codec_options=None, read_preference=None, + write_concern=None, read_concern=None): + """Get a clone of this database changing the specified settings. + + >>> db1.read_preference + Primary() + >>> from pymongo import ReadPreference + >>> db2 = db1.with_options(read_preference=ReadPreference.SECONDARY) + >>> db1.read_preference + Primary() + >>> db2.read_preference + Secondary(tag_sets=None) + + :Parameters: + - `codec_options` (optional): An instance of + :class:`~bson.codec_options.CodecOptions`. If ``None`` (the + default) the :attr:`codec_options` of this :class:`Collection` + is used. + - `read_preference` (optional): The read preference to use. If + ``None`` (the default) the :attr:`read_preference` of this + :class:`Collection` is used. See :mod:`~pymongo.read_preferences` + for options. + - `write_concern` (optional): An instance of + :class:`~pymongo.write_concern.WriteConcern`. If ``None`` (the + default) the :attr:`write_concern` of this :class:`Collection` + is used. + - `read_concern` (optional): An instance of + :class:`~pymongo.read_concern.ReadConcern`. If ``None`` (the + default) the :attr:`read_concern` of this :class:`Collection` + is used. + + .. versionadded:: 3.8 + """ + return Database(self.client, + self.__name, + codec_options or self.codec_options, + read_preference or self.read_preference, + write_concern or self.write_concern, + read_concern or self.read_concern) + + def __eq__(self, other): + if isinstance(other, Database): + return (self.__client == other.client and + self.__name == other.name) + return NotImplemented + + def __ne__(self, other): + return not self == other + + def __repr__(self): + return "Database(%r, %r)" % (self.__client, self.__name) + + def __getattr__(self, name): + """Get a collection of this database by name. + + Raises InvalidName if an invalid collection name is used. + + :Parameters: + - `name`: the name of the collection to get + """ + if name.startswith('_'): + raise AttributeError( + "Database has no attribute %r. To access the %s" + " collection, use database[%r]." % (name, name, name)) + return self.__getitem__(name) + + def __getitem__(self, name): + """Get a collection of this database by name. + + Raises InvalidName if an invalid collection name is used. + + :Parameters: + - `name`: the name of the collection to get + """ + return Collection(self, name) + + def get_collection(self, name, codec_options=None, read_preference=None, + write_concern=None, read_concern=None): + """Get a :class:`~pymongo.collection.Collection` with the given name + and options. + + Useful for creating a :class:`~pymongo.collection.Collection` with + different codec options, read preference, and/or write concern from + this :class:`Database`. + + >>> db.read_preference + Primary() + >>> coll1 = db.test + >>> coll1.read_preference + Primary() + >>> from pymongo import ReadPreference + >>> coll2 = db.get_collection( + ... 'test', read_preference=ReadPreference.SECONDARY) + >>> coll2.read_preference + Secondary(tag_sets=None) + + :Parameters: + - `name`: The name of the collection - a string. + - `codec_options` (optional): An instance of + :class:`~bson.codec_options.CodecOptions`. If ``None`` (the + default) the :attr:`codec_options` of this :class:`Database` is + used. + - `read_preference` (optional): The read preference to use. If + ``None`` (the default) the :attr:`read_preference` of this + :class:`Database` is used. See :mod:`~pymongo.read_preferences` + for options. + - `write_concern` (optional): An instance of + :class:`~pymongo.write_concern.WriteConcern`. If ``None`` (the + default) the :attr:`write_concern` of this :class:`Database` is + used. + - `read_concern` (optional): An instance of + :class:`~pymongo.read_concern.ReadConcern`. If ``None`` (the + default) the :attr:`read_concern` of this :class:`Database` is + used. + """ + return Collection( + self, name, False, codec_options, read_preference, + write_concern, read_concern) + + def create_collection(self, name, codec_options=None, + read_preference=None, write_concern=None, + read_concern=None, session=None, **kwargs): + """Create a new :class:`~pymongo.collection.Collection` in this + database. + + Normally collection creation is automatic. This method should + only be used to specify options on + creation. :class:`~pymongo.errors.CollectionInvalid` will be + raised if the collection already exists. + + Options should be passed as keyword arguments to this method. Supported + options vary with MongoDB release. Some examples include: + + - "size": desired initial size for the collection (in + bytes). For capped collections this size is the max + size of the collection. + - "capped": if True, this is a capped collection + - "max": maximum number of objects if capped (optional) + + See the MongoDB documentation for a full list of supported options by + server version. + + :Parameters: + - `name`: the name of the collection to create + - `codec_options` (optional): An instance of + :class:`~bson.codec_options.CodecOptions`. If ``None`` (the + default) the :attr:`codec_options` of this :class:`Database` is + used. + - `read_preference` (optional): The read preference to use. If + ``None`` (the default) the :attr:`read_preference` of this + :class:`Database` is used. + - `write_concern` (optional): An instance of + :class:`~pymongo.write_concern.WriteConcern`. If ``None`` (the + default) the :attr:`write_concern` of this :class:`Database` is + used. + - `read_concern` (optional): An instance of + :class:`~pymongo.read_concern.ReadConcern`. If ``None`` (the + default) the :attr:`read_concern` of this :class:`Database` is + used. + - `collation` (optional): An instance of + :class:`~pymongo.collation.Collation`. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs` (optional): additional keyword arguments will + be passed as options for the create collection command + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.4 + Added the collation option. + + .. versionchanged:: 3.0 + Added the codec_options, read_preference, and write_concern options. + + .. versionchanged:: 2.2 + Removed deprecated argument: options + """ + with self.__client._tmp_session(session) as s: + if name in self.list_collection_names( + filter={"name": name}, session=s): + raise CollectionInvalid("collection %s already exists" % name) + + return Collection(self, name, True, codec_options, + read_preference, write_concern, + read_concern, session=s, **kwargs) + + def _apply_incoming_manipulators(self, son, collection): + """Apply incoming manipulators to `son`.""" + for manipulator in self.__incoming_manipulators: + son = manipulator.transform_incoming(son, collection) + return son + + def _apply_incoming_copying_manipulators(self, son, collection): + """Apply incoming copying manipulators to `son`.""" + for manipulator in self.__incoming_copying_manipulators: + son = manipulator.transform_incoming(son, collection) + return son + + def _fix_incoming(self, son, collection): + """Apply manipulators to an incoming SON object before it gets stored. + + :Parameters: + - `son`: the son object going into the database + - `collection`: the collection the son object is being saved in + """ + son = self._apply_incoming_manipulators(son, collection) + son = self._apply_incoming_copying_manipulators(son, collection) + return son + + def _fix_outgoing(self, son, collection): + """Apply manipulators to a SON object as it comes out of the database. + + :Parameters: + - `son`: the son object coming out of the database + - `collection`: the collection the son object was saved in + """ + for manipulator in reversed(self.__outgoing_manipulators): + son = manipulator.transform_outgoing(son, collection) + for manipulator in reversed(self.__outgoing_copying_manipulators): + son = manipulator.transform_outgoing(son, collection) + return son + + def watch(self, pipeline=None, full_document='default', resume_after=None, + max_await_time_ms=None, batch_size=None, collation=None, + start_at_operation_time=None, session=None): + """Watch changes on this database. + + Performs an aggregation with an implicit initial ``$changeStream`` + stage and returns a + :class:`~pymongo.change_stream.DatabaseChangeStream` cursor which + iterates over changes on all collections in this database. + + Introduced in MongoDB 4.0. + + .. code-block:: python + + with db.watch() as stream: + for change in stream: + print(change) + + The :class:`~pymongo.change_stream.DatabaseChangeStream` iterable + blocks until the next change document is returned or an error is + raised. If the + :meth:`~pymongo.change_stream.DatabaseChangeStream.next` method + encounters a network error when retrieving a batch from the server, + it will automatically attempt to recreate the cursor such that no + change events are missed. Any error encountered during the resume + attempt indicates there may be an outage and will be raised. + + .. code-block:: python + + try: + with db.watch( + [{'$match': {'operationType': 'insert'}}]) as stream: + for insert_change in stream: + print(insert_change) + except pymongo.errors.PyMongoError: + # The ChangeStream encountered an unrecoverable error or the + # resume attempt failed to recreate the cursor. + logging.error('...') + + For a precise description of the resume process see the + `change streams specification`_. + + :Parameters: + - `pipeline` (optional): A list of aggregation pipeline stages to + append to an initial ``$changeStream`` stage. Not all + pipeline stages are valid after a ``$changeStream`` stage, see the + MongoDB documentation on change streams for the supported stages. + - `full_document` (optional): The fullDocument to pass as an option + to the ``$changeStream`` stage. Allowed values: 'default', + 'updateLookup'. Defaults to 'default'. + When set to 'updateLookup', the change notification for partial + updates will include both a delta describing the changes to the + document, as well as a copy of the entire document that was + changed from some time after the change occurred. + - `resume_after` (optional): The logical starting point for this + change stream. + - `max_await_time_ms` (optional): The maximum time in milliseconds + for the server to wait for changes before responding to a getMore + operation. + - `batch_size` (optional): The maximum number of documents to return + per batch. + - `collation` (optional): The :class:`~pymongo.collation.Collation` + to use for the aggregation. + - `start_at_operation_time` (optional): If provided, the resulting + change stream will only return changes that occurred at or after + the specified :class:`~bson.timestamp.Timestamp`. Requires + MongoDB >= 4.0. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + :Returns: + A :class:`~pymongo.change_stream.DatabaseChangeStream` cursor. + + .. versionadded:: 3.7 + + .. mongodoc:: changeStreams + + .. _change streams specification: + https://github.com/mongodb/specifications/blob/master/source/change-streams/change-streams.rst + """ + return DatabaseChangeStream( + self, pipeline, full_document, resume_after, max_await_time_ms, + batch_size, collation, start_at_operation_time, session + ) + + def _command(self, sock_info, command, slave_ok=False, value=1, check=True, + allowable_errors=None, read_preference=ReadPreference.PRIMARY, + codec_options=DEFAULT_CODEC_OPTIONS, + write_concern=None, + parse_write_concern_error=False, session=None, **kwargs): + """Internal command helper.""" + if isinstance(command, string_type): + command = SON([(command, value)]) + + command.update(kwargs) + with self.__client._tmp_session(session) as s: + return sock_info.command( + self.__name, + command, + slave_ok, + read_preference, + codec_options, + check, + allowable_errors, + write_concern=write_concern, + parse_write_concern_error=parse_write_concern_error, + session=s, + client=self.__client) + + def command(self, command, value=1, check=True, + allowable_errors=None, read_preference=None, + codec_options=DEFAULT_CODEC_OPTIONS, session=None, **kwargs): + """Issue a MongoDB command. + + Send command `command` to the database and return the + response. If `command` is an instance of :class:`basestring` + (:class:`str` in python 3) then the command {`command`: `value`} + will be sent. Otherwise, `command` must be an instance of + :class:`dict` and will be sent as is. + + Any additional keyword arguments will be added to the final + command document before it is sent. + + For example, a command like ``{buildinfo: 1}`` can be sent + using: + + >>> db.command("buildinfo") + + For a command where the value matters, like ``{collstats: + collection_name}`` we can do: + + >>> db.command("collstats", collection_name) + + For commands that take additional arguments we can use + kwargs. So ``{filemd5: object_id, root: file_root}`` becomes: + + >>> db.command("filemd5", object_id, root=file_root) + + :Parameters: + - `command`: document representing the command to be issued, + or the name of the command (for simple commands only). + + .. note:: the order of keys in the `command` document is + significant (the "verb" must come first), so commands + which require multiple keys (e.g. `findandmodify`) + should use an instance of :class:`~bson.son.SON` or + a string and kwargs instead of a Python `dict`. + + - `value` (optional): value to use for the command verb when + `command` is passed as a string + - `check` (optional): check the response for errors, raising + :class:`~pymongo.errors.OperationFailure` if there are any + - `allowable_errors`: if `check` is ``True``, error messages + in this list will be ignored by error-checking + - `read_preference` (optional): The read preference for this + operation. See :mod:`~pymongo.read_preferences` for options. + If the provided `session` is in a transaction, defaults to the + read preference configured for the transaction. + Otherwise, defaults to + :attr:`~pymongo.read_preferences.ReadPreference.PRIMARY`. + - `codec_options`: A :class:`~bson.codec_options.CodecOptions` + instance. + - `session` (optional): A + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs` (optional): additional keyword arguments will + be added to the command document before it is sent + + .. note:: :meth:`command` does **not** obey this Database's + :attr:`read_preference` or :attr:`codec_options`. You must use the + `read_preference` and `codec_options` parameters instead. + + .. note:: :meth:`command` does **not** apply any custom TypeDecoders + when decoding the command response. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.0 + Removed the `as_class`, `fields`, `uuid_subtype`, `tag_sets`, + and `secondary_acceptable_latency_ms` option. + Removed `compile_re` option: PyMongo now always represents BSON + regular expressions as :class:`~bson.regex.Regex` objects. Use + :meth:`~bson.regex.Regex.try_compile` to attempt to convert from a + BSON regular expression to a Python regular expression object. + Added the `codec_options` parameter. + + .. versionchanged:: 2.7 + Added `compile_re` option. If set to False, PyMongo represented BSON + regular expressions as :class:`~bson.regex.Regex` objects instead of + attempting to compile BSON regular expressions as Python native + regular expressions, thus preventing errors for some incompatible + patterns, see `PYTHON-500`_. + + .. versionchanged:: 2.3 + Added `tag_sets` and `secondary_acceptable_latency_ms` options. + .. versionchanged:: 2.2 + Added support for `as_class` - the class you want to use for + the resulting documents + + .. _PYTHON-500: https://jira.mongodb.org/browse/PYTHON-500 + + .. mongodoc:: commands + """ + if read_preference is None: + read_preference = ((session and session._txn_read_preference()) + or ReadPreference.PRIMARY) + with self.__client._socket_for_reads( + read_preference) as (sock_info, slave_ok): + return self._command(sock_info, command, slave_ok, value, + check, allowable_errors, read_preference, + codec_options, session=session, **kwargs) + + def _list_collections(self, sock_info, slave_okay, session, + read_preference, **kwargs): + """Internal listCollections helper.""" + + coll = self.get_collection( + "$cmd", read_preference=read_preference) + if sock_info.max_wire_version > 2: + cmd = SON([("listCollections", 1), + ("cursor", {})]) + cmd.update(kwargs) + with self.__client._tmp_session( + session, close=False) as tmp_session: + cursor = self._command( + sock_info, cmd, slave_okay, + read_preference=read_preference, + session=tmp_session)["cursor"] + return CommandCursor( + coll, + cursor, + sock_info.address, + session=tmp_session, + explicit_session=session is not None) + else: + match = _INDEX_REGEX + if "filter" in kwargs: + match = {"$and": [_INDEX_REGEX, kwargs["filter"]]} + dblen = len(self.name.encode("utf8") + b".") + pipeline = [ + {"$project": {"name": {"$substr": ["$name", dblen, -1]}, + "options": 1}}, + {"$match": match} + ] + cmd = SON([("aggregate", "system.namespaces"), + ("pipeline", pipeline), + ("cursor", kwargs.get("cursor", {}))]) + cursor = self._command(sock_info, cmd, slave_okay)["cursor"] + return CommandCursor(coll, cursor, sock_info.address) + + def list_collections(self, session=None, filter=None, **kwargs): + """Get a cursor over the collectons of this database. + + :Parameters: + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `filter` (optional): A query document to filter the list of + collections returned from the listCollections command. + - `**kwargs` (optional): Optional parameters of the + `listCollections command + <https://docs.mongodb.com/manual/reference/command/listCollections/>`_ + can be passed as keyword arguments to this method. The supported + options differ by server version. + + :Returns: + An instance of :class:`~pymongo.command_cursor.CommandCursor`. + + .. versionadded:: 3.6 + """ + if filter is not None: + kwargs['filter'] = filter + read_pref = ((session and session._txn_read_preference()) + or ReadPreference.PRIMARY) + with self.__client._socket_for_reads( + read_pref) as (sock_info, slave_okay): + return self._list_collections( + sock_info, slave_okay, session, read_preference=read_pref, + **kwargs) + + def list_collection_names(self, session=None, filter=None, **kwargs): + """Get a list of all the collection names in this database. + + For example, to list all non-system collections:: + + filter = {"name": {"$regex": r"^(?!system\.)"}} + db.list_collection_names(filter=filter) + + :Parameters: + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `filter` (optional): A query document to filter the list of + collections returned from the listCollections command. + - `**kwargs` (optional): Optional parameters of the + `listCollections command + <https://docs.mongodb.com/manual/reference/command/listCollections/>`_ + can be passed as keyword arguments to this method. The supported + options differ by server version. + + .. versionchanged:: 3.8 + Added the ``filter`` and ``**kwargs`` parameters. + + .. versionadded:: 3.6 + """ + if filter is None: + kwargs["nameOnly"] = True + else: + # The enumerate collections spec states that "drivers MUST NOT set + # nameOnly if a filter specifies any keys other than name." + common.validate_is_mapping("filter", filter) + kwargs["filter"] = filter + if not filter or (len(filter) == 1 and "name" in filter): + kwargs["nameOnly"] = True + + return [result["name"] + for result in self.list_collections(session=session, **kwargs)] + + def collection_names(self, include_system_collections=True, + session=None): + """**DEPRECATED**: Get a list of all the collection names in this + database. + + :Parameters: + - `include_system_collections` (optional): if ``False`` list + will not include system collections (e.g ``system.indexes``) + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + .. versionchanged:: 3.7 + Deprecated. Use :meth:`list_collection_names` instead. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + warnings.warn("collection_names is deprecated. Use " + "list_collection_names instead.", + DeprecationWarning, stacklevel=2) + kws = {} if include_system_collections else _SYSTEM_FILTER + return [result["name"] + for result in self.list_collections(session=session, + nameOnly=True, **kws)] + + def drop_collection(self, name_or_collection, session=None): + """Drop a collection. + + :Parameters: + - `name_or_collection`: the name of a collection to drop or the + collection object itself + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + .. note:: The :attr:`~pymongo.database.Database.write_concern` of + this database is automatically applied to this operation when using + MongoDB >= 3.4. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.4 + Apply this database's write concern automatically to this operation + when connected to MongoDB >= 3.4. + + """ + name = name_or_collection + if isinstance(name, Collection): + name = name.name + + if not isinstance(name, string_type): + raise TypeError("name_or_collection must be an " + "instance of %s" % (string_type.__name__,)) + + self.__client._purge_index(self.__name, name) + + with self.__client._socket_for_writes() as sock_info: + return self._command( + sock_info, 'drop', value=_unicode(name), + allowable_errors=['ns not found'], + write_concern=self._write_concern_for(session), + parse_write_concern_error=True, + session=session) + + def validate_collection(self, name_or_collection, + scandata=False, full=False, session=None): + """Validate a collection. + + Returns a dict of validation info. Raises CollectionInvalid if + validation fails. + + :Parameters: + - `name_or_collection`: A Collection object or the name of a + collection to validate. + - `scandata`: Do extra checks beyond checking the overall + structure of the collection. + - `full`: Have the server do a more thorough scan of the + collection. Use with `scandata` for a thorough scan + of the structure of the collection and the individual + documents. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + name = name_or_collection + if isinstance(name, Collection): + name = name.name + + if not isinstance(name, string_type): + raise TypeError("name_or_collection must be an instance of " + "%s or Collection" % (string_type.__name__,)) + + result = self.command("validate", _unicode(name), + scandata=scandata, full=full, session=session) + + valid = True + # Pre 1.9 results + if "result" in result: + info = result["result"] + if info.find("exception") != -1 or info.find("corrupt") != -1: + raise CollectionInvalid("%s invalid: %s" % (name, info)) + # Sharded results + elif "raw" in result: + for _, res in iteritems(result["raw"]): + if "result" in res: + info = res["result"] + if (info.find("exception") != -1 or + info.find("corrupt") != -1): + raise CollectionInvalid("%s invalid: " + "%s" % (name, info)) + elif not res.get("valid", False): + valid = False + break + # Post 1.9 non-sharded results. + elif not result.get("valid", False): + valid = False + + if not valid: + raise CollectionInvalid("%s invalid: %r" % (name, result)) + + return result + + def current_op(self, include_all=False, session=None): + """Get information on operations currently running. + + :Parameters: + - `include_all` (optional): if ``True`` also list currently + idle operations in the result + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + cmd = SON([("currentOp", 1), ("$all", include_all)]) + with self.__client._socket_for_writes() as sock_info: + if sock_info.max_wire_version >= 4: + return self.__client.admin._command( + sock_info, cmd, codec_options=self.codec_options, + session=session) + else: + spec = {"$all": True} if include_all else {} + return _first_batch(sock_info, "admin", "$cmd.sys.inprog", + spec, -1, True, self.codec_options, + ReadPreference.PRIMARY, cmd, + self.client._event_listeners) + + def profiling_level(self, session=None): + """Get the database's current profiling level. + + Returns one of (:data:`~pymongo.OFF`, + :data:`~pymongo.SLOW_ONLY`, :data:`~pymongo.ALL`). + + :Parameters: + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. mongodoc:: profiling + """ + result = self.command("profile", -1, session=session) + + assert result["was"] >= 0 and result["was"] <= 2 + return result["was"] + + def set_profiling_level(self, level, slow_ms=None, session=None): + """Set the database's profiling level. + + :Parameters: + - `level`: Specifies a profiling level, see list of possible values + below. + - `slow_ms`: Optionally modify the threshold for the profile to + consider a query or operation. Even if the profiler is off queries + slower than the `slow_ms` level will get written to the logs. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + Possible `level` values: + + +----------------------------+------------------------------------+ + | Level | Setting | + +============================+====================================+ + | :data:`~pymongo.OFF` | Off. No profiling. | + +----------------------------+------------------------------------+ + | :data:`~pymongo.SLOW_ONLY` | On. Only includes slow operations. | + +----------------------------+------------------------------------+ + | :data:`~pymongo.ALL` | On. Includes all operations. | + +----------------------------+------------------------------------+ + + Raises :class:`ValueError` if level is not one of + (:data:`~pymongo.OFF`, :data:`~pymongo.SLOW_ONLY`, + :data:`~pymongo.ALL`). + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. mongodoc:: profiling + """ + if not isinstance(level, int) or level < 0 or level > 2: + raise ValueError("level must be one of (OFF, SLOW_ONLY, ALL)") + + if slow_ms is not None and not isinstance(slow_ms, int): + raise TypeError("slow_ms must be an integer") + + if slow_ms is not None: + self.command("profile", level, slowms=slow_ms, session=session) + else: + self.command("profile", level, session=session) + + def profiling_info(self, session=None): + """Returns a list containing current profiling information. + + :Parameters: + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. mongodoc:: profiling + """ + return list(self["system.profile"].find(session=session)) + + def error(self): + """**DEPRECATED**: Get the error if one occurred on the last operation. + + This method is obsolete: all MongoDB write operations (insert, update, + remove, and so on) use the write concern ``w=1`` and report their + errors by default. + + .. versionchanged:: 2.8 + Deprecated. + """ + warnings.warn("Database.error() is deprecated", + DeprecationWarning, stacklevel=2) + + error = self.command("getlasterror") + error_msg = error.get("err", "") + if error_msg is None: + return None + if error_msg.startswith("not master"): + # Reset primary server and request check, if another thread isn't + # doing so already. + primary = self.__client.primary + if primary: + self.__client._reset_server_and_request_check(primary) + return error + + def last_status(self): + """**DEPRECATED**: Get status information from the last operation. + + This method is obsolete: all MongoDB write operations (insert, update, + remove, and so on) use the write concern ``w=1`` and report their + errors by default. + + Returns a SON object with status information. + + .. versionchanged:: 2.8 + Deprecated. + """ + warnings.warn("last_status() is deprecated", + DeprecationWarning, stacklevel=2) + + return self.command("getlasterror") + + def previous_error(self): + """**DEPRECATED**: Get the most recent error on this database. + + This method is obsolete: all MongoDB write operations (insert, update, + remove, and so on) use the write concern ``w=1`` and report their + errors by default. + + Only returns errors that have occurred since the last call to + :meth:`reset_error_history`. Returns None if no such errors have + occurred. + + .. versionchanged:: 2.8 + Deprecated. + """ + warnings.warn("previous_error() is deprecated", + DeprecationWarning, stacklevel=2) + + error = self.command("getpreverror") + if error.get("err", 0) is None: + return None + return error + + def reset_error_history(self): + """**DEPRECATED**: Reset the error history of this database. + + This method is obsolete: all MongoDB write operations (insert, update, + remove, and so on) use the write concern ``w=1`` and report their + errors by default. + + Calls to :meth:`previous_error` will only return errors that have + occurred since the most recent call to this method. + + .. versionchanged:: 2.8 + Deprecated. + """ + warnings.warn("reset_error_history() is deprecated", + DeprecationWarning, stacklevel=2) + + self.command("reseterror") + + def __iter__(self): + return self + + def __next__(self): + raise TypeError("'Database' object is not iterable") + + next = __next__ + + def _default_role(self, read_only): + """Return the default user role for this database.""" + if self.name == "admin": + if read_only: + return "readAnyDatabase" + else: + return "root" + else: + if read_only: + return "read" + else: + return "dbOwner" + + def _create_or_update_user( + self, create, name, password, read_only, session=None, **kwargs): + """Use a command to create (if create=True) or modify a user. + """ + opts = {} + if read_only or (create and "roles" not in kwargs): + warnings.warn("Creating a user with the read_only option " + "or without roles is deprecated in MongoDB " + ">= 2.6", DeprecationWarning) + + opts["roles"] = [self._default_role(read_only)] + + if read_only: + warnings.warn("The read_only option is deprecated in MongoDB " + ">= 2.6, use 'roles' instead", DeprecationWarning) + + if password is not None: + if "digestPassword" in kwargs: + raise ConfigurationError("The digestPassword option is not " + "supported via add_user. Please use " + "db.command('createUser', ...) " + "instead for this option.") + opts["pwd"] = password + + # Don't send {} as writeConcern. + if self.write_concern.acknowledged and self.write_concern.document: + opts["writeConcern"] = self.write_concern.document + opts.update(kwargs) + + if create: + command_name = "createUser" + else: + command_name = "updateUser" + + self.command(command_name, name, session=session, **opts) + + def add_user(self, name, password=None, read_only=None, session=None, + **kwargs): + """**DEPRECATED**: Create user `name` with password `password`. + + Add a new user with permissions for this :class:`Database`. + + .. note:: Will change the password if user `name` already exists. + + .. note:: add_user is deprecated and will be removed in PyMongo + 4.0. Starting with MongoDB 2.6 user management is handled with four + database commands, createUser_, usersInfo_, updateUser_, and + dropUser_. + + To create a user:: + + db.command("createUser", "admin", pwd="password", roles=["root"]) + + To create a read-only user:: + + db.command("createUser", "user", pwd="password", roles=["read"]) + + To change a password:: + + db.command("updateUser", "user", pwd="newpassword") + + Or change roles:: + + db.command("updateUser", "user", roles=["readWrite"]) + + .. _createUser: https://docs.mongodb.com/manual/reference/command/createUser/ + .. _usersInfo: https://docs.mongodb.com/manual/reference/command/usersInfo/ + .. _updateUser: https://docs.mongodb.com/manual/reference/command/updateUser/ + .. _dropUser: https://docs.mongodb.com/manual/reference/command/createUser/ + + .. warning:: Never create or modify users over an insecure network without + the use of TLS. See :doc:`/examples/tls` for more information. + + :Parameters: + - `name`: the name of the user to create + - `password` (optional): the password of the user to create. Can not + be used with the ``userSource`` argument. + - `read_only` (optional): if ``True`` the user will be read only + - `**kwargs` (optional): optional fields for the user document + (e.g. ``userSource``, ``otherDBRoles``, or ``roles``). See + `<http://docs.mongodb.org/manual/reference/privilege-documents>`_ + for more information. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + .. versionchanged:: 3.7 + Added support for SCRAM-SHA-256 users with MongoDB 4.0 and later. + + .. versionchanged:: 3.6 + Added ``session`` parameter. Deprecated add_user. + + .. versionchanged:: 2.5 + Added kwargs support for optional fields introduced in MongoDB 2.4 + + .. versionchanged:: 2.2 + Added support for read only users + """ + warnings.warn("add_user is deprecated and will be removed in PyMongo " + "4.0. Use db.command with createUser or updateUser " + "instead", DeprecationWarning, stacklevel=2) + if not isinstance(name, string_type): + raise TypeError("name must be an " + "instance of %s" % (string_type.__name__,)) + if password is not None: + if not isinstance(password, string_type): + raise TypeError("password must be an " + "instance of %s" % (string_type.__name__,)) + if len(password) == 0: + raise ValueError("password can't be empty") + if read_only is not None: + read_only = common.validate_boolean('read_only', read_only) + if 'roles' in kwargs: + raise ConfigurationError("Can not use " + "read_only and roles together") + + try: + uinfo = self.command("usersInfo", name, session=session) + # Create the user if not found in uinfo, otherwise update one. + self._create_or_update_user( + (not uinfo["users"]), name, password, read_only, + session=session, **kwargs) + except OperationFailure as exc: + # Unauthorized. Attempt to create the user in case of + # localhost exception. + if exc.code == 13: + self._create_or_update_user( + True, name, password, read_only, session=session, **kwargs) + else: + raise + + def remove_user(self, name, session=None): + """**DEPRECATED**: Remove user `name` from this :class:`Database`. + + User `name` will no longer have permissions to access this + :class:`Database`. + + .. note:: remove_user is deprecated and will be removed in PyMongo + 4.0. Use the dropUser command instead:: + + db.command("dropUser", "user") + + :Parameters: + - `name`: the name of the user to remove + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + .. versionchanged:: 3.6 + Added ``session`` parameter. Deprecated remove_user. + """ + warnings.warn("remove_user is deprecated and will be removed in " + "PyMongo 4.0. Use db.command with dropUser " + "instead", DeprecationWarning, stacklevel=2) + cmd = SON([("dropUser", name)]) + # Don't send {} as writeConcern. + if self.write_concern.acknowledged and self.write_concern.document: + cmd["writeConcern"] = self.write_concern.document + self.command(cmd, session=session) + + def authenticate(self, name=None, password=None, + source=None, mechanism='DEFAULT', **kwargs): + """**DEPRECATED**: Authenticate to use this database. + + .. warning:: Starting in MongoDB 3.6, calling :meth:`authenticate` + invalidates all existing cursors. It may also leave logical sessions + open on the server for up to 30 minutes until they time out. + + Authentication lasts for the life of the underlying client + instance, or until :meth:`logout` is called. + + Raises :class:`TypeError` if (required) `name`, (optional) `password`, + or (optional) `source` is not an instance of :class:`basestring` + (:class:`str` in python 3). + + .. note:: + - This method authenticates the current connection, and + will also cause all new :class:`~socket.socket` connections + in the underlying client instance to be authenticated automatically. + + - Authenticating more than once on the same database with different + credentials is not supported. You must call :meth:`logout` before + authenticating with new credentials. + + - When sharing a client instance between multiple threads, all + threads will share the authentication. If you need different + authentication profiles for different purposes you must use + distinct client instances. + + :Parameters: + - `name`: the name of the user to authenticate. Optional when + `mechanism` is MONGODB-X509 and the MongoDB server version is + >= 3.4. + - `password` (optional): the password of the user to authenticate. + Not used with GSSAPI or MONGODB-X509 authentication. + - `source` (optional): the database to authenticate on. If not + specified the current database is used. + - `mechanism` (optional): See :data:`~pymongo.auth.MECHANISMS` for + options. If no mechanism is specified, PyMongo automatically uses + MONGODB-CR when connected to a pre-3.0 version of MongoDB, + SCRAM-SHA-1 when connected to MongoDB 3.0 through 3.6, and + negotiates the mechanism to use (SCRAM-SHA-1 or SCRAM-SHA-256) when + connected to MongoDB 4.0+. + - `authMechanismProperties` (optional): Used to specify + authentication mechanism specific options. To specify the service + name for GSSAPI authentication pass + authMechanismProperties='SERVICE_NAME:<service name>' + + .. versionchanged:: 3.7 + Added support for SCRAM-SHA-256 with MongoDB 4.0 and later. + + .. versionchanged:: 3.5 + Deprecated. Authenticating multiple users conflicts with support for + logical sessions in MongoDB 3.6. To authenticate as multiple users, + create multiple instances of MongoClient. + + .. versionadded:: 2.8 + Use SCRAM-SHA-1 with MongoDB 3.0 and later. + + .. versionchanged:: 2.5 + Added the `source` and `mechanism` parameters. :meth:`authenticate` + now raises a subclass of :class:`~pymongo.errors.PyMongoError` if + authentication fails due to invalid credentials or configuration + issues. + + .. mongodoc:: authenticate + """ + if name is not None and not isinstance(name, string_type): + raise TypeError("name must be an " + "instance of %s" % (string_type.__name__,)) + if password is not None and not isinstance(password, string_type): + raise TypeError("password must be an " + "instance of %s" % (string_type.__name__,)) + if source is not None and not isinstance(source, string_type): + raise TypeError("source must be an " + "instance of %s" % (string_type.__name__,)) + common.validate_auth_mechanism('mechanism', mechanism) + + validated_options = {} + for option, value in iteritems(kwargs): + normalized, val = common.validate_auth_option(option, value) + validated_options[normalized] = val + + credentials = auth._build_credentials_tuple( + mechanism, + source, + name, + password, + validated_options, + self.name) + + self.client._cache_credentials( + self.name, + credentials, + connect=True) + + return True + + def logout(self): + """**DEPRECATED**: Deauthorize use of this database. + + .. warning:: Starting in MongoDB 3.6, calling :meth:`logout` + invalidates all existing cursors. It may also leave logical sessions + open on the server for up to 30 minutes until they time out. + """ + warnings.warn("Database.logout() is deprecated", + DeprecationWarning, stacklevel=2) + + # Sockets will be deauthenticated as they are used. + self.client._purge_credentials(self.name) + + def dereference(self, dbref, session=None, **kwargs): + """Dereference a :class:`~bson.dbref.DBRef`, getting the + document it points to. + + Raises :class:`TypeError` if `dbref` is not an instance of + :class:`~bson.dbref.DBRef`. Returns a document, or ``None`` if + the reference does not point to a valid document. Raises + :class:`ValueError` if `dbref` has a database specified that + is different from the current database. + + :Parameters: + - `dbref`: the reference + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs` (optional): any additional keyword arguments + are the same as the arguments to + :meth:`~pymongo.collection.Collection.find`. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + if not isinstance(dbref, DBRef): + raise TypeError("cannot dereference a %s" % type(dbref)) + if dbref.database is not None and dbref.database != self.__name: + raise ValueError("trying to dereference a DBRef that points to " + "another database (%r not %r)" % (dbref.database, + self.__name)) + return self[dbref.collection].find_one( + {"_id": dbref.id}, session=session, **kwargs) + + def eval(self, code, *args): + """**DEPRECATED**: Evaluate a JavaScript expression in MongoDB. + + :Parameters: + - `code`: string representation of JavaScript code to be + evaluated + - `args` (optional): additional positional arguments are + passed to the `code` being evaluated + + .. warning:: the eval command is deprecated in MongoDB 3.0 and + will be removed in a future server version. + """ + warnings.warn("Database.eval() is deprecated", + DeprecationWarning, stacklevel=2) + + if not isinstance(code, Code): + code = Code(code) + + result = self.command("$eval", code, args=args) + return result.get("retval", None) + + def __call__(self, *args, **kwargs): + """This is only here so that some API misusages are easier to debug. + """ + raise TypeError("'Database' object is not callable. If you meant to " + "call the '%s' method on a '%s' object it is " + "failing because no such method exists." % ( + self.__name, self.__client.__class__.__name__)) + + +class SystemJS(object): + """**DEPRECATED**: Helper class for dealing with stored JavaScript. + """ + + def __init__(self, database): + """**DEPRECATED**: Get a system js helper for the database `database`. + + SystemJS will be removed in PyMongo 4.0. + """ + warnings.warn("SystemJS is deprecated", + DeprecationWarning, stacklevel=2) + + if not database.write_concern.acknowledged: + database = database.client.get_database( + database.name, write_concern=DEFAULT_WRITE_CONCERN) + # can't just assign it since we've overridden __setattr__ + object.__setattr__(self, "_db", database) + + def __setattr__(self, name, code): + self._db.system.js.replace_one( + {"_id": name}, {"_id": name, "value": Code(code)}, True) + + def __setitem__(self, name, code): + self.__setattr__(name, code) + + def __delattr__(self, name): + self._db.system.js.delete_one({"_id": name}) + + def __delitem__(self, name): + self.__delattr__(name) + + def __getattr__(self, name): + return lambda *args: self._db.eval(Code("function() { " + "return this[name].apply(" + "this, arguments); }", + scope={'name': name}), *args) + + def __getitem__(self, name): + return self.__getattr__(name) + + def list(self): + """Get a list of the names of the functions stored in this database.""" + return [x["_id"] for x in self._db.system.js.find(projection=["_id"])] diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/driver_info.py b/mongo_mac/lib/python3.6/site-packages/pymongo/driver_info.py new file mode 100644 index 0000000..1f5235a --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/driver_info.py @@ -0,0 +1,39 @@ +# Copyright 2018-present MongoDB, Inc. +# +# 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. + +"""Advanced options for MongoDB drivers implemented on top of PyMongo.""" + +from collections import namedtuple + +from bson.py3compat import string_type + + +class DriverInfo(namedtuple('DriverInfo', ['name', 'version', 'platform'])): + """Info about a driver wrapping PyMongo. + + The MongoDB server logs PyMongo's name, version, and platform whenever + PyMongo establishes a connection. A driver implemented on top of PyMongo + can add its own info to this log message. Initialize with three strings + like 'MyDriver', '1.2.3', 'some platform info'. Any of these strings may be + None to accept PyMongo's default. + """ + def __new__(cls, name=None, version=None, platform=None): + self = super(DriverInfo, cls).__new__(cls, name, version, platform) + for name, value in self._asdict().items(): + if value is not None and not isinstance(value, string_type): + raise TypeError("Wrong type for DriverInfo %s option, value " + "must be an instance of %s" % ( + name, string_type.__name__)) + + return self diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/errors.py b/mongo_mac/lib/python3.6/site-packages/pymongo/errors.py new file mode 100644 index 0000000..74e646f --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/errors.py @@ -0,0 +1,249 @@ +# Copyright 2009-present MongoDB, Inc. +# +# 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. + +"""Exceptions raised by PyMongo.""" + +import sys + +from bson.errors import * + +try: + from ssl import CertificateError +except ImportError: + from pymongo.ssl_match_hostname import CertificateError + + +class PyMongoError(Exception): + """Base class for all PyMongo exceptions.""" + def __init__(self, message='', error_labels=None): + super(PyMongoError, self).__init__(message) + self._message = message + self._error_labels = set(error_labels or []) + + def has_error_label(self, label): + """Return True if this error contains the given label. + + .. versionadded:: 3.7 + """ + return label in self._error_labels + + def _add_error_label(self, label): + """Add the given label to this error.""" + self._error_labels.add(label) + + def _remove_error_label(self, label): + """Remove the given label from this error.""" + self._error_labels.remove(label) + + def __str__(self): + if sys.version_info[0] == 2 and isinstance(self._message, unicode): + return self._message.encode('utf-8', errors='replace') + return str(self._message) + + +class ProtocolError(PyMongoError): + """Raised for failures related to the wire protocol.""" + + +class ConnectionFailure(PyMongoError): + """Raised when a connection to the database cannot be made or is lost.""" + def __init__(self, message='', error_labels=None): + if error_labels is None: + # Connection errors are transient errors by default. + error_labels = ("TransientTransactionError",) + super(ConnectionFailure, self).__init__( + message, error_labels=error_labels) + + +class AutoReconnect(ConnectionFailure): + """Raised when a connection to the database is lost and an attempt to + auto-reconnect will be made. + + In order to auto-reconnect you must handle this exception, recognizing that + the operation which caused it has not necessarily succeeded. Future + operations will attempt to open a new connection to the database (and + will continue to raise this exception until the first successful + connection is made). + + Subclass of :exc:`~pymongo.errors.ConnectionFailure`. + """ + def __init__(self, message='', errors=None): + super(AutoReconnect, self).__init__(message) + self.errors = self.details = errors or [] + + +class NetworkTimeout(AutoReconnect): + """An operation on an open connection exceeded socketTimeoutMS. + + The remaining connections in the pool stay open. In the case of a write + operation, you cannot know whether it succeeded or failed. + + Subclass of :exc:`~pymongo.errors.AutoReconnect`. + """ + + +class NotMasterError(AutoReconnect): + """The server responded "not master" or "node is recovering". + + These errors result from a query, write, or command. The operation failed + because the client thought it was using the primary but the primary has + stepped down, or the client thought it was using a healthy secondary but + the secondary is stale and trying to recover. + + The client launches a refresh operation on a background thread, to update + its view of the server as soon as possible after throwing this exception. + + Subclass of :exc:`~pymongo.errors.AutoReconnect`. + """ + + +class ServerSelectionTimeoutError(AutoReconnect): + """Thrown when no MongoDB server is available for an operation + + If there is no suitable server for an operation PyMongo tries for + ``serverSelectionTimeoutMS`` (default 30 seconds) to find one, then + throws this exception. For example, it is thrown after attempting an + operation when PyMongo cannot connect to any server, or if you attempt + an insert into a replica set that has no primary and does not elect one + within the timeout window, or if you attempt to query with a Read + Preference that the replica set cannot satisfy. + """ + + +class ConfigurationError(PyMongoError): + """Raised when something is incorrectly configured. + """ + + +class OperationFailure(PyMongoError): + """Raised when a database operation fails. + + .. versionadded:: 2.7 + The :attr:`details` attribute. + """ + + def __init__(self, error, code=None, details=None): + error_labels = None + if details is not None: + error_labels = details.get('errorLabels') + super(OperationFailure, self).__init__( + error, error_labels=error_labels) + self.__code = code + self.__details = details + + @property + def code(self): + """The error code returned by the server, if any. + """ + return self.__code + + @property + def details(self): + """The complete error document returned by the server. + + Depending on the error that occurred, the error document + may include useful information beyond just the error + message. When connected to a mongos the error document + may contain one or more subdocuments if errors occurred + on multiple shards. + """ + return self.__details + + +class CursorNotFound(OperationFailure): + """Raised while iterating query results if the cursor is + invalidated on the server. + + .. versionadded:: 2.7 + """ + + +class ExecutionTimeout(OperationFailure): + """Raised when a database operation times out, exceeding the $maxTimeMS + set in the query or command option. + + .. note:: Requires server version **>= 2.6.0** + + .. versionadded:: 2.7 + """ + + +class WriteConcernError(OperationFailure): + """Base exception type for errors raised due to write concern. + + .. versionadded:: 3.0 + """ + + +class WriteError(OperationFailure): + """Base exception type for errors raised during write operations. + + .. versionadded:: 3.0 + """ + + +class WTimeoutError(WriteConcernError): + """Raised when a database operation times out (i.e. wtimeout expires) + before replication completes. + + With newer versions of MongoDB the `details` attribute may include + write concern fields like 'n', 'updatedExisting', or 'writtenTo'. + + .. versionadded:: 2.7 + """ + + +class DuplicateKeyError(WriteError): + """Raised when an insert or update fails due to a duplicate key error.""" + + +class BulkWriteError(OperationFailure): + """Exception class for bulk write errors. + + .. versionadded:: 2.7 + """ + def __init__(self, results): + super(BulkWriteError, self).__init__( + "batch op errors occurred", 65, results) + + +class InvalidOperation(PyMongoError): + """Raised when a client attempts to perform an invalid operation.""" + + +class InvalidName(PyMongoError): + """Raised when an invalid name is used.""" + + +class CollectionInvalid(PyMongoError): + """Raised when collection validation fails.""" + + +class InvalidURI(ConfigurationError): + """Raised when trying to parse an invalid mongodb URI.""" + + +class ExceededMaxWaiters(Exception): + """Raised when a thread tries to get a connection from a pool and + ``maxPoolSize * waitQueueMultiple`` threads are already waiting. + + .. versionadded:: 2.6 + """ + pass + + +class DocumentTooLarge(InvalidDocument): + """Raised when an encoded document is too large for the connected server. + """ + pass diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/helpers.py b/mongo_mac/lib/python3.6/site-packages/pymongo/helpers.py new file mode 100644 index 0000000..347c40d --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/helpers.py @@ -0,0 +1,272 @@ +# Copyright 2009-present MongoDB, Inc. +# +# 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. + +"""Bits and pieces used by the driver that don't really fit elsewhere.""" + +import sys +import traceback + +from bson.py3compat import abc, iteritems, itervalues, string_type +from bson.son import SON +from pymongo import ASCENDING +from pymongo.errors import (CursorNotFound, + DuplicateKeyError, + ExecutionTimeout, + NotMasterError, + OperationFailure, + WriteError, + WriteConcernError, + WTimeoutError) + +# From the Server Discovery and Monitoring spec, the "not master" error codes +# are combined with the "node is recovering" error codes. +_NOT_MASTER_CODES = frozenset([ + 10107, # NotMaster + 13435, # NotMasterNoSlaveOk + 11600, # InterruptedAtShutdown + 11602, # InterruptedDueToReplStateChange + 13436, # NotMasterOrSecondary + 189, # PrimarySteppedDown + 91, # ShutdownInProgress +]) +# From the retryable writes spec. +_RETRYABLE_ERROR_CODES = _NOT_MASTER_CODES | frozenset([ + 7, # HostNotFound + 6, # HostUnreachable + 89, # NetworkTimeout + 9001, # SocketException +]) +_UUNDER = u"_" + + +def _gen_index_name(keys): + """Generate an index name from the set of fields it is over.""" + return _UUNDER.join(["%s_%s" % item for item in keys]) + + +def _index_list(key_or_list, direction=None): + """Helper to generate a list of (key, direction) pairs. + + Takes such a list, or a single key, or a single key and direction. + """ + if direction is not None: + return [(key_or_list, direction)] + else: + if isinstance(key_or_list, string_type): + return [(key_or_list, ASCENDING)] + elif not isinstance(key_or_list, (list, tuple)): + raise TypeError("if no direction is specified, " + "key_or_list must be an instance of list") + return key_or_list + + +def _index_document(index_list): + """Helper to generate an index specifying document. + + Takes a list of (key, direction) pairs. + """ + if isinstance(index_list, abc.Mapping): + raise TypeError("passing a dict to sort/create_index/hint is not " + "allowed - use a list of tuples instead. did you " + "mean %r?" % list(iteritems(index_list))) + elif not isinstance(index_list, (list, tuple)): + raise TypeError("must use a list of (key, direction) pairs, " + "not: " + repr(index_list)) + if not len(index_list): + raise ValueError("key_or_list must not be the empty list") + + index = SON() + for (key, value) in index_list: + if not isinstance(key, string_type): + raise TypeError("first item in each key pair must be a string") + if not isinstance(value, (string_type, int, abc.Mapping)): + raise TypeError("second item in each key pair must be 1, -1, " + "'2d', 'geoHaystack', or another valid MongoDB " + "index specifier.") + index[key] = value + return index + + +def _check_command_response(response, msg=None, allowable_errors=None, + parse_write_concern_error=False): + """Check the response to a command for errors. + """ + if "ok" not in response: + # Server didn't recognize our message as a command. + raise OperationFailure(response.get("$err"), + response.get("code"), + response) + + if parse_write_concern_error and 'writeConcernError' in response: + _raise_write_concern_error(response['writeConcernError']) + + if not response["ok"]: + + details = response + # Mongos returns the error details in a 'raw' object + # for some errors. + if "raw" in response: + for shard in itervalues(response["raw"]): + # Grab the first non-empty raw error from a shard. + if shard.get("errmsg") and not shard.get("ok"): + details = shard + break + + errmsg = details["errmsg"] + if allowable_errors is None or errmsg not in allowable_errors: + + code = details.get("code") + # Server is "not master" or "recovering" + if code in _NOT_MASTER_CODES: + raise NotMasterError(errmsg, response) + elif ("not master" in errmsg + or "node is recovering" in errmsg): + raise NotMasterError(errmsg, response) + + # Server assertion failures + if errmsg == "db assertion failure": + errmsg = ("db assertion failure, assertion: '%s'" % + details.get("assertion", "")) + raise OperationFailure(errmsg, + details.get("assertionCode"), + response) + + # Other errors + # findAndModify with upsert can raise duplicate key error + if code in (11000, 11001, 12582): + raise DuplicateKeyError(errmsg, code, response) + elif code == 50: + raise ExecutionTimeout(errmsg, code, response) + elif code == 43: + raise CursorNotFound(errmsg, code, response) + + msg = msg or "%s" + raise OperationFailure(msg % errmsg, code, response) + + +def _check_gle_response(result): + """Return getlasterror response as a dict, or raise OperationFailure.""" + # Did getlasterror itself fail? + _check_command_response(result) + + if result.get("wtimeout", False): + # MongoDB versions before 1.8.0 return the error message in an "errmsg" + # field. If "errmsg" exists "err" will also exist set to None, so we + # have to check for "errmsg" first. + raise WTimeoutError(result.get("errmsg", result.get("err")), + result.get("code"), + result) + + error_msg = result.get("err", "") + if error_msg is None: + return result + + if error_msg.startswith("not master"): + raise NotMasterError(error_msg, result) + + details = result + + # mongos returns the error code in an error object for some errors. + if "errObjects" in result: + for errobj in result["errObjects"]: + if errobj.get("err") == error_msg: + details = errobj + break + + code = details.get("code") + if code in (11000, 11001, 12582): + raise DuplicateKeyError(details["err"], code, result) + raise OperationFailure(details["err"], code, result) + + +def _raise_last_write_error(write_errors): + # If the last batch had multiple errors only report + # the last error to emulate continue_on_error. + error = write_errors[-1] + if error.get("code") == 11000: + raise DuplicateKeyError(error.get("errmsg"), 11000, error) + raise WriteError(error.get("errmsg"), error.get("code"), error) + + +def _raise_write_concern_error(error): + if "errInfo" in error and error["errInfo"].get('wtimeout'): + # Make sure we raise WTimeoutError + raise WTimeoutError( + error.get("errmsg"), error.get("code"), error) + raise WriteConcernError( + error.get("errmsg"), error.get("code"), error) + + +def _check_write_command_response(result): + """Backward compatibility helper for write command error handling. + """ + # Prefer write errors over write concern errors + write_errors = result.get("writeErrors") + if write_errors: + _raise_last_write_error(write_errors) + + error = result.get("writeConcernError") + if error: + _raise_write_concern_error(error) + + +def _raise_last_error(bulk_write_result): + """Backward compatibility helper for insert error handling. + """ + # Prefer write errors over write concern errors + write_errors = bulk_write_result.get("writeErrors") + if write_errors: + _raise_last_write_error(write_errors) + + _raise_write_concern_error(bulk_write_result["writeConcernErrors"][-1]) + + +def _fields_list_to_dict(fields, option_name): + """Takes a sequence of field names and returns a matching dictionary. + + ["a", "b"] becomes {"a": 1, "b": 1} + + and + + ["a.b.c", "d", "a.c"] becomes {"a.b.c": 1, "d": 1, "a.c": 1} + """ + if isinstance(fields, abc.Mapping): + return fields + + if isinstance(fields, (abc.Sequence, abc.Set)): + if not all(isinstance(field, string_type) for field in fields): + raise TypeError("%s must be a list of key names, each an " + "instance of %s" % (option_name, + string_type.__name__)) + return dict.fromkeys(fields, 1) + + raise TypeError("%s must be a mapping or " + "list of key names" % (option_name,)) + + +def _handle_exception(): + """Print exceptions raised by subscribers to stderr.""" + # Heavily influenced by logging.Handler.handleError. + + # See note here: + # https://docs.python.org/3.4/library/sys.html#sys.__stderr__ + if sys.stderr: + einfo = sys.exc_info() + try: + traceback.print_exception(einfo[0], einfo[1], einfo[2], + None, sys.stderr) + except IOError: + pass + finally: + del einfo diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/ismaster.py b/mongo_mac/lib/python3.6/site-packages/pymongo/ismaster.py new file mode 100644 index 0000000..e723ff0 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/ismaster.py @@ -0,0 +1,158 @@ +# Copyright 2014-present MongoDB, Inc. +# +# 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. + +"""Parse a response to the 'ismaster' command.""" + +import itertools + +from bson.py3compat import imap +from pymongo import common +from pymongo.server_type import SERVER_TYPE + + +def _get_server_type(doc): + """Determine the server type from an ismaster response.""" + if not doc.get('ok'): + return SERVER_TYPE.Unknown + + if doc.get('isreplicaset'): + return SERVER_TYPE.RSGhost + elif doc.get('setName'): + if doc.get('hidden'): + return SERVER_TYPE.RSOther + elif doc.get('ismaster'): + return SERVER_TYPE.RSPrimary + elif doc.get('secondary'): + return SERVER_TYPE.RSSecondary + elif doc.get('arbiterOnly'): + return SERVER_TYPE.RSArbiter + else: + return SERVER_TYPE.RSOther + elif doc.get('msg') == 'isdbgrid': + return SERVER_TYPE.Mongos + else: + return SERVER_TYPE.Standalone + + +class IsMaster(object): + __slots__ = ('_doc', '_server_type', '_is_writable', '_is_readable') + + def __init__(self, doc): + """Parse an ismaster response from the server.""" + self._server_type = _get_server_type(doc) + self._doc = doc + self._is_writable = self._server_type in ( + SERVER_TYPE.RSPrimary, + SERVER_TYPE.Standalone, + SERVER_TYPE.Mongos) + + self._is_readable = ( + self.server_type == SERVER_TYPE.RSSecondary + or self._is_writable) + + @property + def document(self): + """The complete ismaster command response document. + + .. versionadded:: 3.4 + """ + return self._doc.copy() + + @property + def server_type(self): + return self._server_type + + @property + def all_hosts(self): + """List of hosts, passives, and arbiters known to this server.""" + return set(imap(common.clean_node, itertools.chain( + self._doc.get('hosts', []), + self._doc.get('passives', []), + self._doc.get('arbiters', [])))) + + @property + def tags(self): + """Replica set member tags or empty dict.""" + return self._doc.get('tags', {}) + + @property + def primary(self): + """This server's opinion about who the primary is, or None.""" + if self._doc.get('primary'): + return common.partition_node(self._doc['primary']) + else: + return None + + @property + def replica_set_name(self): + """Replica set name or None.""" + return self._doc.get('setName') + + @property + def max_bson_size(self): + return self._doc.get('maxBsonObjectSize', common.MAX_BSON_SIZE) + + @property + def max_message_size(self): + return self._doc.get('maxMessageSizeBytes', 2 * self.max_bson_size) + + @property + def max_write_batch_size(self): + return self._doc.get('maxWriteBatchSize', common.MAX_WRITE_BATCH_SIZE) + + @property + def min_wire_version(self): + return self._doc.get('minWireVersion', common.MIN_WIRE_VERSION) + + @property + def max_wire_version(self): + return self._doc.get('maxWireVersion', common.MAX_WIRE_VERSION) + + @property + def set_version(self): + return self._doc.get('setVersion') + + @property + def election_id(self): + return self._doc.get('electionId') + + @property + def cluster_time(self): + return self._doc.get('$clusterTime') + + @property + def logical_session_timeout_minutes(self): + return self._doc.get('logicalSessionTimeoutMinutes') + + @property + def is_writable(self): + return self._is_writable + + @property + def is_readable(self): + return self._is_readable + + @property + def me(self): + me = self._doc.get('me') + if me: + return common.clean_node(me) + + @property + def last_write_date(self): + return self._doc.get('lastWrite', {}).get('lastWriteDate') + + @property + def compressors(self): + return self._doc.get('compression') diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/max_staleness_selectors.py b/mongo_mac/lib/python3.6/site-packages/pymongo/max_staleness_selectors.py new file mode 100644 index 0000000..6bc2fe7 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/max_staleness_selectors.py @@ -0,0 +1,116 @@ +# Copyright 2016 MongoDB, Inc. +# +# 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. + +"""Criteria to select ServerDescriptions based on maxStalenessSeconds. + +The Max Staleness Spec says: When there is a known primary P, +a secondary S's staleness is estimated with this formula: + + (S.lastUpdateTime - S.lastWriteDate) - (P.lastUpdateTime - P.lastWriteDate) + + heartbeatFrequencyMS + +When there is no known primary, a secondary S's staleness is estimated with: + + SMax.lastWriteDate - S.lastWriteDate + heartbeatFrequencyMS + +where "SMax" is the secondary with the greatest lastWriteDate. +""" + +from pymongo.errors import ConfigurationError +from pymongo.server_type import SERVER_TYPE + + +# Constant defined in Max Staleness Spec: An idle primary writes a no-op every +# 10 seconds to refresh secondaries' lastWriteDate values. +IDLE_WRITE_PERIOD = 10 +SMALLEST_MAX_STALENESS = 90 + + +def _validate_max_staleness(max_staleness, + heartbeat_frequency): + # We checked for max staleness -1 before this, it must be positive here. + if max_staleness < heartbeat_frequency + IDLE_WRITE_PERIOD: + raise ConfigurationError( + "maxStalenessSeconds must be at least heartbeatFrequencyMS +" + " %d seconds. maxStalenessSeconds is set to %d," + " heartbeatFrequencyMS is set to %d." % ( + IDLE_WRITE_PERIOD, max_staleness, heartbeat_frequency * 1000)) + + if max_staleness < SMALLEST_MAX_STALENESS: + raise ConfigurationError( + "maxStalenessSeconds must be at least %d. " + "maxStalenessSeconds is set to %d." % ( + SMALLEST_MAX_STALENESS, max_staleness)) + + +def _with_primary(max_staleness, selection): + """Apply max_staleness, in seconds, to a Selection with a known primary.""" + primary = selection.primary + sds = [] + + for s in selection.server_descriptions: + if s.server_type == SERVER_TYPE.RSSecondary: + # See max-staleness.rst for explanation of this formula. + staleness = ( + (s.last_update_time - s.last_write_date) - + (primary.last_update_time - primary.last_write_date) + + selection.heartbeat_frequency) + + if staleness <= max_staleness: + sds.append(s) + else: + sds.append(s) + + return selection.with_server_descriptions(sds) + + +def _no_primary(max_staleness, selection): + """Apply max_staleness, in seconds, to a Selection with no known primary.""" + # Secondary that's replicated the most recent writes. + smax = selection.secondary_with_max_last_write_date() + if not smax: + # No secondaries and no primary, short-circuit out of here. + return selection.with_server_descriptions([]) + + sds = [] + + for s in selection.server_descriptions: + if s.server_type == SERVER_TYPE.RSSecondary: + # See max-staleness.rst for explanation of this formula. + staleness = (smax.last_write_date - + s.last_write_date + + selection.heartbeat_frequency) + + if staleness <= max_staleness: + sds.append(s) + else: + sds.append(s) + + return selection.with_server_descriptions(sds) + + +def select(max_staleness, selection): + """Apply max_staleness, in seconds, to a Selection.""" + if max_staleness == -1: + return selection + + # Server Selection Spec: If the TopologyType is ReplicaSetWithPrimary or + # ReplicaSetNoPrimary, a client MUST raise an error if maxStaleness < + # heartbeatFrequency + IDLE_WRITE_PERIOD, or if maxStaleness < 90. + _validate_max_staleness(max_staleness, selection.heartbeat_frequency) + + if selection.primary: + return _with_primary(max_staleness, selection) + else: + return _no_primary(max_staleness, selection) diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/message.py b/mongo_mac/lib/python3.6/site-packages/pymongo/message.py new file mode 100644 index 0000000..29ec24f --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/message.py @@ -0,0 +1,1555 @@ +# Copyright 2009-present MongoDB, Inc. +# +# 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. + +"""Tools for creating `messages +<http://www.mongodb.org/display/DOCS/Mongo+Wire+Protocol>`_ to be sent to +MongoDB. + +.. note:: This module is for internal use and is generally not needed by + application developers. +""" + +import datetime +import random +import struct + +import bson +from bson import (CodecOptions, + _dict_to_bson, + _make_c_string) +from bson.codec_options import DEFAULT_CODEC_OPTIONS +from bson.py3compat import b, StringIO +from bson.son import SON + +try: + from pymongo import _cmessage + _use_c = True +except ImportError: + _use_c = False +from pymongo.errors import (ConfigurationError, + CursorNotFound, + DocumentTooLarge, + ExecutionTimeout, + InvalidOperation, + NotMasterError, + OperationFailure, + ProtocolError) +from pymongo.read_concern import DEFAULT_READ_CONCERN +from pymongo.read_preferences import ReadPreference + + +MAX_INT32 = 2147483647 +MIN_INT32 = -2147483648 + +# Overhead allowed for encoded command documents. +_COMMAND_OVERHEAD = 16382 + +_INSERT = 0 +_UPDATE = 1 +_DELETE = 2 + +_EMPTY = b'' +_BSONOBJ = b'\x03' +_ZERO_8 = b'\x00' +_ZERO_16 = b'\x00\x00' +_ZERO_32 = b'\x00\x00\x00\x00' +_ZERO_64 = b'\x00\x00\x00\x00\x00\x00\x00\x00' +_SKIPLIM = b'\x00\x00\x00\x00\xff\xff\xff\xff' +_OP_MAP = { + _INSERT: b'\x04documents\x00\x00\x00\x00\x00', + _UPDATE: b'\x04updates\x00\x00\x00\x00\x00', + _DELETE: b'\x04deletes\x00\x00\x00\x00\x00', +} +_FIELD_MAP = { + 'insert': 'documents', + 'update': 'updates', + 'delete': 'deletes' +} + +_UJOIN = u"%s.%s" + +_UNICODE_REPLACE_CODEC_OPTIONS = CodecOptions( + unicode_decode_error_handler='replace') + + +def _randint(): + """Generate a pseudo random 32 bit integer.""" + return random.randint(MIN_INT32, MAX_INT32) + + +def _maybe_add_read_preference(spec, read_preference): + """Add $readPreference to spec when appropriate.""" + mode = read_preference.mode + tag_sets = read_preference.tag_sets + max_staleness = read_preference.max_staleness + # Only add $readPreference if it's something other than primary to avoid + # problems with mongos versions that don't support read preferences. Also, + # for maximum backwards compatibility, don't add $readPreference for + # secondaryPreferred unless tags or maxStalenessSeconds are in use (setting + # the slaveOkay bit has the same effect). + if mode and ( + mode != ReadPreference.SECONDARY_PREFERRED.mode + or tag_sets != [{}] + or max_staleness != -1): + + if "$query" not in spec: + spec = SON([("$query", spec)]) + spec["$readPreference"] = read_preference.document + return spec + + +def _convert_exception(exception): + """Convert an Exception into a failure document for publishing.""" + return {'errmsg': str(exception), + 'errtype': exception.__class__.__name__} + + +def _convert_write_result(operation, command, result): + """Convert a legacy write result to write commmand format.""" + + # Based on _merge_legacy from bulk.py + affected = result.get("n", 0) + res = {"ok": 1, "n": affected} + errmsg = result.get("errmsg", result.get("err", "")) + if errmsg: + # The write was successful on at least the primary so don't return. + if result.get("wtimeout"): + res["writeConcernError"] = {"errmsg": errmsg, + "code": 64, + "errInfo": {"wtimeout": True}} + else: + # The write failed. + error = {"index": 0, + "code": result.get("code", 8), + "errmsg": errmsg} + if "errInfo" in result: + error["errInfo"] = result["errInfo"] + res["writeErrors"] = [error] + return res + if operation == "insert": + # GLE result for insert is always 0 in most MongoDB versions. + res["n"] = len(command['documents']) + elif operation == "update": + if "upserted" in result: + res["upserted"] = [{"index": 0, "_id": result["upserted"]}] + # Versions of MongoDB before 2.6 don't return the _id for an + # upsert if _id is not an ObjectId. + elif result.get("updatedExisting") is False and affected == 1: + # If _id is in both the update document *and* the query spec + # the update document _id takes precedence. + update = command['updates'][0] + _id = update["u"].get("_id", update["q"].get("_id")) + res["upserted"] = [{"index": 0, "_id": _id}] + return res + + +_OPTIONS = SON([ + ('tailable', 2), + ('oplogReplay', 8), + ('noCursorTimeout', 16), + ('awaitData', 32), + ('allowPartialResults', 128)]) + + +_MODIFIERS = SON([ + ('$query', 'filter'), + ('$orderby', 'sort'), + ('$hint', 'hint'), + ('$comment', 'comment'), + ('$maxScan', 'maxScan'), + ('$maxTimeMS', 'maxTimeMS'), + ('$max', 'max'), + ('$min', 'min'), + ('$returnKey', 'returnKey'), + ('$showRecordId', 'showRecordId'), + ('$showDiskLoc', 'showRecordId'), # <= MongoDb 3.0 + ('$snapshot', 'snapshot')]) + + +def _gen_find_command(coll, spec, projection, skip, limit, batch_size, options, + read_concern, collation=None, session=None): + """Generate a find command document.""" + cmd = SON([('find', coll)]) + if '$query' in spec: + cmd.update([(_MODIFIERS[key], val) if key in _MODIFIERS else (key, val) + for key, val in spec.items()]) + if '$explain' in cmd: + cmd.pop('$explain') + if '$readPreference' in cmd: + cmd.pop('$readPreference') + else: + cmd['filter'] = spec + + if projection: + cmd['projection'] = projection + if skip: + cmd['skip'] = skip + if limit: + cmd['limit'] = abs(limit) + if limit < 0: + cmd['singleBatch'] = True + if batch_size: + cmd['batchSize'] = batch_size + if read_concern.level and not (session and session._in_transaction): + cmd['readConcern'] = read_concern.document + if collation: + cmd['collation'] = collation + if options: + cmd.update([(opt, True) + for opt, val in _OPTIONS.items() + if options & val]) + return cmd + + +def _gen_get_more_command(cursor_id, coll, batch_size, max_await_time_ms): + """Generate a getMore command document.""" + cmd = SON([('getMore', cursor_id), + ('collection', coll)]) + if batch_size: + cmd['batchSize'] = batch_size + if max_await_time_ms is not None: + cmd['maxTimeMS'] = max_await_time_ms + return cmd + + +class _Query(object): + """A query operation.""" + + __slots__ = ('flags', 'db', 'coll', 'ntoskip', 'spec', + 'fields', 'codec_options', 'read_preference', 'limit', + 'batch_size', 'name', 'read_concern', 'collation', + 'session', 'client', '_as_command') + + def __init__(self, flags, db, coll, ntoskip, spec, fields, + codec_options, read_preference, limit, + batch_size, read_concern, collation, session, client): + self.flags = flags + self.db = db + self.coll = coll + self.ntoskip = ntoskip + self.spec = spec + self.fields = fields + self.codec_options = codec_options + self.read_preference = read_preference + self.read_concern = read_concern + self.limit = limit + self.batch_size = batch_size + self.collation = collation + self.session = session + self.client = client + self.name = 'find' + self._as_command = None + + def use_command(self, sock_info, exhaust): + use_find_cmd = False + if sock_info.max_wire_version >= 4: + if not exhaust: + use_find_cmd = True + elif not self.read_concern.ok_for_legacy: + raise ConfigurationError( + 'read concern level of %s is not valid ' + 'with a max wire version of %d.' + % (self.read_concern.level, + sock_info.max_wire_version)) + + if sock_info.max_wire_version < 5 and self.collation is not None: + raise ConfigurationError( + 'Specifying a collation is unsupported with a max wire ' + 'version of %d.' % (sock_info.max_wire_version,)) + + sock_info.validate_session(self.client, self.session) + + return use_find_cmd + + def as_command(self, sock_info): + """Return a find command document for this query.""" + # We use the command twice: on the wire and for command monitoring. + # Generate it once, for speed and to avoid repeating side-effects. + if self._as_command is not None: + return self._as_command + + explain = '$explain' in self.spec + cmd = _gen_find_command( + self.coll, self.spec, self.fields, self.ntoskip, + self.limit, self.batch_size, self.flags, self.read_concern, + self.collation, self.session) + if explain: + self.name = 'explain' + cmd = SON([('explain', cmd)]) + session = self.session + if session: + session._apply_to(cmd, False, self.read_preference, sock_info) + # Explain does not support readConcern. + if (not explain and session.options.causal_consistency + and session.operation_time is not None + and not session._in_transaction): + cmd.setdefault( + 'readConcern', {})[ + 'afterClusterTime'] = session.operation_time + sock_info.send_cluster_time(cmd, session, self.client) + self._as_command = cmd, self.db + return self._as_command + + def get_message(self, set_slave_ok, sock_info, use_cmd=False): + """Get a query message, possibly setting the slaveOk bit.""" + if set_slave_ok: + # Set the slaveOk bit. + flags = self.flags | 4 + else: + flags = self.flags + + ns = _UJOIN % (self.db, self.coll) + spec = self.spec + + if use_cmd: + spec = self.as_command(sock_info)[0] + if sock_info.op_msg_enabled: + request_id, msg, size, _ = _op_msg( + 0, spec, self.db, self.read_preference, + set_slave_ok, False, self.codec_options, + ctx=sock_info.compression_context) + return request_id, msg, size + ns = _UJOIN % (self.db, "$cmd") + ntoreturn = -1 # All DB commands return 1 document + else: + # OP_QUERY treats ntoreturn of -1 and 1 the same, return + # one document and close the cursor. We have to use 2 for + # batch size if 1 is specified. + ntoreturn = self.batch_size == 1 and 2 or self.batch_size + if self.limit: + if ntoreturn: + ntoreturn = min(self.limit, ntoreturn) + else: + ntoreturn = self.limit + + if sock_info.is_mongos: + spec = _maybe_add_read_preference(spec, + self.read_preference) + + return query(flags, ns, self.ntoskip, ntoreturn, + spec, None if use_cmd else self.fields, + self.codec_options, ctx=sock_info.compression_context) + + +class _GetMore(object): + """A getmore operation.""" + + __slots__ = ('db', 'coll', 'ntoreturn', 'cursor_id', 'max_await_time_ms', + 'codec_options', 'read_preference', 'session', 'client', + '_as_command') + + name = 'getMore' + + def __init__(self, db, coll, ntoreturn, cursor_id, codec_options, + read_preference, session, client, max_await_time_ms=None): + self.db = db + self.coll = coll + self.ntoreturn = ntoreturn + self.cursor_id = cursor_id + self.codec_options = codec_options + self.read_preference = read_preference + self.session = session + self.client = client + self.max_await_time_ms = max_await_time_ms + self._as_command = None + + def use_command(self, sock_info, exhaust): + sock_info.validate_session(self.client, self.session) + return sock_info.max_wire_version >= 4 and not exhaust + + def as_command(self, sock_info): + """Return a getMore command document for this query.""" + # See _Query.as_command for an explanation of this caching. + if self._as_command is not None: + return self._as_command + + cmd = _gen_get_more_command(self.cursor_id, self.coll, + self.ntoreturn, + self.max_await_time_ms) + + if self.session: + self.session._apply_to(cmd, False, self.read_preference, sock_info) + sock_info.send_cluster_time(cmd, self.session, self.client) + self._as_command = cmd, self.db + return self._as_command + + def get_message(self, dummy0, sock_info, use_cmd=False): + """Get a getmore message.""" + + ns = _UJOIN % (self.db, self.coll) + ctx = sock_info.compression_context + + if use_cmd: + spec = self.as_command(sock_info)[0] + if sock_info.op_msg_enabled: + request_id, msg, size, _ = _op_msg( + 0, spec, self.db, ReadPreference.PRIMARY, + False, False, self.codec_options, + ctx=sock_info.compression_context) + return request_id, msg, size + ns = _UJOIN % (self.db, "$cmd") + return query(0, ns, 0, -1, spec, None, self.codec_options, ctx=ctx) + + return get_more(ns, self.ntoreturn, self.cursor_id, ctx) + + +# TODO: Use OP_MSG once the server is able to respond with document streams. +class _RawBatchQuery(_Query): + def use_command(self, socket_info, exhaust): + # Compatibility checks. + super(_RawBatchQuery, self).use_command(socket_info, exhaust) + + return False + + def get_message(self, set_slave_ok, sock_info, use_cmd=False): + # Always pass False for use_cmd. + return super(_RawBatchQuery, self).get_message( + set_slave_ok, sock_info, False) + + +class _RawBatchGetMore(_GetMore): + def use_command(self, socket_info, exhaust): + return False + + def get_message(self, set_slave_ok, sock_info, use_cmd=False): + # Always pass False for use_cmd. + return super(_RawBatchGetMore, self).get_message( + set_slave_ok, sock_info, False) + + +class _CursorAddress(tuple): + """The server address (host, port) of a cursor, with namespace property.""" + + def __new__(cls, address, namespace): + self = tuple.__new__(cls, address) + self.__namespace = namespace + return self + + @property + def namespace(self): + """The namespace this cursor.""" + return self.__namespace + + def __hash__(self): + # Two _CursorAddress instances with different namespaces + # must not hash the same. + return (self + (self.__namespace,)).__hash__() + + def __eq__(self, other): + if isinstance(other, _CursorAddress): + return (tuple(self) == tuple(other) + and self.namespace == other.namespace) + return NotImplemented + + def __ne__(self, other): + return not self == other + + +_pack_compression_header = struct.Struct("<iiiiiiB").pack +_COMPRESSION_HEADER_SIZE = 25 + +def _compress(operation, data, ctx): + """Takes message data, compresses it, and adds an OP_COMPRESSED header.""" + compressed = ctx.compress(data) + request_id = _randint() + + header = _pack_compression_header( + _COMPRESSION_HEADER_SIZE + len(compressed), # Total message length + request_id, # Request id + 0, # responseTo + 2012, # operation id + operation, # original operation id + len(data), # uncompressed message length + ctx.compressor_id) # compressor id + return request_id, header + compressed + + +def __last_error(namespace, args): + """Data to send to do a lastError. + """ + cmd = SON([("getlasterror", 1)]) + cmd.update(args) + splitns = namespace.split('.', 1) + return query(0, splitns[0] + '.$cmd', 0, -1, cmd, + None, DEFAULT_CODEC_OPTIONS) + + +_pack_header = struct.Struct("<iiii").pack + + +def __pack_message(operation, data): + """Takes message data and adds a message header based on the operation. + + Returns the resultant message string. + """ + rid = _randint() + message = _pack_header(16 + len(data), rid, 0, operation) + return rid, message + data + + +_pack_int = struct.Struct("<i").pack + + +def _insert(collection_name, docs, check_keys, flags, opts): + """Get an OP_INSERT message""" + encode = _dict_to_bson # Make local. Uses extensions. + if len(docs) == 1: + encoded = encode(docs[0], check_keys, opts) + return b"".join([ + b"\x00\x00\x00\x00", # Flags don't matter for one doc. + _make_c_string(collection_name), + encoded]), len(encoded) + + encoded = [encode(doc, check_keys, opts) for doc in docs] + if not encoded: + raise InvalidOperation("cannot do an empty bulk insert") + return b"".join([ + _pack_int(flags), + _make_c_string(collection_name), + b"".join(encoded)]), max(map(len, encoded)) + + +def _insert_compressed( + collection_name, docs, check_keys, continue_on_error, opts, ctx): + """Internal compressed unacknowledged insert message helper.""" + op_insert, max_bson_size = _insert( + collection_name, docs, check_keys, continue_on_error, opts) + rid, msg = _compress(2002, op_insert, ctx) + return rid, msg, max_bson_size + + +def _insert_uncompressed(collection_name, docs, check_keys, + safe, last_error_args, continue_on_error, opts): + """Internal insert message helper.""" + op_insert, max_bson_size = _insert( + collection_name, docs, check_keys, continue_on_error, opts) + rid, msg = __pack_message(2002, op_insert) + if safe: + rid, gle, _ = __last_error(collection_name, last_error_args) + return rid, msg + gle, max_bson_size + return rid, msg, max_bson_size +if _use_c: + _insert_uncompressed = _cmessage._insert_message + + +def insert(collection_name, docs, check_keys, + safe, last_error_args, continue_on_error, opts, ctx=None): + """Get an **insert** message.""" + if ctx: + return _insert_compressed( + collection_name, docs, check_keys, continue_on_error, opts, ctx) + return _insert_uncompressed(collection_name, docs, check_keys, safe, + last_error_args, continue_on_error, opts) + + +def _update(collection_name, upsert, multi, spec, doc, check_keys, opts): + """Get an OP_UPDATE message.""" + flags = 0 + if upsert: + flags += 1 + if multi: + flags += 2 + encode = _dict_to_bson # Make local. Uses extensions. + encoded_update = encode(doc, check_keys, opts) + return b"".join([ + _ZERO_32, + _make_c_string(collection_name), + _pack_int(flags), + encode(spec, False, opts), + encoded_update]), len(encoded_update) + + +def _update_compressed( + collection_name, upsert, multi, spec, doc, check_keys, opts, ctx): + """Internal compressed unacknowledged update message helper.""" + op_update, max_bson_size = _update( + collection_name, upsert, multi, spec, doc, check_keys, opts) + rid, msg = _compress(2001, op_update, ctx) + return rid, msg, max_bson_size + + +def _update_uncompressed(collection_name, upsert, multi, spec, + doc, safe, last_error_args, check_keys, opts): + """Internal update message helper.""" + op_update, max_bson_size = _update( + collection_name, upsert, multi, spec, doc, check_keys, opts) + rid, msg = __pack_message(2001, op_update) + if safe: + rid, gle, _ = __last_error(collection_name, last_error_args) + return rid, msg + gle, max_bson_size + return rid, msg, max_bson_size +if _use_c: + _update_uncompressed = _cmessage._update_message + + +def update(collection_name, upsert, multi, spec, + doc, safe, last_error_args, check_keys, opts, ctx=None): + """Get an **update** message.""" + if ctx: + return _update_compressed( + collection_name, upsert, multi, spec, doc, check_keys, opts, ctx) + return _update_uncompressed(collection_name, upsert, multi, spec, + doc, safe, last_error_args, check_keys, opts) + + +_pack_op_msg_flags_type = struct.Struct("<IB").pack +_pack_byte = struct.Struct("<B").pack + + +def _op_msg_no_header(flags, command, identifier, docs, check_keys, opts): + """Get a OP_MSG message. + + Note: this method handles multiple documents in a type one payload but + it does not perform batch splitting and the total message size is + only checked *after* generating the entire message. + """ + # Encode the command document in payload 0 without checking keys. + encoded = _dict_to_bson(command, False, opts) + flags_type = _pack_op_msg_flags_type(flags, 0) + total_size = len(encoded) + max_doc_size = 0 + if identifier: + type_one = _pack_byte(1) + cstring = _make_c_string(identifier) + encoded_docs = [_dict_to_bson(doc, check_keys, opts) for doc in docs] + size = len(cstring) + sum(len(doc) for doc in encoded_docs) + 4 + encoded_size = _pack_int(size) + total_size += size + max_doc_size = max(len(doc) for doc in encoded_docs) + data = ([flags_type, encoded, type_one, encoded_size, cstring] + + encoded_docs) + else: + data = [flags_type, encoded] + return b''.join(data), total_size, max_doc_size + + +def _op_msg_compressed(flags, command, identifier, docs, check_keys, opts, + ctx): + """Internal OP_MSG message helper.""" + msg, total_size, max_bson_size = _op_msg_no_header( + flags, command, identifier, docs, check_keys, opts) + rid, msg = _compress(2013, msg, ctx) + return rid, msg, total_size, max_bson_size + + +def _op_msg_uncompressed(flags, command, identifier, docs, check_keys, opts): + """Internal compressed OP_MSG message helper.""" + data, total_size, max_bson_size = _op_msg_no_header( + flags, command, identifier, docs, check_keys, opts) + request_id, op_message = __pack_message(2013, data) + return request_id, op_message, total_size, max_bson_size +if _use_c: + _op_msg_uncompressed = _cmessage._op_msg + + +def _op_msg(flags, command, dbname, read_preference, slave_ok, check_keys, + opts, ctx=None): + """Get a OP_MSG message.""" + command['$db'] = dbname + if "$readPreference" not in command: + if slave_ok and not read_preference.mode: + command["$readPreference"] = ( + ReadPreference.PRIMARY_PREFERRED.document) + else: + command["$readPreference"] = read_preference.document + name = next(iter(command)) + try: + identifier = _FIELD_MAP.get(name) + docs = command.pop(identifier) + except KeyError: + identifier = "" + docs = None + try: + if ctx: + return _op_msg_compressed( + flags, command, identifier, docs, check_keys, opts, ctx) + return _op_msg_uncompressed( + flags, command, identifier, docs, check_keys, opts) + finally: + # Add the field back to the command. + if identifier: + command[identifier] = docs + + +def _query(options, collection_name, num_to_skip, + num_to_return, query, field_selector, opts, check_keys): + """Get an OP_QUERY message.""" + encoded = _dict_to_bson(query, check_keys, opts) + if field_selector: + efs = _dict_to_bson(field_selector, False, opts) + else: + efs = b"" + max_bson_size = max(len(encoded), len(efs)) + return b"".join([ + _pack_int(options), + _make_c_string(collection_name), + _pack_int(num_to_skip), + _pack_int(num_to_return), + encoded, + efs]), max_bson_size + + +def _query_compressed(options, collection_name, num_to_skip, + num_to_return, query, field_selector, + opts, check_keys=False, ctx=None): + """Internal compressed query message helper.""" + op_query, max_bson_size = _query( + options, + collection_name, + num_to_skip, + num_to_return, + query, + field_selector, + opts, + check_keys) + rid, msg = _compress(2004, op_query, ctx) + return rid, msg, max_bson_size + + +def _query_uncompressed(options, collection_name, num_to_skip, + num_to_return, query, field_selector, opts, check_keys=False): + """Internal query message helper.""" + op_query, max_bson_size = _query( + options, + collection_name, + num_to_skip, + num_to_return, + query, + field_selector, + opts, + check_keys) + rid, msg = __pack_message(2004, op_query) + return rid, msg, max_bson_size +if _use_c: + _query_uncompressed = _cmessage._query_message + + +def query(options, collection_name, num_to_skip, num_to_return, + query, field_selector, opts, check_keys=False, ctx=None): + """Get a **query** message.""" + if ctx: + return _query_compressed(options, collection_name, num_to_skip, + num_to_return, query, field_selector, + opts, check_keys, ctx) + return _query_uncompressed(options, collection_name, num_to_skip, + num_to_return, query, field_selector, opts, + check_keys) + + +_pack_long_long = struct.Struct("<q").pack + + +def _get_more(collection_name, num_to_return, cursor_id): + """Get an OP_GET_MORE message.""" + return b"".join([ + _ZERO_32, + _make_c_string(collection_name), + _pack_int(num_to_return), + _pack_long_long(cursor_id)]) + + +def _get_more_compressed(collection_name, num_to_return, cursor_id, ctx): + """Internal compressed getMore message helper.""" + return _compress( + 2005, _get_more(collection_name, num_to_return, cursor_id), ctx) + + +def _get_more_uncompressed(collection_name, num_to_return, cursor_id): + """Internal getMore message helper.""" + return __pack_message( + 2005, _get_more(collection_name, num_to_return, cursor_id)) +if _use_c: + _get_more_uncompressed = _cmessage._get_more_message + + +def get_more(collection_name, num_to_return, cursor_id, ctx=None): + """Get a **getMore** message.""" + if ctx: + return _get_more_compressed( + collection_name, num_to_return, cursor_id, ctx) + return _get_more_uncompressed(collection_name, num_to_return, cursor_id) + + +def _delete(collection_name, spec, opts, flags): + """Get an OP_DELETE message.""" + encoded = _dict_to_bson(spec, False, opts) # Uses extensions. + return b"".join([ + _ZERO_32, + _make_c_string(collection_name), + _pack_int(flags), + encoded]), len(encoded) + + +def _delete_compressed(collection_name, spec, opts, flags, ctx): + """Internal compressed unacknowledged delete message helper.""" + op_delete, max_bson_size = _delete(collection_name, spec, opts, flags) + rid, msg = _compress(2006, op_delete, ctx) + return rid, msg, max_bson_size + + +def _delete_uncompressed( + collection_name, spec, safe, last_error_args, opts, flags=0): + """Internal delete message helper.""" + op_delete, max_bson_size = _delete(collection_name, spec, opts, flags) + rid, msg = __pack_message(2006, op_delete) + if safe: + rid, gle, _ = __last_error(collection_name, last_error_args) + return rid, msg + gle, max_bson_size + return rid, msg, max_bson_size + + +def delete( + collection_name, spec, safe, last_error_args, opts, flags=0, ctx=None): + """Get a **delete** message. + + `opts` is a CodecOptions. `flags` is a bit vector that may contain + the SingleRemove flag or not: + + http://docs.mongodb.org/meta-driver/latest/legacy/mongodb-wire-protocol/#op-delete + """ + if ctx: + return _delete_compressed(collection_name, spec, opts, flags, ctx) + return _delete_uncompressed( + collection_name, spec, safe, last_error_args, opts, flags) + + +def kill_cursors(cursor_ids): + """Get a **killCursors** message. + """ + num_cursors = len(cursor_ids) + pack = struct.Struct("<ii" + ("q" * num_cursors)).pack + op_kill_cursors = pack(0, num_cursors, *cursor_ids) + return __pack_message(2007, op_kill_cursors) + + +class _BulkWriteContext(object): + """A wrapper around SocketInfo for use with write splitting functions.""" + + __slots__ = ('db_name', 'command', 'sock_info', 'op_id', + 'name', 'field', 'publish', 'start_time', 'listeners', + 'session', 'compress') + + def __init__(self, database_name, command, sock_info, operation_id, + listeners, session): + self.db_name = database_name + self.command = command + self.sock_info = sock_info + self.op_id = operation_id + self.listeners = listeners + self.publish = listeners.enabled_for_commands + self.name = next(iter(command)) + self.field = _FIELD_MAP[self.name] + self.start_time = datetime.datetime.now() if self.publish else None + self.session = session + self.compress = True if sock_info.compression_context else False + + @property + def max_bson_size(self): + """A proxy for SockInfo.max_bson_size.""" + return self.sock_info.max_bson_size + + @property + def max_message_size(self): + """A proxy for SockInfo.max_message_size.""" + return self.sock_info.max_message_size + + @property + def max_write_batch_size(self): + """A proxy for SockInfo.max_write_batch_size.""" + return self.sock_info.max_write_batch_size + + def legacy_bulk_insert( + self, request_id, msg, max_doc_size, acknowledged, docs, compress): + if compress: + request_id, msg = _compress( + 2002, msg, self.sock_info.compression_context) + return self.legacy_write( + request_id, msg, max_doc_size, acknowledged, docs) + + def legacy_write(self, request_id, msg, max_doc_size, acknowledged, docs): + """A proxy for SocketInfo.legacy_write that handles event publishing. + """ + if self.publish: + duration = datetime.datetime.now() - self.start_time + cmd = self._start(request_id, docs) + start = datetime.datetime.now() + try: + result = self.sock_info.legacy_write( + request_id, msg, max_doc_size, acknowledged) + if self.publish: + duration = (datetime.datetime.now() - start) + duration + if result is not None: + reply = _convert_write_result(self.name, cmd, result) + else: + # Comply with APM spec. + reply = {'ok': 1} + self._succeed(request_id, reply, duration) + except OperationFailure as exc: + if self.publish: + duration = (datetime.datetime.now() - start) + duration + self._fail( + request_id, + _convert_write_result( + self.name, cmd, exc.details), + duration) + raise + finally: + self.start_time = datetime.datetime.now() + return result + + def write_command(self, request_id, msg, docs): + """A proxy for SocketInfo.write_command that handles event publishing. + """ + if self.publish: + duration = datetime.datetime.now() - self.start_time + self._start(request_id, docs) + start = datetime.datetime.now() + try: + reply = self.sock_info.write_command(request_id, msg) + if self.publish: + duration = (datetime.datetime.now() - start) + duration + self._succeed(request_id, reply, duration) + except OperationFailure as exc: + if self.publish: + duration = (datetime.datetime.now() - start) + duration + self._fail(request_id, exc.details, duration) + raise + finally: + self.start_time = datetime.datetime.now() + return reply + + def _start(self, request_id, docs): + """Publish a CommandStartedEvent.""" + cmd = self.command.copy() + cmd[self.field] = docs + self.listeners.publish_command_start( + cmd, self.db_name, + request_id, self.sock_info.address, self.op_id) + return cmd + + def _succeed(self, request_id, reply, duration): + """Publish a CommandSucceededEvent.""" + self.listeners.publish_command_success( + duration, reply, self.name, + request_id, self.sock_info.address, self.op_id) + + def _fail(self, request_id, failure, duration): + """Publish a CommandFailedEvent.""" + self.listeners.publish_command_failure( + duration, failure, self.name, + request_id, self.sock_info.address, self.op_id) + + +def _raise_document_too_large(operation, doc_size, max_size): + """Internal helper for raising DocumentTooLarge.""" + if operation == "insert": + raise DocumentTooLarge("BSON document too large (%d bytes)" + " - the connected server supports" + " BSON document sizes up to %d" + " bytes." % (doc_size, max_size)) + else: + # There's nothing intelligent we can say + # about size for update and delete + raise DocumentTooLarge("%r command document too large" % (operation,)) + + +def _do_batched_insert(collection_name, docs, check_keys, + safe, last_error_args, continue_on_error, opts, + ctx): + """Insert `docs` using multiple batches. + """ + def _insert_message(insert_message, send_safe): + """Build the insert message with header and GLE. + """ + request_id, final_message = __pack_message(2002, insert_message) + if send_safe: + request_id, error_message, _ = __last_error(collection_name, + last_error_args) + final_message += error_message + return request_id, final_message + + send_safe = safe or not continue_on_error + last_error = None + data = StringIO() + data.write(struct.pack("<i", int(continue_on_error))) + data.write(_make_c_string(collection_name)) + message_length = begin_loc = data.tell() + has_docs = False + to_send = [] + encode = _dict_to_bson # Make local + compress = ctx.compress and not (safe or send_safe) + for doc in docs: + encoded = encode(doc, check_keys, opts) + encoded_length = len(encoded) + too_large = (encoded_length > ctx.max_bson_size) + + message_length += encoded_length + if message_length < ctx.max_message_size and not too_large: + data.write(encoded) + to_send.append(doc) + has_docs = True + continue + + if has_docs: + # We have enough data, send this message. + try: + if compress: + rid, msg = None, data.getvalue() + else: + rid, msg = _insert_message(data.getvalue(), send_safe) + ctx.legacy_bulk_insert( + rid, msg, 0, send_safe, to_send, compress) + # Exception type could be OperationFailure or a subtype + # (e.g. DuplicateKeyError) + except OperationFailure as exc: + # Like it says, continue on error... + if continue_on_error: + # Store exception details to re-raise after the final batch. + last_error = exc + # With unacknowledged writes just return at the first error. + elif not safe: + return + # With acknowledged writes raise immediately. + else: + raise + + if too_large: + _raise_document_too_large( + "insert", encoded_length, ctx.max_bson_size) + + message_length = begin_loc + encoded_length + data.seek(begin_loc) + data.truncate() + data.write(encoded) + to_send = [doc] + + if not has_docs: + raise InvalidOperation("cannot do an empty bulk insert") + + if compress: + request_id, msg = None, data.getvalue() + else: + request_id, msg = _insert_message(data.getvalue(), safe) + ctx.legacy_bulk_insert(request_id, msg, 0, safe, to_send, compress) + + # Re-raise any exception stored due to continue_on_error + if last_error is not None: + raise last_error +if _use_c: + _do_batched_insert = _cmessage._do_batched_insert + +# OP_MSG ------------------------------------------------------------- + + +_OP_MSG_MAP = { + _INSERT: b'documents\x00', + _UPDATE: b'updates\x00', + _DELETE: b'deletes\x00', +} + + +def _batched_op_msg_impl( + operation, command, docs, check_keys, ack, opts, ctx, buf): + """Create a batched OP_MSG write.""" + max_bson_size = ctx.max_bson_size + max_write_batch_size = ctx.max_write_batch_size + max_message_size = ctx.max_message_size + + flags = b"\x00\x00\x00\x00" if ack else b"\x02\x00\x00\x00" + # Flags + buf.write(flags) + + # Type 0 Section + buf.write(b"\x00") + buf.write(_dict_to_bson(command, False, opts)) + + # Type 1 Section + buf.write(b"\x01") + size_location = buf.tell() + # Save space for size + buf.write(b"\x00\x00\x00\x00") + try: + buf.write(_OP_MSG_MAP[operation]) + except KeyError: + raise InvalidOperation('Unknown command') + + if operation in (_UPDATE, _DELETE): + check_keys = False + + to_send = [] + idx = 0 + for doc in docs: + # Encode the current operation + value = _dict_to_bson(doc, check_keys, opts) + doc_length = len(value) + new_message_size = buf.tell() + doc_length + # Does first document exceed max_message_size? + doc_too_large = (idx == 0 and (new_message_size > max_message_size)) + # When OP_MSG is used unacknowleged we have to check + # document size client side or applications won't be notified. + # Otherwise we let the server deal with documents that are too large + # since ordered=False causes those documents to be skipped instead of + # halting the bulk write operation. + unacked_doc_too_large = (not ack and (doc_length > max_bson_size)) + if doc_too_large or unacked_doc_too_large: + write_op = list(_FIELD_MAP.keys())[operation] + _raise_document_too_large( + write_op, len(value), max_bson_size) + # We have enough data, return this batch. + if new_message_size > max_message_size: + break + buf.write(value) + to_send.append(doc) + idx += 1 + # We have enough documents, return this batch. + if idx == max_write_batch_size: + break + + # Write type 1 section size + length = buf.tell() + buf.seek(size_location) + buf.write(_pack_int(length - size_location)) + + return to_send, length + + +def _encode_batched_op_msg( + operation, command, docs, check_keys, ack, opts, ctx): + """Encode the next batched insert, update, or delete operation + as OP_MSG. + """ + buf = StringIO() + + to_send, _ = _batched_op_msg_impl( + operation, command, docs, check_keys, ack, opts, ctx, buf) + return buf.getvalue(), to_send +if _use_c: + _encode_batched_op_msg = _cmessage._encode_batched_op_msg + + +def _batched_op_msg_compressed( + operation, command, docs, check_keys, ack, opts, ctx): + """Create the next batched insert, update, or delete operation + with OP_MSG, compressed. + """ + data, to_send = _encode_batched_op_msg( + operation, command, docs, check_keys, ack, opts, ctx) + + request_id, msg = _compress( + 2013, + data, + ctx.sock_info.compression_context) + return request_id, msg, to_send + + +def _batched_op_msg( + operation, command, docs, check_keys, ack, opts, ctx): + """OP_MSG implementation entry point.""" + buf = StringIO() + + # Save space for message length and request id + buf.write(_ZERO_64) + # responseTo, opCode + buf.write(b"\x00\x00\x00\x00\xdd\x07\x00\x00") + + to_send, length = _batched_op_msg_impl( + operation, command, docs, check_keys, ack, opts, ctx, buf) + + # Header - request id and message length + buf.seek(4) + request_id = _randint() + buf.write(_pack_int(request_id)) + buf.seek(0) + buf.write(_pack_int(length)) + + return request_id, buf.getvalue(), to_send +if _use_c: + _batched_op_msg = _cmessage._batched_op_msg + + +def _do_batched_op_msg( + namespace, operation, command, docs, check_keys, opts, ctx): + """Create the next batched insert, update, or delete operation + using OP_MSG. + """ + command['$db'] = namespace.split('.', 1)[0] + if 'writeConcern' in command: + ack = bool(command['writeConcern'].get('w', 1)) + else: + ack = True + if ctx.sock_info.compression_context: + return _batched_op_msg_compressed( + operation, command, docs, check_keys, ack, opts, ctx) + return _batched_op_msg( + operation, command, docs, check_keys, ack, opts, ctx) + + +# End OP_MSG ----------------------------------------------------- + + +def _batched_write_command_compressed( + namespace, operation, command, docs, check_keys, opts, ctx): + """Create the next batched insert, update, or delete command, compressed. + """ + data, to_send = _encode_batched_write_command( + namespace, operation, command, docs, check_keys, opts, ctx) + + request_id, msg = _compress( + 2004, + data, + ctx.sock_info.compression_context) + return request_id, msg, to_send + + +def _encode_batched_write_command( + namespace, operation, command, docs, check_keys, opts, ctx): + """Encode the next batched insert, update, or delete command. + """ + buf = StringIO() + + to_send, _ = _batched_write_command_impl( + namespace, operation, command, docs, check_keys, opts, ctx, buf) + return buf.getvalue(), to_send +if _use_c: + _encode_batched_write_command = _cmessage._encode_batched_write_command + + +def _batched_write_command( + namespace, operation, command, docs, check_keys, opts, ctx): + """Create the next batched insert, update, or delete command. + """ + buf = StringIO() + + # Save space for message length and request id + buf.write(_ZERO_64) + # responseTo, opCode + buf.write(b"\x00\x00\x00\x00\xd4\x07\x00\x00") + + # Write OP_QUERY write command + to_send, length = _batched_write_command_impl( + namespace, operation, command, docs, check_keys, opts, ctx, buf) + + # Header - request id and message length + buf.seek(4) + request_id = _randint() + buf.write(_pack_int(request_id)) + buf.seek(0) + buf.write(_pack_int(length)) + + return request_id, buf.getvalue(), to_send +if _use_c: + _batched_write_command = _cmessage._batched_write_command + + +def _do_batched_write_command( + namespace, operation, command, docs, check_keys, opts, ctx): + """Batched write commands entry point.""" + if ctx.sock_info.compression_context: + return _batched_write_command_compressed( + namespace, operation, command, docs, check_keys, opts, ctx) + return _batched_write_command( + namespace, operation, command, docs, check_keys, opts, ctx) + + +def _do_bulk_write_command( + namespace, operation, command, docs, check_keys, opts, ctx): + """Bulk write commands entry point.""" + if ctx.sock_info.max_wire_version > 5: + return _do_batched_op_msg( + namespace, operation, command, docs, check_keys, opts, ctx) + return _do_batched_write_command( + namespace, operation, command, docs, check_keys, opts, ctx) + + +def _batched_write_command_impl( + namespace, operation, command, docs, check_keys, opts, ctx, buf): + """Create a batched OP_QUERY write command.""" + max_bson_size = ctx.max_bson_size + max_write_batch_size = ctx.max_write_batch_size + # Max BSON object size + 16k - 2 bytes for ending NUL bytes. + # Server guarantees there is enough room: SERVER-10643. + max_cmd_size = max_bson_size + _COMMAND_OVERHEAD + + # No options + buf.write(_ZERO_32) + # Namespace as C string + buf.write(b(namespace)) + buf.write(_ZERO_8) + # Skip: 0, Limit: -1 + buf.write(_SKIPLIM) + + # Where to write command document length + command_start = buf.tell() + buf.write(bson.BSON.encode(command)) + + # Start of payload + buf.seek(-1, 2) + # Work around some Jython weirdness. + buf.truncate() + try: + buf.write(_OP_MAP[operation]) + except KeyError: + raise InvalidOperation('Unknown command') + + if operation in (_UPDATE, _DELETE): + check_keys = False + + # Where to write list document length + list_start = buf.tell() - 4 + to_send = [] + idx = 0 + for doc in docs: + # Encode the current operation + key = b(str(idx)) + value = bson.BSON.encode(doc, check_keys, opts) + # Is there enough room to add this document? max_cmd_size accounts for + # the two trailing null bytes. + enough_data = (buf.tell() + len(key) + len(value)) >= max_cmd_size + enough_documents = (idx >= max_write_batch_size) + if enough_data or enough_documents: + if not idx: + write_op = list(_FIELD_MAP.keys())[operation] + _raise_document_too_large( + write_op, len(value), max_bson_size) + break + buf.write(_BSONOBJ) + buf.write(key) + buf.write(_ZERO_8) + buf.write(value) + to_send.append(doc) + idx += 1 + + # Finalize the current OP_QUERY message. + # Close list and command documents + buf.write(_ZERO_16) + + # Write document lengths and request id + length = buf.tell() + buf.seek(list_start) + buf.write(_pack_int(length - list_start - 1)) + buf.seek(command_start) + buf.write(_pack_int(length - command_start)) + + return to_send, length + + +class _OpReply(object): + """A MongoDB OP_REPLY response message.""" + + __slots__ = ("flags", "cursor_id", "number_returned", "documents") + + UNPACK_FROM = struct.Struct("<iqii").unpack_from + OP_CODE = 1 + + def __init__(self, flags, cursor_id, number_returned, documents): + self.flags = flags + self.cursor_id = cursor_id + self.number_returned = number_returned + self.documents = documents + + def raw_response(self, cursor_id=None): + """Check the response header from the database, without decoding BSON. + + Check the response for errors and unpack. + + Can raise CursorNotFound, NotMasterError, ExecutionTimeout, or + OperationFailure. + + :Parameters: + - `cursor_id` (optional): cursor_id we sent to get this response - + used for raising an informative exception when we get cursor id not + valid at server response. + """ + if self.flags & 1: + # Shouldn't get this response if we aren't doing a getMore + if cursor_id is None: + raise ProtocolError("No cursor id for getMore operation") + + # Fake a getMore command response. OP_GET_MORE provides no + # document. + msg = "Cursor not found, cursor id: %d" % (cursor_id,) + errobj = {"ok": 0, "errmsg": msg, "code": 43} + raise CursorNotFound(msg, 43, errobj) + elif self.flags & 2: + error_object = bson.BSON(self.documents).decode() + # Fake the ok field if it doesn't exist. + error_object.setdefault("ok", 0) + if error_object["$err"].startswith("not master"): + raise NotMasterError(error_object["$err"], error_object) + elif error_object.get("code") == 50: + raise ExecutionTimeout(error_object.get("$err"), + error_object.get("code"), + error_object) + raise OperationFailure("database error: %s" % + error_object.get("$err"), + error_object.get("code"), + error_object) + return [self.documents] + + def unpack_response(self, cursor_id=None, + codec_options=_UNICODE_REPLACE_CODEC_OPTIONS, + user_fields=None, legacy_response=False): + """Unpack a response from the database and decode the BSON document(s). + + Check the response for errors and unpack, returning a dictionary + containing the response data. + + Can raise CursorNotFound, NotMasterError, ExecutionTimeout, or + OperationFailure. + + :Parameters: + - `cursor_id` (optional): cursor_id we sent to get this response - + used for raising an informative exception when we get cursor id not + valid at server response + - `codec_options` (optional): an instance of + :class:`~bson.codec_options.CodecOptions` + """ + self.raw_response(cursor_id) + if legacy_response: + return bson.decode_all(self.documents, codec_options) + return bson._decode_all_selective( + self.documents, codec_options, user_fields) + + def command_response(self): + """Unpack a command response.""" + docs = self.unpack_response() + assert self.number_returned == 1 + return docs[0] + + @classmethod + def unpack(cls, msg): + """Construct an _OpReply from raw bytes.""" + # PYTHON-945: ignore starting_from field. + flags, cursor_id, _, number_returned = cls.UNPACK_FROM(msg) + + # Convert Python 3 memoryview to bytes. Note we should call + # memoryview.tobytes() if we start using memoryview in Python 2.7. + documents = bytes(msg[20:]) + return cls(flags, cursor_id, number_returned, documents) + + +class _OpMsg(object): + """A MongoDB OP_MSG response message.""" + + __slots__ = ("flags", "cursor_id", "number_returned", "payload_document") + + UNPACK_FROM = struct.Struct("<IBi").unpack_from + OP_CODE = 2013 + + def __init__(self, flags, payload_document): + self.flags = flags + self.payload_document = payload_document + + def raw_response(self, cursor_id=None): + raise NotImplementedError + + def unpack_response(self, cursor_id=None, + codec_options=_UNICODE_REPLACE_CODEC_OPTIONS, + user_fields=None, legacy_response=False): + """Unpack a OP_MSG command response. + + :Parameters: + - `cursor_id` (optional): Ignored, for compatibility with _OpReply. + - `codec_options` (optional): an instance of + :class:`~bson.codec_options.CodecOptions` + """ + # If _OpMsg is in-use, this cannot be a legacy response. + assert not legacy_response + return bson._decode_all_selective( + self.payload_document, codec_options, user_fields) + + def command_response(self): + """Unpack a command response.""" + return self.unpack_response()[0] + + @classmethod + def unpack(cls, msg): + """Construct an _OpMsg from raw bytes.""" + flags, first_payload_type, first_payload_size = cls.UNPACK_FROM(msg) + if flags != 0: + raise ProtocolError("Unsupported OP_MSG flags (%r)" % (flags,)) + if first_payload_type != 0: + raise ProtocolError( + "Unsupported OP_MSG payload type (%r)" % (first_payload_type,)) + + if len(msg) != first_payload_size + 5: + raise ProtocolError("Unsupported OP_MSG reply: >1 section") + + # Convert Python 3 memoryview to bytes. Note we should call + # memoryview.tobytes() if we start using memoryview in Python 2.7. + payload_document = bytes(msg[5:]) + return cls(flags, payload_document) + + +_UNPACK_REPLY = { + _OpReply.OP_CODE: _OpReply.unpack, + _OpMsg.OP_CODE: _OpMsg.unpack, +} + + +def _first_batch(sock_info, db, coll, query, ntoreturn, + slave_ok, codec_options, read_preference, cmd, listeners): + """Simple query helper for retrieving a first (and possibly only) batch.""" + query = _Query( + 0, db, coll, 0, query, None, codec_options, + read_preference, ntoreturn, 0, DEFAULT_READ_CONCERN, None, None, + None) + + name = next(iter(cmd)) + publish = listeners.enabled_for_commands + if publish: + start = datetime.datetime.now() + + request_id, msg, max_doc_size = query.get_message(slave_ok, sock_info) + + if publish: + encoding_duration = datetime.datetime.now() - start + listeners.publish_command_start( + cmd, db, request_id, sock_info.address) + start = datetime.datetime.now() + + sock_info.send_message(msg, max_doc_size) + reply = sock_info.receive_message(request_id) + try: + docs = reply.unpack_response(None, codec_options) + except Exception as exc: + if publish: + duration = (datetime.datetime.now() - start) + encoding_duration + if isinstance(exc, (NotMasterError, OperationFailure)): + failure = exc.details + else: + failure = _convert_exception(exc) + listeners.publish_command_failure( + duration, failure, name, request_id, sock_info.address) + raise + # listIndexes + if 'cursor' in cmd: + result = { + u'cursor': { + u'firstBatch': docs, + u'id': reply.cursor_id, + u'ns': u'%s.%s' % (db, coll) + }, + u'ok': 1.0 + } + # fsyncUnlock, currentOp + else: + result = docs[0] if docs else {} + result[u'ok'] = 1.0 + if publish: + duration = (datetime.datetime.now() - start) + encoding_duration + listeners.publish_command_success( + duration, result, name, request_id, sock_info.address) + + return result diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/mongo_client.py b/mongo_mac/lib/python3.6/site-packages/pymongo/mongo_client.py new file mode 100644 index 0000000..bbb2624 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/mongo_client.py @@ -0,0 +1,1950 @@ +# Copyright 2009-present MongoDB, Inc. +# +# 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. + +"""Tools for connecting to MongoDB. + +.. seealso:: :doc:`/examples/high_availability` for examples of connecting + to replica sets or sets of mongos servers. + +To get a :class:`~pymongo.database.Database` instance from a +:class:`MongoClient` use either dictionary-style or attribute-style +access: + +.. doctest:: + + >>> from pymongo import MongoClient + >>> c = MongoClient() + >>> c.test_database + Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), u'test_database') + >>> c['test-database'] + Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), u'test-database') +""" + +import contextlib +import datetime +import threading +import warnings +import weakref + +from collections import defaultdict + +from bson.codec_options import DEFAULT_CODEC_OPTIONS, TypeRegistry +from bson.py3compat import (integer_types, + string_type) +from bson.son import SON +from pymongo import (common, + database, + helpers, + message, + periodic_executor, + uri_parser, + client_session) +from pymongo.change_stream import ClusterChangeStream +from pymongo.client_options import ClientOptions +from pymongo.command_cursor import CommandCursor +from pymongo.cursor_manager import CursorManager +from pymongo.errors import (AutoReconnect, + BulkWriteError, + ConfigurationError, + ConnectionFailure, + InvalidOperation, + NetworkTimeout, + NotMasterError, + OperationFailure, + PyMongoError, + ServerSelectionTimeoutError) +from pymongo.read_preferences import ReadPreference +from pymongo.server_selectors import (writable_preferred_server_selector, + writable_server_selector) +from pymongo.server_type import SERVER_TYPE +from pymongo.topology import Topology +from pymongo.topology_description import TOPOLOGY_TYPE +from pymongo.settings import TopologySettings +from pymongo.write_concern import DEFAULT_WRITE_CONCERN + + +class MongoClient(common.BaseObject): + """ + A client-side representation of a MongoDB cluster. + + Instances can represent either a standalone MongoDB server, a replica + set, or a sharded cluster. Instances of this class are responsible for + maintaining up-to-date state of the cluster, and possibly cache + resources related to this, including background threads for monitoring, + and connection pools. + """ + HOST = "localhost" + PORT = 27017 + # Define order to retrieve options from ClientOptions for __repr__. + # No host/port; these are retrieved from TopologySettings. + _constructor_args = ('document_class', 'tz_aware', 'connect') + + def __init__( + self, + host=None, + port=None, + document_class=dict, + tz_aware=None, + connect=None, + type_registry=None, + **kwargs): + """Client for a MongoDB instance, a replica set, or a set of mongoses. + + The client object is thread-safe and has connection-pooling built in. + If an operation fails because of a network error, + :class:`~pymongo.errors.ConnectionFailure` is raised and the client + reconnects in the background. Application code should handle this + exception (recognizing that the operation failed) and then continue to + execute. + + The `host` parameter can be a full `mongodb URI + <http://dochub.mongodb.org/core/connections>`_, in addition to + a simple hostname. It can also be a list of hostnames or + URIs. Any port specified in the host string(s) will override + the `port` parameter. If multiple mongodb URIs containing + database or auth information are passed, the last database, + username, and password present will be used. For username and + passwords reserved characters like ':', '/', '+' and '@' must be + percent encoded following RFC 2396:: + + try: + # Python 3.x + from urllib.parse import quote_plus + except ImportError: + # Python 2.x + from urllib import quote_plus + + uri = "mongodb://%s:%s@%s" % ( + quote_plus(user), quote_plus(password), host) + client = MongoClient(uri) + + Unix domain sockets are also supported. The socket path must be percent + encoded in the URI:: + + uri = "mongodb://%s:%s@%s" % ( + quote_plus(user), quote_plus(password), quote_plus(socket_path)) + client = MongoClient(uri) + + But not when passed as a simple hostname:: + + client = MongoClient('/tmp/mongodb-27017.sock') + + Starting with version 3.6, PyMongo supports mongodb+srv:// URIs. The + URI must include one, and only one, hostname. The hostname will be + resolved to one or more DNS `SRV records + <https://en.wikipedia.org/wiki/SRV_record>`_ which will be used + as the seed list for connecting to the MongoDB deployment. When using + SRV URIs, the `authSource` and `replicaSet` configuration options can + be specified using `TXT records + <https://en.wikipedia.org/wiki/TXT_record>`_. See the + `Initial DNS Seedlist Discovery spec + <https://github.com/mongodb/specifications/blob/master/source/ + initial-dns-seedlist-discovery/initial-dns-seedlist-discovery.rst>`_ + for more details. Note that the use of SRV URIs implicitly enables + TLS support. Pass ssl=false in the URI to override. + + .. note:: MongoClient creation will block waiting for answers from + DNS when mongodb+srv:// URIs are used. + + .. note:: Starting with version 3.0 the :class:`MongoClient` + constructor no longer blocks while connecting to the server or + servers, and it no longer raises + :class:`~pymongo.errors.ConnectionFailure` if they are + unavailable, nor :class:`~pymongo.errors.ConfigurationError` + if the user's credentials are wrong. Instead, the constructor + returns immediately and launches the connection process on + background threads. You can check if the server is available + like this:: + + from pymongo.errors import ConnectionFailure + client = MongoClient() + try: + # The ismaster command is cheap and does not require auth. + client.admin.command('ismaster') + except ConnectionFailure: + print("Server not available") + + .. warning:: When using PyMongo in a multiprocessing context, please + read :ref:`multiprocessing` first. + + :Parameters: + - `host` (optional): hostname or IP address or Unix domain socket + path of a single mongod or mongos instance to connect to, or a + mongodb URI, or a list of hostnames / mongodb URIs. If `host` is + an IPv6 literal it must be enclosed in '[' and ']' characters + following the RFC2732 URL syntax (e.g. '[::1]' for localhost). + Multihomed and round robin DNS addresses are **not** supported. + - `port` (optional): port number on which to connect + - `document_class` (optional): default class to use for + documents returned from queries on this client + - `type_registry` (optional): instance of + :class:`~bson.codec_options.TypeRegistry` to enable encoding + and decoding of custom types. + - `tz_aware` (optional): if ``True``, + :class:`~datetime.datetime` instances returned as values + in a document by this :class:`MongoClient` will be timezone + aware (otherwise they will be naive) + - `connect` (optional): if ``True`` (the default), immediately + begin connecting to MongoDB in the background. Otherwise connect + on the first operation. + + | **Other optional parameters can be passed as keyword arguments:** + + - `maxPoolSize` (optional): The maximum allowable number of + concurrent connections to each connected server. Requests to a + server will block if there are `maxPoolSize` outstanding + connections to the requested server. Defaults to 100. Cannot be 0. + - `minPoolSize` (optional): The minimum required number of concurrent + connections that the pool will maintain to each connected server. + Default is 0. + - `maxIdleTimeMS` (optional): The maximum number of milliseconds that + a connection can remain idle in the pool before being removed and + replaced. Defaults to `None` (no limit). + - `socketTimeoutMS`: (integer or None) Controls how long (in + milliseconds) the driver will wait for a response after sending an + ordinary (non-monitoring) database operation before concluding that + a network error has occurred. Defaults to ``None`` (no timeout). + - `connectTimeoutMS`: (integer or None) Controls how long (in + milliseconds) the driver will wait during server monitoring when + connecting a new socket to a server before concluding the server + is unavailable. Defaults to ``20000`` (20 seconds). + - `server_selector`: (callable or None) Optional, user-provided + function that augments server selection rules. The function should + accept as an argument a list of + :class:`~pymongo.server_description.ServerDescription` objects and + return a list of server descriptions that should be considered + suitable for the desired operation. + - `serverSelectionTimeoutMS`: (integer) Controls how long (in + milliseconds) the driver will wait to find an available, + appropriate server to carry out a database operation; while it is + waiting, multiple server monitoring operations may be carried out, + each controlled by `connectTimeoutMS`. Defaults to ``30000`` (30 + seconds). + - `waitQueueTimeoutMS`: (integer or None) How long (in milliseconds) + a thread will wait for a socket from the pool if the pool has no + free sockets. Defaults to ``None`` (no timeout). + - `waitQueueMultiple`: (integer or None) Multiplied by maxPoolSize + to give the number of threads allowed to wait for a socket at one + time. Defaults to ``None`` (no limit). + - `heartbeatFrequencyMS`: (optional) The number of milliseconds + between periodic server checks, or None to accept the default + frequency of 10 seconds. + - `appname`: (string or None) The name of the application that + created this MongoClient instance. MongoDB 3.4 and newer will + print this value in the server log upon establishing each + connection. It is also recorded in the slow query log and + profile collections. + - `driver`: (pair or None) A driver implemented on top of PyMongo can + pass a :class:`~pymongo.driver_info.DriverInfo` to add its name, + version, and platform to the message printed in the server log when + establishing a connection. + - `event_listeners`: a list or tuple of event listeners. See + :mod:`~pymongo.monitoring` for details. + - `retryWrites`: (boolean) Whether supported write operations + executed within this MongoClient will be retried once after a + network error on MongoDB 3.6+. Defaults to ``False``. + The supported write operations are: + + - :meth:`~pymongo.collection.Collection.bulk_write`, as long as + :class:`~pymongo.operations.UpdateMany` or + :class:`~pymongo.operations.DeleteMany` are not included. + - :meth:`~pymongo.collection.Collection.delete_one` + - :meth:`~pymongo.collection.Collection.insert_one` + - :meth:`~pymongo.collection.Collection.insert_many` + - :meth:`~pymongo.collection.Collection.replace_one` + - :meth:`~pymongo.collection.Collection.update_one` + - :meth:`~pymongo.collection.Collection.find_one_and_delete` + - :meth:`~pymongo.collection.Collection.find_one_and_replace` + - :meth:`~pymongo.collection.Collection.find_one_and_update` + + Unsupported write operations include, but are not limited to, + :meth:`~pymongo.collection.Collection.aggregate` using the ``$out`` + pipeline operator and any operation with an unacknowledged write + concern (e.g. {w: 0})). See + https://github.com/mongodb/specifications/blob/master/source/retryable-writes/retryable-writes.rst + - `socketKeepAlive`: (boolean) **DEPRECATED** Whether to send + periodic keep-alive packets on connected sockets. Defaults to + ``True``. Disabling it is not recommended, see + https://docs.mongodb.com/manual/faq/diagnostics/#does-tcp-keepalive-time-affect-mongodb-deployments", + - `compressors`: Comma separated list of compressors for wire + protocol compression. The list is used to negotiate a compressor + with the server. Currently supported options are "snappy" and + "zlib". Support for snappy requires the + `python-snappy <https://pypi.org/project/python-snappy/>`_ package. + zlib support requires the Python standard library zlib module. + By default no compression is used. Compression support must also be + enabled on the server. MongoDB 3.4+ supports snappy compression. + MongoDB 3.6+ supports snappy and zlib. + - `zlibCompressionLevel`: (int) The zlib compression level to use + when zlib is used as the wire protocol compressor. Supported values + are -1 through 9. -1 tells the zlib library to use its default + compression level (usually 6). 0 means no compression. 1 is best + speed. 9 is best compression. Defaults to -1. + - `uuidRepresentation`: The BSON representation to use when encoding + from and decoding to instances of :class:`~uuid.UUID`. Valid + values are `pythonLegacy` (the default), `javaLegacy`, + `csharpLegacy` and `standard`. New applications should consider + setting this to `standard` for cross language compatibility. + + | **Write Concern options:** + | (Only set if passed. No default values.) + + - `w`: (integer or string) If this is a replica set, write operations + will block until they have been replicated to the specified number + or tagged set of servers. `w=<int>` always includes the replica set + primary (e.g. w=3 means write to the primary and wait until + replicated to **two** secondaries). Passing w=0 **disables write + acknowledgement** and all other write concern options. + - `wtimeout`: (integer) Used in conjunction with `w`. Specify a value + in milliseconds to control how long to wait for write propagation + to complete. If replication does not complete in the given + timeframe, a timeout exception is raised. + - `j`: If ``True`` block until write operations have been committed + to the journal. Cannot be used in combination with `fsync`. Prior + to MongoDB 2.6 this option was ignored if the server was running + without journaling. Starting with MongoDB 2.6 write operations will + fail with an exception if this option is used when the server is + running without journaling. + - `fsync`: If ``True`` and the server is running without journaling, + blocks until the server has synced all data files to disk. If the + server is running with journaling, this acts the same as the `j` + option, blocking until write operations have been committed to the + journal. Cannot be used in combination with `j`. + + | **Replica set keyword arguments for connecting with a replica set + - either directly or via a mongos:** + + - `replicaSet`: (string or None) The name of the replica set to + connect to. The driver will verify that all servers it connects to + match this name. Implies that the hosts specified are a seed list + and the driver should attempt to find all members of the set. + Defaults to ``None``. + + | **Read Preference:** + + - `readPreference`: The replica set read preference for this client. + One of ``primary``, ``primaryPreferred``, ``secondary``, + ``secondaryPreferred``, or ``nearest``. Defaults to ``primary``. + - `readPreferenceTags`: Specifies a tag set as a comma-separated list + of colon-separated key-value pairs. For example ``dc:ny,rack:1``. + Defaults to ``None``. + - `maxStalenessSeconds`: (integer) The maximum estimated + length of time a replica set secondary can fall behind the primary + in replication before it will no longer be selected for operations. + Defaults to ``-1``, meaning no maximum. If maxStalenessSeconds + is set, it must be a positive integer greater than or equal to + 90 seconds. + + .. seealso:: :doc:`/examples/server_selection` + + | **Authentication:** + + - `username`: A string. + - `password`: A string. + + Although username and password must be percent-escaped in a MongoDB + URI, they must not be percent-escaped when passed as parameters. In + this example, both the space and slash special characters are passed + as-is:: + + MongoClient(username="user name", password="pass/word") + + - `authSource`: The database to authenticate on. Defaults to the + database specified in the URI, if provided, or to "admin". + - `authMechanism`: See :data:`~pymongo.auth.MECHANISMS` for options. + If no mechanism is specified, PyMongo automatically uses MONGODB-CR + when connected to a pre-3.0 version of MongoDB, SCRAM-SHA-1 when + connected to MongoDB 3.0 through 3.6, and negotiates the mechanism + to use (SCRAM-SHA-1 or SCRAM-SHA-256) when connected to MongoDB + 4.0+. + - `authMechanismProperties`: Used to specify authentication mechanism + specific options. To specify the service name for GSSAPI + authentication pass authMechanismProperties='SERVICE_NAME:<service + name>' + + .. seealso:: :doc:`/examples/authentication` + + | **SSL configuration:** + + - `ssl`: If ``True``, create the connection to the server using SSL. + Defaults to ``False``. + - `ssl_certfile`: The certificate file used to identify the local + connection against mongod. Implies ``ssl=True``. Defaults to + ``None``. + - `ssl_keyfile`: The private keyfile used to identify the local + connection against mongod. If included with the ``certfile`` then + only the ``ssl_certfile`` is needed. Implies ``ssl=True``. + Defaults to ``None``. + - `ssl_pem_passphrase`: The password or passphrase for decrypting + the private key in ``ssl_certfile`` or ``ssl_keyfile``. Only + necessary if the private key is encrypted. Only supported by python + 2.7.9+ (pypy 2.5.1+) and 3.3+. Defaults to ``None``. + - `ssl_cert_reqs`: Specifies whether a certificate is required from + the other side of the connection, and whether it will be validated + if provided. It must be one of the three values ``ssl.CERT_NONE`` + (certificates ignored), ``ssl.CERT_REQUIRED`` (certificates + required and validated), or ``ssl.CERT_OPTIONAL`` (the same as + CERT_REQUIRED, unless the server was configured to use anonymous + ciphers). If the value of this parameter is not ``ssl.CERT_NONE`` + and a value is not provided for ``ssl_ca_certs`` PyMongo will + attempt to load system provided CA certificates. If the python + version in use does not support loading system CA certificates + then the ``ssl_ca_certs`` parameter must point to a file of CA + certificates. Implies ``ssl=True``. Defaults to + ``ssl.CERT_REQUIRED`` if not provided and ``ssl=True``. + - `ssl_ca_certs`: The ca_certs file contains a set of concatenated + "certification authority" certificates, which are used to validate + certificates passed from the other end of the connection. + Implies ``ssl=True``. Defaults to ``None``. + - `ssl_crlfile`: The path to a PEM or DER formatted certificate + revocation list. Only supported by python 2.7.9+ (pypy 2.5.1+) + and 3.4+. Defaults to ``None``. + - `ssl_match_hostname`: If ``True`` (the default), and + `ssl_cert_reqs` is not ``ssl.CERT_NONE``, enables hostname + verification using the :func:`~ssl.match_hostname` function from + python's :mod:`~ssl` module. Think very carefully before setting + this to ``False`` as that could make your application vulnerable to + man-in-the-middle attacks. + + | **Read Concern options:** + | (If not set explicitly, this will use the server default) + + - `readConcernLevel`: (string) The read concern level specifies the + level of isolation for read operations. For example, a read + operation using a read concern level of ``majority`` will only + return data that has been written to a majority of nodes. If the + level is left unspecified, the server default will be used. + + .. mongodoc:: connections + + .. versionchanged:: 3.8 + Added the ``server_selector`` keyword argument. + Added the ``type_registry`` keyword argument. + + .. versionchanged:: 3.7 + Added the ``driver`` keyword argument. + + .. versionchanged:: 3.6 + Added support for mongodb+srv:// URIs. + Added the ``retryWrites`` keyword argument and URI option. + + .. versionchanged:: 3.5 + Add ``username`` and ``password`` options. Document the + ``authSource``, ``authMechanism``, and ``authMechanismProperties `` + options. + Deprecated the `socketKeepAlive` keyword argument and URI option. + `socketKeepAlive` now defaults to ``True``. + + .. versionchanged:: 3.0 + :class:`~pymongo.mongo_client.MongoClient` is now the one and only + client class for a standalone server, mongos, or replica set. + It includes the functionality that had been split into + :class:`~pymongo.mongo_client.MongoReplicaSetClient`: it can connect + to a replica set, discover all its members, and monitor the set for + stepdowns, elections, and reconfigs. + + The :class:`~pymongo.mongo_client.MongoClient` constructor no + longer blocks while connecting to the server or servers, and it no + longer raises :class:`~pymongo.errors.ConnectionFailure` if they + are unavailable, nor :class:`~pymongo.errors.ConfigurationError` + if the user's credentials are wrong. Instead, the constructor + returns immediately and launches the connection process on + background threads. + + Therefore the ``alive`` method is removed since it no longer + provides meaningful information; even if the client is disconnected, + it may discover a server in time to fulfill the next operation. + + In PyMongo 2.x, :class:`~pymongo.MongoClient` accepted a list of + standalone MongoDB servers and used the first it could connect to:: + + MongoClient(['host1.com:27017', 'host2.com:27017']) + + A list of multiple standalones is no longer supported; if multiple + servers are listed they must be members of the same replica set, or + mongoses in the same sharded cluster. + + The behavior for a list of mongoses is changed from "high + availability" to "load balancing". Before, the client connected to + the lowest-latency mongos in the list, and used it until a network + error prompted it to re-evaluate all mongoses' latencies and + reconnect to one of them. In PyMongo 3, the client monitors its + network latency to all the mongoses continuously, and distributes + operations evenly among those with the lowest latency. See + :ref:`mongos-load-balancing` for more information. + + The ``connect`` option is added. + + The ``start_request``, ``in_request``, and ``end_request`` methods + are removed, as well as the ``auto_start_request`` option. + + The ``copy_database`` method is removed, see the + :doc:`copy_database examples </examples/copydb>` for alternatives. + + The :meth:`MongoClient.disconnect` method is removed; it was a + synonym for :meth:`~pymongo.MongoClient.close`. + + :class:`~pymongo.mongo_client.MongoClient` no longer returns an + instance of :class:`~pymongo.database.Database` for attribute names + with leading underscores. You must use dict-style lookups instead:: + + client['__my_database__'] + + Not:: + + client.__my_database__ + """ + if host is None: + host = self.HOST + if isinstance(host, string_type): + host = [host] + if port is None: + port = self.PORT + if not isinstance(port, int): + raise TypeError("port must be an instance of int") + + seeds = set() + username = None + password = None + dbase = None + opts = {} + for entity in host: + if "://" in entity: + res = uri_parser.parse_uri(entity, port, warn=True) + seeds.update(res["nodelist"]) + username = res["username"] or username + password = res["password"] or password + dbase = res["database"] or dbase + opts = res["options"] + else: + seeds.update(uri_parser.split_hosts(entity, port)) + if not seeds: + raise ConfigurationError("need to specify at least one host") + + # _pool_class, _monitor_class, and _condition_class are for deep + # customization of PyMongo, e.g. Motor. + pool_class = kwargs.pop('_pool_class', None) + monitor_class = kwargs.pop('_monitor_class', None) + condition_class = kwargs.pop('_condition_class', None) + + keyword_opts = kwargs + keyword_opts['document_class'] = document_class + if type_registry is not None: + keyword_opts['type_registry'] = type_registry + if tz_aware is None: + tz_aware = opts.get('tz_aware', False) + if connect is None: + connect = opts.get('connect', True) + keyword_opts['tz_aware'] = tz_aware + keyword_opts['connect'] = connect + # Validate all keyword options. + keyword_opts = dict(common.validate(k, v) + for k, v in keyword_opts.items()) + opts.update(keyword_opts) + # Username and password passed as kwargs override user info in URI. + username = opts.get("username", username) + password = opts.get("password", password) + if 'socketkeepalive' in opts: + warnings.warn( + "The socketKeepAlive option is deprecated. It now" + "defaults to true and disabling it is not recommended, see " + "https://docs.mongodb.com/manual/faq/diagnostics/" + "#does-tcp-keepalive-time-affect-mongodb-deployments", + DeprecationWarning, stacklevel=2) + self.__options = options = ClientOptions( + username, password, dbase, opts) + + self.__default_database_name = dbase + self.__lock = threading.Lock() + self.__cursor_manager = None + self.__kill_cursors_queue = [] + + self._event_listeners = options.pool_options.event_listeners + + # Cache of existing indexes used by ensure_index ops. + self.__index_cache = {} + self.__index_cache_lock = threading.Lock() + + super(MongoClient, self).__init__(options.codec_options, + options.read_preference, + options.write_concern, + options.read_concern) + + self.__all_credentials = {} + creds = options.credentials + if creds: + self._cache_credentials(creds.source, creds) + + self._topology_settings = TopologySettings( + seeds=seeds, + replica_set_name=options.replica_set_name, + pool_class=pool_class, + pool_options=options.pool_options, + monitor_class=monitor_class, + condition_class=condition_class, + local_threshold_ms=options.local_threshold_ms, + server_selection_timeout=options.server_selection_timeout, + server_selector=options.server_selector, + heartbeat_frequency=options.heartbeat_frequency) + + self._topology = Topology(self._topology_settings) + if connect: + self._topology.open() + + def target(): + client = self_ref() + if client is None: + return False # Stop the executor. + MongoClient._process_periodic_tasks(client) + return True + + executor = periodic_executor.PeriodicExecutor( + interval=common.KILL_CURSOR_FREQUENCY, + min_interval=0.5, + target=target, + name="pymongo_kill_cursors_thread") + + # We strongly reference the executor and it weakly references us via + # this closure. When the client is freed, stop the executor soon. + self_ref = weakref.ref(self, executor.close) + self._kill_cursors_executor = executor + executor.open() + + def _cache_credentials(self, source, credentials, connect=False): + """Save a set of authentication credentials. + + The credentials are used to login a socket whenever one is created. + If `connect` is True, verify the credentials on the server first. + """ + # Don't let other threads affect this call's data. + all_credentials = self.__all_credentials.copy() + + if source in all_credentials: + # Nothing to do if we already have these credentials. + if credentials == all_credentials[source]: + return + raise OperationFailure('Another user is already authenticated ' + 'to this database. You must logout first.') + + if connect: + server = self._get_topology().select_server( + writable_preferred_server_selector) + + # get_socket() logs out of the database if logged in with old + # credentials, and logs in with new ones. + with server.get_socket(all_credentials) as sock_info: + sock_info.authenticate(credentials) + + # If several threads run _cache_credentials at once, last one wins. + self.__all_credentials[source] = credentials + + def _purge_credentials(self, source): + """Purge credentials from the authentication cache.""" + self.__all_credentials.pop(source, None) + + def _cached(self, dbname, coll, index): + """Test if `index` is cached.""" + cache = self.__index_cache + now = datetime.datetime.utcnow() + with self.__index_cache_lock: + return (dbname in cache and + coll in cache[dbname] and + index in cache[dbname][coll] and + now < cache[dbname][coll][index]) + + def _cache_index(self, dbname, collection, index, cache_for): + """Add an index to the index cache for ensure_index operations.""" + now = datetime.datetime.utcnow() + expire = datetime.timedelta(seconds=cache_for) + now + + with self.__index_cache_lock: + if dbname not in self.__index_cache: + self.__index_cache[dbname] = {} + self.__index_cache[dbname][collection] = {} + self.__index_cache[dbname][collection][index] = expire + + elif collection not in self.__index_cache[dbname]: + self.__index_cache[dbname][collection] = {} + self.__index_cache[dbname][collection][index] = expire + + else: + self.__index_cache[dbname][collection][index] = expire + + def _purge_index(self, database_name, + collection_name=None, index_name=None): + """Purge an index from the index cache. + + If `index_name` is None purge an entire collection. + + If `collection_name` is None purge an entire database. + """ + with self.__index_cache_lock: + if not database_name in self.__index_cache: + return + + if collection_name is None: + del self.__index_cache[database_name] + return + + if not collection_name in self.__index_cache[database_name]: + return + + if index_name is None: + del self.__index_cache[database_name][collection_name] + return + + if index_name in self.__index_cache[database_name][collection_name]: + del self.__index_cache[database_name][collection_name][index_name] + + def _server_property(self, attr_name): + """An attribute of the current server's description. + + If the client is not connected, this will block until a connection is + established or raise ServerSelectionTimeoutError if no server is + available. + + Not threadsafe if used multiple times in a single method, since + the server may change. In such cases, store a local reference to a + ServerDescription first, then use its properties. + """ + server = self._topology.select_server( + writable_server_selector) + + return getattr(server.description, attr_name) + + def watch(self, pipeline=None, full_document='default', resume_after=None, + max_await_time_ms=None, batch_size=None, collation=None, + start_at_operation_time=None, session=None): + """Watch changes on this cluster. + + Performs an aggregation with an implicit initial ``$changeStream`` + stage and returns a + :class:`~pymongo.change_stream.ClusterChangeStream` cursor which + iterates over changes on all databases on this cluster. + + Introduced in MongoDB 4.0. + + .. code-block:: python + + with client.watch() as stream: + for change in stream: + print(change) + + The :class:`~pymongo.change_stream.ClusterChangeStream` iterable + blocks until the next change document is returned or an error is + raised. If the + :meth:`~pymongo.change_stream.ClusterChangeStream.next` method + encounters a network error when retrieving a batch from the server, + it will automatically attempt to recreate the cursor such that no + change events are missed. Any error encountered during the resume + attempt indicates there may be an outage and will be raised. + + .. code-block:: python + + try: + with client.watch( + [{'$match': {'operationType': 'insert'}}]) as stream: + for insert_change in stream: + print(insert_change) + except pymongo.errors.PyMongoError: + # The ChangeStream encountered an unrecoverable error or the + # resume attempt failed to recreate the cursor. + logging.error('...') + + For a precise description of the resume process see the + `change streams specification`_. + + :Parameters: + - `pipeline` (optional): A list of aggregation pipeline stages to + append to an initial ``$changeStream`` stage. Not all + pipeline stages are valid after a ``$changeStream`` stage, see the + MongoDB documentation on change streams for the supported stages. + - `full_document` (optional): The fullDocument to pass as an option + to the ``$changeStream`` stage. Allowed values: 'default', + 'updateLookup'. Defaults to 'default'. + When set to 'updateLookup', the change notification for partial + updates will include both a delta describing the changes to the + document, as well as a copy of the entire document that was + changed from some time after the change occurred. + - `resume_after` (optional): The logical starting point for this + change stream. + - `max_await_time_ms` (optional): The maximum time in milliseconds + for the server to wait for changes before responding to a getMore + operation. + - `batch_size` (optional): The maximum number of documents to return + per batch. + - `collation` (optional): The :class:`~pymongo.collation.Collation` + to use for the aggregation. + - `start_at_operation_time` (optional): If provided, the resulting + change stream will only return changes that occurred at or after + the specified :class:`~bson.timestamp.Timestamp`. Requires + MongoDB >= 4.0. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + :Returns: + A :class:`~pymongo.change_stream.ClusterChangeStream` cursor. + + .. versionadded:: 3.7 + + .. mongodoc:: changeStreams + + .. _change streams specification: + https://github.com/mongodb/specifications/blob/master/source/change-streams/change-streams.rst + """ + return ClusterChangeStream( + self.admin, pipeline, full_document, resume_after, max_await_time_ms, + batch_size, collation, start_at_operation_time, session + ) + + @property + def event_listeners(self): + """The event listeners registered for this client. + + See :mod:`~pymongo.monitoring` for details. + """ + return self._event_listeners.event_listeners + + @property + def address(self): + """(host, port) of the current standalone, primary, or mongos, or None. + + Accessing :attr:`address` raises :exc:`~.errors.InvalidOperation` if + the client is load-balancing among mongoses, since there is no single + address. Use :attr:`nodes` instead. + + If the client is not connected, this will block until a connection is + established or raise ServerSelectionTimeoutError if no server is + available. + + .. versionadded:: 3.0 + """ + topology_type = self._topology._description.topology_type + if topology_type == TOPOLOGY_TYPE.Sharded: + raise InvalidOperation( + 'Cannot use "address" property when load balancing among' + ' mongoses, use "nodes" instead.') + if topology_type not in (TOPOLOGY_TYPE.ReplicaSetWithPrimary, + TOPOLOGY_TYPE.Single): + return None + return self._server_property('address') + + @property + def primary(self): + """The (host, port) of the current primary of the replica set. + + Returns ``None`` if this client is not connected to a replica set, + there is no primary, or this client was created without the + `replicaSet` option. + + .. versionadded:: 3.0 + MongoClient gained this property in version 3.0 when + MongoReplicaSetClient's functionality was merged in. + """ + return self._topology.get_primary() + + @property + def secondaries(self): + """The secondary members known to this client. + + A sequence of (host, port) pairs. Empty if this client is not + connected to a replica set, there are no visible secondaries, or this + client was created without the `replicaSet` option. + + .. versionadded:: 3.0 + MongoClient gained this property in version 3.0 when + MongoReplicaSetClient's functionality was merged in. + """ + return self._topology.get_secondaries() + + @property + def arbiters(self): + """Arbiters in the replica set. + + A sequence of (host, port) pairs. Empty if this client is not + connected to a replica set, there are no arbiters, or this client was + created without the `replicaSet` option. + """ + return self._topology.get_arbiters() + + @property + def is_primary(self): + """If this client is connected to a server that can accept writes. + + True if the current server is a standalone, mongos, or the primary of + a replica set. If the client is not connected, this will block until a + connection is established or raise ServerSelectionTimeoutError if no + server is available. + """ + return self._server_property('is_writable') + + @property + def is_mongos(self): + """If this client is connected to mongos. If the client is not + connected, this will block until a connection is established or raise + ServerSelectionTimeoutError if no server is available.. + """ + return self._server_property('server_type') == SERVER_TYPE.Mongos + + @property + def max_pool_size(self): + """The maximum allowable number of concurrent connections to each + connected server. Requests to a server will block if there are + `maxPoolSize` outstanding connections to the requested server. + Defaults to 100. Cannot be 0. + + When a server's pool has reached `max_pool_size`, operations for that + server block waiting for a socket to be returned to the pool. If + ``waitQueueTimeoutMS`` is set, a blocked operation will raise + :exc:`~pymongo.errors.ConnectionFailure` after a timeout. + By default ``waitQueueTimeoutMS`` is not set. + """ + return self.__options.pool_options.max_pool_size + + @property + def min_pool_size(self): + """The minimum required number of concurrent connections that the pool + will maintain to each connected server. Default is 0. + """ + return self.__options.pool_options.min_pool_size + + @property + def max_idle_time_ms(self): + """The maximum number of milliseconds that a connection can remain + idle in the pool before being removed and replaced. Defaults to + `None` (no limit). + """ + seconds = self.__options.pool_options.max_idle_time_seconds + if seconds is None: + return None + return 1000 * seconds + + @property + def nodes(self): + """Set of all currently connected servers. + + .. warning:: When connected to a replica set the value of :attr:`nodes` + can change over time as :class:`MongoClient`'s view of the replica + set changes. :attr:`nodes` can also be an empty set when + :class:`MongoClient` is first instantiated and hasn't yet connected + to any servers, or a network partition causes it to lose connection + to all servers. + """ + description = self._topology.description + return frozenset(s.address for s in description.known_servers) + + @property + def max_bson_size(self): + """The largest BSON object the connected server accepts in bytes. + + If the client is not connected, this will block until a connection is + established or raise ServerSelectionTimeoutError if no server is + available. + """ + return self._server_property('max_bson_size') + + @property + def max_message_size(self): + """The largest message the connected server accepts in bytes. + + If the client is not connected, this will block until a connection is + established or raise ServerSelectionTimeoutError if no server is + available. + """ + return self._server_property('max_message_size') + + @property + def max_write_batch_size(self): + """The maxWriteBatchSize reported by the server. + + If the client is not connected, this will block until a connection is + established or raise ServerSelectionTimeoutError if no server is + available. + + Returns a default value when connected to server versions prior to + MongoDB 2.6. + """ + return self._server_property('max_write_batch_size') + + @property + def local_threshold_ms(self): + """The local threshold for this instance.""" + return self.__options.local_threshold_ms + + @property + def server_selection_timeout(self): + """The server selection timeout for this instance in seconds.""" + return self.__options.server_selection_timeout + + @property + def retry_writes(self): + """If this instance should retry supported write operations.""" + return self.__options.retry_writes + + def _is_writable(self): + """Attempt to connect to a writable server, or return False. + """ + topology = self._get_topology() # Starts monitors if necessary. + try: + svr = topology.select_server(writable_server_selector) + + # When directly connected to a secondary, arbiter, etc., + # select_server returns it, whatever the selector. Check + # again if the server is writable. + return svr.description.is_writable + except ConnectionFailure: + return False + + def _end_sessions(self, session_ids): + """Send endSessions command(s) with the given session ids.""" + try: + # Use SocketInfo.command directly to avoid implicitly creating + # another session. + with self._socket_for_reads( + ReadPreference.PRIMARY_PREFERRED) as (sock_info, slave_ok): + if not sock_info.supports_sessions: + return + + for i in range(0, len(session_ids), common._MAX_END_SESSIONS): + spec = SON([('endSessions', + session_ids[i:i + common._MAX_END_SESSIONS])]) + sock_info.command( + 'admin', spec, slave_ok=slave_ok, client=self) + except PyMongoError: + # Drivers MUST ignore any errors returned by the endSessions + # command. + pass + + def close(self): + """Cleanup client resources and disconnect from MongoDB. + + On MongoDB >= 3.6, end all server sessions created by this client by + sending one or more endSessions commands. + + Close all sockets in the connection pools and stop the monitor threads. + If this instance is used again it will be automatically re-opened and + the threads restarted. + + .. versionchanged:: 3.6 + End all server sessions created by this client. + """ + session_ids = self._topology.pop_all_sessions() + if session_ids: + self._end_sessions(session_ids) + # Stop the periodic task thread and then run _process_periodic_tasks + # to send pending killCursor requests before closing the topology. + self._kill_cursors_executor.close() + self._process_periodic_tasks() + self._topology.close() + + def set_cursor_manager(self, manager_class): + """DEPRECATED - Set this client's cursor manager. + + Raises :class:`TypeError` if `manager_class` is not a subclass of + :class:`~pymongo.cursor_manager.CursorManager`. A cursor manager + handles closing cursors. Different managers can implement different + policies in terms of when to actually kill a cursor that has + been closed. + + :Parameters: + - `manager_class`: cursor manager to use + + .. versionchanged:: 3.3 + Deprecated, for real this time. + + .. versionchanged:: 3.0 + Undeprecated. + """ + warnings.warn( + "set_cursor_manager is Deprecated", + DeprecationWarning, + stacklevel=2) + manager = manager_class(self) + if not isinstance(manager, CursorManager): + raise TypeError("manager_class must be a subclass of " + "CursorManager") + + self.__cursor_manager = manager + + def _get_topology(self): + """Get the internal :class:`~pymongo.topology.Topology` object. + + If this client was created with "connect=False", calling _get_topology + launches the connection process in the background. + """ + self._topology.open() + with self.__lock: + self._kill_cursors_executor.open() + return self._topology + + @contextlib.contextmanager + def _get_socket(self, server): + try: + with server.get_socket(self.__all_credentials) as sock_info: + yield sock_info + except NetworkTimeout: + # The socket has been closed. Don't reset the server. + # Server Discovery And Monitoring Spec: "When an application + # operation fails because of any network error besides a socket + # timeout...." + raise + except NotMasterError: + # "When the client sees a "not master" error it MUST replace the + # server's description with type Unknown. It MUST request an + # immediate check of the server." + self._reset_server_and_request_check(server.description.address) + raise + except ConnectionFailure: + # "Client MUST replace the server's description with type Unknown + # ... MUST NOT request an immediate check of the server." + self.__reset_server(server.description.address) + raise + except OperationFailure as exc: + if exc.code in helpers._RETRYABLE_ERROR_CODES: + # Do not request an immediate check since the server is likely + # shutting down. + self.__reset_server(server.description.address) + raise + + def _socket_for_writes(self): + server = self._get_topology().select_server(writable_server_selector) + return self._get_socket(server) + + @contextlib.contextmanager + def _socket_for_reads(self, read_preference): + assert read_preference is not None, "read_preference must not be None" + # Get a socket for a server matching the read preference, and yield + # sock_info, slave_ok. Server Selection Spec: "slaveOK must be sent to + # mongods with topology type Single. If the server type is Mongos, + # follow the rules for passing read preference to mongos, even for + # topology type Single." + # Thread safe: if the type is single it cannot change. + topology = self._get_topology() + single = topology.description.topology_type == TOPOLOGY_TYPE.Single + server = topology.select_server(read_preference) + + with self._get_socket(server) as sock_info: + slave_ok = (single and not sock_info.is_mongos) or ( + read_preference != ReadPreference.PRIMARY) + yield sock_info, slave_ok + + def _send_message_with_response(self, operation, exhaust=False, + address=None): + """Send a message to MongoDB and return a Response. + + :Parameters: + - `operation`: a _Query or _GetMore object. + - `read_preference` (optional): A ReadPreference. + - `exhaust` (optional): If True, the socket used stays checked out. + It is returned along with its Pool in the Response. + - `address` (optional): Optional address when sending a message + to a specific server, used for getMore. + """ + topology = self._get_topology() + if address: + server = topology.select_server_by_address(address) + if not server: + raise AutoReconnect('server %s:%d no longer available' + % address) + else: + server = topology.select_server(operation.read_preference) + + # If this is a direct connection to a mongod, *always* set the slaveOk + # bit. See bullet point 2 in server-selection.rst#topology-type-single. + set_slave_ok = ( + topology.description.topology_type == TOPOLOGY_TYPE.Single + and server.description.server_type != SERVER_TYPE.Mongos) or ( + operation.read_preference != ReadPreference.PRIMARY) + + return self._reset_on_error( + server, + server.send_message_with_response, + operation, + set_slave_ok, + self.__all_credentials, + self._event_listeners, + exhaust) + + def _reset_on_error(self, server, func, *args, **kwargs): + """Execute an operation. Reset the server on network error. + + Returns fn()'s return value on success. On error, clears the server's + pool and marks the server Unknown. + + Re-raises any exception thrown by fn(). + """ + try: + return func(*args, **kwargs) + except NetworkTimeout: + # The socket has been closed. Don't reset the server. + raise + except ConnectionFailure: + self.__reset_server(server.description.address) + raise + + def _retry_with_session(self, retryable, func, session, bulk): + """Execute an operation with at most one consecutive retries + + Returns func()'s return value on success. On error retries the same + command once. + + Re-raises any exception thrown by func(). + """ + retryable = (retryable and self.retry_writes + and session and not session._in_transaction) + last_error = None + retrying = False + + def is_retrying(): + return bulk.retrying if bulk else retrying + # Increment the transaction id up front to ensure any retry attempt + # will use the proper txnNumber, even if server or socket selection + # fails before the command can be sent. + if retryable: + session._start_retryable_write() + if bulk: + bulk.started_retryable_write = True + + while True: + try: + server = self._get_topology().select_server( + writable_server_selector) + supports_session = ( + session is not None and + server.description.retryable_writes_supported) + with self._get_socket(server) as sock_info: + if retryable and not supports_session: + if is_retrying(): + # A retry is not possible because this server does + # not support sessions raise the last error. + raise last_error + retryable = False + return func(session, sock_info, retryable) + except ServerSelectionTimeoutError: + if is_retrying(): + # The application may think the write was never attempted + # if we raise ServerSelectionTimeoutError on the retry + # attempt. Raise the original exception instead. + raise last_error + # A ServerSelectionTimeoutError error indicates that there may + # be a persistent outage. Attempting to retry in this case will + # most likely be a waste of time. + raise + except ConnectionFailure as exc: + if not retryable or is_retrying(): + raise + if bulk: + bulk.retrying = True + else: + retrying = True + last_error = exc + except BulkWriteError as exc: + if not retryable or is_retrying(): + raise + # Check the last writeConcernError to determine if this + # BulkWriteError is retryable. + wces = exc.details['writeConcernErrors'] + wce = wces[-1] if wces else {} + if wce.get('code', 0) not in helpers._RETRYABLE_ERROR_CODES: + raise + if bulk: + bulk.retrying = True + else: + retrying = True + last_error = exc + except OperationFailure as exc: + if not retryable or is_retrying(): + raise + if exc.code not in helpers._RETRYABLE_ERROR_CODES: + raise + if bulk: + bulk.retrying = True + else: + retrying = True + last_error = exc + + def _retryable_write(self, retryable, func, session): + """Internal retryable write helper.""" + with self._tmp_session(session) as s: + return self._retry_with_session(retryable, func, s, None) + + def __reset_server(self, address): + """Clear our connection pool for a server and mark it Unknown.""" + self._topology.reset_server(address) + + def _reset_server_and_request_check(self, address): + """Clear our pool for a server, mark it Unknown, and check it soon.""" + self._topology.reset_server_and_request_check(address) + + def __eq__(self, other): + if isinstance(other, self.__class__): + return self.address == other.address + return NotImplemented + + def __ne__(self, other): + return not self == other + + def _repr_helper(self): + def option_repr(option, value): + """Fix options whose __repr__ isn't usable in a constructor.""" + if option == 'document_class': + if value is dict: + return 'document_class=dict' + else: + return 'document_class=%s.%s' % (value.__module__, + value.__name__) + if option in common.TIMEOUT_VALIDATORS and value is not None: + return "%s=%s" % (option, int(value * 1000)) + + return '%s=%r' % (option, value) + + # Host first... + options = ['host=%r' % [ + '%s:%d' % (host, port) if port is not None else host + for host, port in self._topology_settings.seeds]] + # ... then everything in self._constructor_args... + options.extend( + option_repr(key, self.__options._options[key]) + for key in self._constructor_args) + # ... then everything else. + options.extend( + option_repr(key, self.__options._options[key]) + for key in self.__options._options + if key not in set(self._constructor_args) + and key != 'username' and key != 'password') + return ', '.join(options) + + def __repr__(self): + return ("MongoClient(%s)" % (self._repr_helper(),)) + + def __getattr__(self, name): + """Get a database by name. + + Raises :class:`~pymongo.errors.InvalidName` if an invalid + database name is used. + + :Parameters: + - `name`: the name of the database to get + """ + if name.startswith('_'): + raise AttributeError( + "MongoClient has no attribute %r. To access the %s" + " database, use client[%r]." % (name, name, name)) + return self.__getitem__(name) + + def __getitem__(self, name): + """Get a database by name. + + Raises :class:`~pymongo.errors.InvalidName` if an invalid + database name is used. + + :Parameters: + - `name`: the name of the database to get + """ + return database.Database(self, name) + + def close_cursor(self, cursor_id, address=None): + """DEPRECATED - Send a kill cursors message soon with the given id. + + Raises :class:`TypeError` if `cursor_id` is not an instance of + ``(int, long)``. What closing the cursor actually means + depends on this client's cursor manager. + + This method may be called from a :class:`~pymongo.cursor.Cursor` + destructor during garbage collection, so it isn't safe to take a + lock or do network I/O. Instead, we schedule the cursor to be closed + soon on a background thread. + + :Parameters: + - `cursor_id`: id of cursor to close + - `address` (optional): (host, port) pair of the cursor's server. + If it is not provided, the client attempts to close the cursor on + the primary or standalone, or a mongos server. + + .. versionchanged:: 3.7 + Deprecated. + + .. versionchanged:: 3.0 + Added ``address`` parameter. + """ + warnings.warn( + "close_cursor is deprecated.", + DeprecationWarning, + stacklevel=2) + if not isinstance(cursor_id, integer_types): + raise TypeError("cursor_id must be an instance of (int, long)") + + self._close_cursor(cursor_id, address) + + def _close_cursor(self, cursor_id, address): + """Send a kill cursors message with the given id. + + What closing the cursor actually means depends on this client's + cursor manager. If there is none, the cursor is closed asynchronously + on a background thread. + """ + if self.__cursor_manager is not None: + self.__cursor_manager.close(cursor_id, address) + else: + self.__kill_cursors_queue.append((address, [cursor_id])) + + def _close_cursor_now(self, cursor_id, address=None, session=None): + """Send a kill cursors message with the given id. + + What closing the cursor actually means depends on this client's + cursor manager. If there is none, the cursor is closed synchronously + on the current thread. + """ + if not isinstance(cursor_id, integer_types): + raise TypeError("cursor_id must be an instance of (int, long)") + + if self.__cursor_manager is not None: + self.__cursor_manager.close(cursor_id, address) + else: + try: + self._kill_cursors( + [cursor_id], address, self._get_topology(), session) + except PyMongoError: + # Make another attempt to kill the cursor later. + self.__kill_cursors_queue.append((address, [cursor_id])) + + def kill_cursors(self, cursor_ids, address=None): + """DEPRECATED - Send a kill cursors message soon with the given ids. + + Raises :class:`TypeError` if `cursor_ids` is not an instance of + ``list``. + + :Parameters: + - `cursor_ids`: list of cursor ids to kill + - `address` (optional): (host, port) pair of the cursor's server. + If it is not provided, the client attempts to close the cursor on + the primary or standalone, or a mongos server. + + .. versionchanged:: 3.3 + Deprecated. + + .. versionchanged:: 3.0 + Now accepts an `address` argument. Schedules the cursors to be + closed on a background thread instead of sending the message + immediately. + """ + warnings.warn( + "kill_cursors is deprecated.", + DeprecationWarning, + stacklevel=2) + + if not isinstance(cursor_ids, list): + raise TypeError("cursor_ids must be a list") + + # "Atomic", needs no lock. + self.__kill_cursors_queue.append((address, cursor_ids)) + + def _kill_cursors(self, cursor_ids, address, topology, session): + """Send a kill cursors message with the given ids.""" + listeners = self._event_listeners + publish = listeners.enabled_for_commands + if address: + # address could be a tuple or _CursorAddress, but + # select_server_by_address needs (host, port). + server = topology.select_server_by_address(tuple(address)) + else: + # Application called close_cursor() with no address. + server = topology.select_server(writable_server_selector) + + try: + namespace = address.namespace + db, coll = namespace.split('.', 1) + except AttributeError: + namespace = None + db = coll = "OP_KILL_CURSORS" + + spec = SON([('killCursors', coll), ('cursors', cursor_ids)]) + with server.get_socket(self.__all_credentials) as sock_info: + if sock_info.max_wire_version >= 4 and namespace is not None: + sock_info.command(db, spec, session=session, client=self) + else: + if publish: + start = datetime.datetime.now() + request_id, msg = message.kill_cursors(cursor_ids) + if publish: + duration = datetime.datetime.now() - start + # Here and below, address could be a tuple or + # _CursorAddress. We always want to publish a + # tuple to match the rest of the monitoring + # API. + listeners.publish_command_start( + spec, db, request_id, tuple(address)) + start = datetime.datetime.now() + + try: + sock_info.send_message(msg, 0) + except Exception as exc: + if publish: + dur = ((datetime.datetime.now() - start) + duration) + listeners.publish_command_failure( + dur, message._convert_exception(exc), + 'killCursors', request_id, + tuple(address)) + raise + + if publish: + duration = ((datetime.datetime.now() - start) + duration) + # OP_KILL_CURSORS returns no reply, fake one. + reply = {'cursorsUnknown': cursor_ids, 'ok': 1} + listeners.publish_command_success( + duration, reply, 'killCursors', request_id, + tuple(address)) + + # This method is run periodically by a background thread. + def _process_periodic_tasks(self): + """Process any pending kill cursors requests and + maintain connection pool parameters.""" + address_to_cursor_ids = defaultdict(list) + + # Other threads or the GC may append to the queue concurrently. + while True: + try: + address, cursor_ids = self.__kill_cursors_queue.pop() + except IndexError: + break + + address_to_cursor_ids[address].extend(cursor_ids) + + # Don't re-open topology if it's closed and there's no pending cursors. + if address_to_cursor_ids: + topology = self._get_topology() + for address, cursor_ids in address_to_cursor_ids.items(): + try: + self._kill_cursors( + cursor_ids, address, topology, session=None) + except Exception: + helpers._handle_exception() + try: + self._topology.update_pool() + except Exception: + helpers._handle_exception() + + def _is_mongos_non_blocking(self): + return self._topology.is_mongos_non_blocking() + + def __start_session(self, implicit, **kwargs): + # Driver Sessions Spec: "If startSession is called when multiple users + # are authenticated drivers MUST raise an error with the error message + # 'Cannot call startSession when multiple users are authenticated.'" + authset = set(self.__all_credentials.values()) + if len(authset) > 1: + raise InvalidOperation("Cannot call start_session when" + " multiple users are authenticated") + + # Raises ConfigurationError if sessions are not supported. + server_session = self._get_server_session() + opts = client_session.SessionOptions(**kwargs) + return client_session.ClientSession( + self, server_session, opts, authset, implicit) + + def start_session(self, + causal_consistency=True, + default_transaction_options=None): + """Start a logical session. + + This method takes the same parameters as + :class:`~pymongo.client_session.SessionOptions`. See the + :mod:`~pymongo.client_session` module for details and examples. + + Requires MongoDB 3.6. It is an error to call :meth:`start_session` + if this client has been authenticated to multiple databases using the + deprecated method :meth:`~pymongo.database.Database.authenticate`. + + A :class:`~pymongo.client_session.ClientSession` may only be used with + the MongoClient that started it. + + :Returns: + An instance of :class:`~pymongo.client_session.ClientSession`. + + .. versionadded:: 3.6 + """ + return self.__start_session( + False, + causal_consistency=causal_consistency, + default_transaction_options=default_transaction_options) + + def _get_server_session(self): + """Internal: start or resume a _ServerSession.""" + return self._topology.get_server_session() + + def _return_server_session(self, server_session, lock): + """Internal: return a _ServerSession to the pool.""" + return self._topology.return_server_session(server_session, lock) + + def _ensure_session(self, session=None): + """If provided session is None, lend a temporary session.""" + if session: + return session + + try: + # Don't make implicit sessions causally consistent. Applications + # should always opt-in. + return self.__start_session(True, causal_consistency=False) + except (ConfigurationError, InvalidOperation): + # Sessions not supported, or multiple users authenticated. + return None + + @contextlib.contextmanager + def _tmp_session(self, session, close=True): + """If provided session is None, lend a temporary session.""" + if session: + # Don't call end_session. + yield session + return + + s = self._ensure_session(session) + if s and close: + with s: + # Call end_session when we exit this scope. + yield s + elif s: + try: + # Only call end_session on error. + yield s + except Exception: + s.end_session() + raise + else: + yield None + + def _send_cluster_time(self, command, session): + topology_time = self._topology.max_cluster_time() + session_time = session.cluster_time if session else None + if topology_time and session_time: + if topology_time['clusterTime'] > session_time['clusterTime']: + cluster_time = topology_time + else: + cluster_time = session_time + else: + cluster_time = topology_time or session_time + if cluster_time: + command['$clusterTime'] = cluster_time + + def _receive_cluster_time(self, reply, session): + cluster_time = reply.get('$clusterTime') + self._topology.receive_cluster_time(cluster_time) + if session is not None: + session._advance_cluster_time(cluster_time) + session._advance_operation_time(reply.get("operationTime")) + + def server_info(self, session=None): + """Get information about the MongoDB server we're connected to. + + :Parameters: + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + return self.admin.command("buildinfo", + read_preference=ReadPreference.PRIMARY, + session=session) + + def list_databases(self, session=None, **kwargs): + """Get a cursor over the databases of the connected server. + + :Parameters: + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + - `**kwargs` (optional): Optional parameters of the + `listDatabases command + <https://docs.mongodb.com/manual/reference/command/listDatabases/>`_ + can be passed as keyword arguments to this method. The supported + options differ by server version. + + :Returns: + An instance of :class:`~pymongo.command_cursor.CommandCursor`. + + .. versionadded:: 3.6 + """ + cmd = SON([("listDatabases", 1)]) + cmd.update(kwargs) + admin = self._database_default_options("admin") + res = admin.command(cmd, session=session) + # listDatabases doesn't return a cursor (yet). Fake one. + cursor = { + "id": 0, + "firstBatch": res["databases"], + "ns": "admin.$cmd", + } + return CommandCursor(admin["$cmd"], cursor, None) + + def list_database_names(self, session=None): + """Get a list of the names of all databases on the connected server. + + :Parameters: + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + .. versionadded:: 3.6 + """ + return [doc["name"] + for doc in self.list_databases(session, nameOnly=True)] + + def database_names(self, session=None): + """**DEPRECATED**: Get a list of the names of all databases on the + connected server. + + :Parameters: + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + .. versionchanged:: 3.7 + Deprecated. Use :meth:`list_database_names` instead. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + warnings.warn("database_names is deprecated. Use list_database_names " + "instead.", DeprecationWarning, stacklevel=2) + return self.list_database_names(session) + + def drop_database(self, name_or_database, session=None): + """Drop a database. + + Raises :class:`TypeError` if `name_or_database` is not an instance of + :class:`basestring` (:class:`str` in python 3) or + :class:`~pymongo.database.Database`. + + :Parameters: + - `name_or_database`: the name of a database to drop, or a + :class:`~pymongo.database.Database` instance representing the + database to drop + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. note:: The :attr:`~pymongo.mongo_client.MongoClient.write_concern` of + this client is automatically applied to this operation when using + MongoDB >= 3.4. + + .. versionchanged:: 3.4 + Apply this client's write concern automatically to this operation + when connected to MongoDB >= 3.4. + + """ + name = name_or_database + if isinstance(name, database.Database): + name = name.name + + if not isinstance(name, string_type): + raise TypeError("name_or_database must be an instance " + "of %s or a Database" % (string_type.__name__,)) + + self._purge_index(name) + with self._socket_for_writes() as sock_info: + self[name]._command( + sock_info, + "dropDatabase", + read_preference=ReadPreference.PRIMARY, + write_concern=self._write_concern_for(session), + parse_write_concern_error=True, + session=session) + + def get_default_database(self, default=None, codec_options=None, + read_preference=None, write_concern=None, read_concern=None): + """Get the database named in the MongoDB connection URI. + + >>> uri = 'mongodb://host/my_database' + >>> client = MongoClient(uri) + >>> db = client.get_default_database() + >>> assert db.name == 'my_database' + >>> db = client.get_database() + >>> assert db.name == 'my_database' + + Useful in scripts where you want to choose which database to use + based only on the URI in a configuration file. + + :Parameters: + - `default` (optional): the database name to use if no database name + was provided in the URI. + - `codec_options` (optional): An instance of + :class:`~bson.codec_options.CodecOptions`. If ``None`` (the + default) the :attr:`codec_options` of this :class:`MongoClient` is + used. + - `read_preference` (optional): The read preference to use. If + ``None`` (the default) the :attr:`read_preference` of this + :class:`MongoClient` is used. See :mod:`~pymongo.read_preferences` + for options. + - `write_concern` (optional): An instance of + :class:`~pymongo.write_concern.WriteConcern`. If ``None`` (the + default) the :attr:`write_concern` of this :class:`MongoClient` is + used. + - `read_concern` (optional): An instance of + :class:`~pymongo.read_concern.ReadConcern`. If ``None`` (the + default) the :attr:`read_concern` of this :class:`MongoClient` is + used. + + .. versionchanged:: 3.8 + Undeprecated. Added the ``default``, ``codec_options``, + ``read_preference``, ``write_concern`` and ``read_concern`` + parameters. + + .. versionchanged:: 3.5 + Deprecated, use :meth:`get_database` instead. + """ + if self.__default_database_name is None and default is None: + raise ConfigurationError( + 'No default database name defined or provided.') + + return database.Database( + self, self.__default_database_name or default, codec_options, + read_preference, write_concern, read_concern) + + def get_database(self, name=None, codec_options=None, read_preference=None, + write_concern=None, read_concern=None): + """Get a :class:`~pymongo.database.Database` with the given name and + options. + + Useful for creating a :class:`~pymongo.database.Database` with + different codec options, read preference, and/or write concern from + this :class:`MongoClient`. + + >>> client.read_preference + Primary() + >>> db1 = client.test + >>> db1.read_preference + Primary() + >>> from pymongo import ReadPreference + >>> db2 = client.get_database( + ... 'test', read_preference=ReadPreference.SECONDARY) + >>> db2.read_preference + Secondary(tag_sets=None) + + :Parameters: + - `name` (optional): The name of the database - a string. If ``None`` + (the default) the database named in the MongoDB connection URI is + returned. + - `codec_options` (optional): An instance of + :class:`~bson.codec_options.CodecOptions`. If ``None`` (the + default) the :attr:`codec_options` of this :class:`MongoClient` is + used. + - `read_preference` (optional): The read preference to use. If + ``None`` (the default) the :attr:`read_preference` of this + :class:`MongoClient` is used. See :mod:`~pymongo.read_preferences` + for options. + - `write_concern` (optional): An instance of + :class:`~pymongo.write_concern.WriteConcern`. If ``None`` (the + default) the :attr:`write_concern` of this :class:`MongoClient` is + used. + - `read_concern` (optional): An instance of + :class:`~pymongo.read_concern.ReadConcern`. If ``None`` (the + default) the :attr:`read_concern` of this :class:`MongoClient` is + used. + + .. versionchanged:: 3.5 + The `name` parameter is now optional, defaulting to the database + named in the MongoDB connection URI. + """ + if name is None: + if self.__default_database_name is None: + raise ConfigurationError('No default database defined') + name = self.__default_database_name + + return database.Database( + self, name, codec_options, read_preference, + write_concern, read_concern) + + def _database_default_options(self, name): + """Get a Database instance with the default settings.""" + return self.get_database( + name, codec_options=DEFAULT_CODEC_OPTIONS, + read_preference=ReadPreference.PRIMARY, + write_concern=DEFAULT_WRITE_CONCERN) + + @property + def is_locked(self): + """Is this server locked? While locked, all write operations + are blocked, although read operations may still be allowed. + Use :meth:`unlock` to unlock. + """ + ops = self._database_default_options('admin').current_op() + return bool(ops.get('fsyncLock', 0)) + + def fsync(self, **kwargs): + """Flush all pending writes to datafiles. + + Optional parameters can be passed as keyword arguments: + - `lock`: If True lock the server to disallow writes. + - `async`: If True don't block while synchronizing. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + .. note:: Starting with Python 3.7 `async` is a reserved keyword. + The async option to the fsync command can be passed using a + dictionary instead:: + + options = {'async': True} + client.fsync(**options) + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. warning:: `async` and `lock` can not be used together. + + .. warning:: MongoDB does not support the `async` option + on Windows and will raise an exception on that + platform. + """ + self.admin.command("fsync", + read_preference=ReadPreference.PRIMARY, **kwargs) + + def unlock(self, session=None): + """Unlock a previously locked server. + + :Parameters: + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession`. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + cmd = SON([("fsyncUnlock", 1)]) + with self._socket_for_writes() as sock_info: + if sock_info.max_wire_version >= 4: + try: + with self._tmp_session(session) as s: + sock_info.command( + "admin", cmd, session=s, client=self) + except OperationFailure as exc: + # Ignore "DB not locked" to replicate old behavior + if exc.code != 125: + raise + else: + message._first_batch(sock_info, "admin", "$cmd.sys.unlock", + {}, -1, True, self.codec_options, + ReadPreference.PRIMARY, cmd, + self._event_listeners) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + + def __iter__(self): + return self + + def __next__(self): + raise TypeError("'MongoClient' object is not iterable") + + next = __next__ diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/mongo_replica_set_client.py b/mongo_mac/lib/python3.6/site-packages/pymongo/mongo_replica_set_client.py new file mode 100644 index 0000000..c9436c2 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/mongo_replica_set_client.py @@ -0,0 +1,48 @@ +# Copyright 2011-2015 MongoDB, Inc. +# +# 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. + +"""Deprecated. See :doc:`/examples/high_availability`.""" + +import warnings + +from pymongo import mongo_client + + +class MongoReplicaSetClient(mongo_client.MongoClient): + """Deprecated alias for :class:`~pymongo.mongo_client.MongoClient`. + + :class:`~pymongo.mongo_replica_set_client.MongoReplicaSetClient` + will be removed in a future version of PyMongo. + + .. versionchanged:: 3.0 + :class:`~pymongo.mongo_client.MongoClient` is now the one and only + client class for a standalone server, mongos, or replica set. + It includes the functionality that had been split into + :class:`~pymongo.mongo_replica_set_client.MongoReplicaSetClient`: it + can connect to a replica set, discover all its members, and monitor + the set for stepdowns, elections, and reconfigs. + + The ``refresh`` method is removed from + :class:`~pymongo.mongo_replica_set_client.MongoReplicaSetClient`, + as are the ``seeds`` and ``hosts`` properties. + """ + def __init__(self, *args, **kwargs): + warnings.warn('MongoReplicaSetClient is deprecated, use MongoClient' + ' to connect to a replica set', + DeprecationWarning, stacklevel=2) + + super(MongoReplicaSetClient, self).__init__(*args, **kwargs) + + def __repr__(self): + return "MongoReplicaSetClient(%s)" % (self._repr_helper(),) diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/monitor.py b/mongo_mac/lib/python3.6/site-packages/pymongo/monitor.py new file mode 100644 index 0000000..4c0f318 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/monitor.py @@ -0,0 +1,184 @@ +# Copyright 2014-present MongoDB, Inc. +# +# 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. + +"""Class to monitor a MongoDB server on a background thread.""" + +import weakref + +from pymongo import common, periodic_executor +from pymongo.errors import OperationFailure +from pymongo.server_type import SERVER_TYPE +from pymongo.monotonic import time as _time +from pymongo.read_preferences import MovingAverage +from pymongo.server_description import ServerDescription + + +class Monitor(object): + def __init__( + self, + server_description, + topology, + pool, + topology_settings): + """Class to monitor a MongoDB server on a background thread. + + Pass an initial ServerDescription, a Topology, a Pool, and + TopologySettings. + + The Topology is weakly referenced. The Pool must be exclusive to this + Monitor. + """ + self._server_description = server_description + self._pool = pool + self._settings = topology_settings + self._avg_round_trip_time = MovingAverage() + self._listeners = self._settings._pool_options.event_listeners + pub = self._listeners is not None + self._publish = pub and self._listeners.enabled_for_server_heartbeat + + # We strongly reference the executor and it weakly references us via + # this closure. When the monitor is freed, stop the executor soon. + def target(): + monitor = self_ref() + if monitor is None: + return False # Stop the executor. + Monitor._run(monitor) + return True + + executor = periodic_executor.PeriodicExecutor( + interval=self._settings.heartbeat_frequency, + min_interval=common.MIN_HEARTBEAT_INTERVAL, + target=target, + name="pymongo_server_monitor_thread") + + self._executor = executor + + # Avoid cycles. When self or topology is freed, stop executor soon. + self_ref = weakref.ref(self, executor.close) + self._topology = weakref.proxy(topology, executor.close) + + def open(self): + """Start monitoring, or restart after a fork. + + Multiple calls have no effect. + """ + self._executor.open() + + def close(self): + """Close and stop monitoring. + + open() restarts the monitor after closing. + """ + self._executor.close() + + # Increment the pool_id and maybe close the socket. If the executor + # thread has the socket checked out, it will be closed when checked in. + self._pool.reset() + + def join(self, timeout=None): + self._executor.join(timeout) + + def request_check(self): + """If the monitor is sleeping, wake and check the server soon.""" + self._executor.wake() + + def _run(self): + try: + self._server_description = self._check_with_retry() + self._topology.on_change(self._server_description) + except ReferenceError: + # Topology was garbage-collected. + self.close() + + def _check_with_retry(self): + """Call ismaster once or twice. Reset server's pool on error. + + Returns a ServerDescription. + """ + # According to the spec, if an ismaster call fails we reset the + # server's pool. If a server was once connected, change its type + # to Unknown only after retrying once. + address = self._server_description.address + retry = True + if self._server_description.server_type == SERVER_TYPE.Unknown: + retry = False + + start = _time() + try: + return self._check_once() + except ReferenceError: + raise + except Exception as error: + error_time = _time() - start + if self._publish: + self._listeners.publish_server_heartbeat_failed( + address, error_time, error) + self._topology.reset_pool(address) + default = ServerDescription(address, error=error) + if not retry: + self._avg_round_trip_time.reset() + # Server type defaults to Unknown. + return default + + # Try a second and final time. If it fails return original error. + # Always send metadata: this is a new connection. + start = _time() + try: + return self._check_once() + except ReferenceError: + raise + except Exception as error: + error_time = _time() - start + if self._publish: + self._listeners.publish_server_heartbeat_failed( + address, error_time, error) + self._avg_round_trip_time.reset() + return default + + def _check_once(self): + """A single attempt to call ismaster. + + Returns a ServerDescription, or raises an exception. + """ + address = self._server_description.address + if self._publish: + self._listeners.publish_server_heartbeat_started(address) + with self._pool.get_socket({}) as sock_info: + response, round_trip_time = self._check_with_socket(sock_info) + self._avg_round_trip_time.add_sample(round_trip_time) + sd = ServerDescription( + address=address, + ismaster=response, + round_trip_time=self._avg_round_trip_time.get()) + if self._publish: + self._listeners.publish_server_heartbeat_succeeded( + address, round_trip_time, response) + + return sd + + def _check_with_socket(self, sock_info): + """Return (IsMaster, round_trip_time). + + Can raise ConnectionFailure or OperationFailure. + """ + start = _time() + try: + return (sock_info.ismaster(self._pool.opts.metadata, + self._topology.max_cluster_time()), + _time() - start) + except OperationFailure as exc: + # Update max cluster time even when isMaster fails. + self._topology.receive_cluster_time( + exc.details.get('$clusterTime')) + raise diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/monitoring.py b/mongo_mac/lib/python3.6/site-packages/pymongo/monitoring.py new file mode 100644 index 0000000..92b838c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/monitoring.py @@ -0,0 +1,931 @@ +# Copyright 2015-present MongoDB, Inc. +# +# 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. + +"""Tools to monitor driver events. + +.. versionadded:: 3.1 + +Use :func:`register` to register global listeners for specific events. +Listeners must inherit from one of the abstract classes below and implement +the correct functions for that class. + +For example, a simple command logger might be implemented like this:: + + import logging + + from pymongo import monitoring + + class CommandLogger(monitoring.CommandListener): + + def started(self, event): + logging.info("Command {0.command_name} with request id " + "{0.request_id} started on server " + "{0.connection_id}".format(event)) + + def succeeded(self, event): + logging.info("Command {0.command_name} with request id " + "{0.request_id} on server {0.connection_id} " + "succeeded in {0.duration_micros} " + "microseconds".format(event)) + + def failed(self, event): + logging.info("Command {0.command_name} with request id " + "{0.request_id} on server {0.connection_id} " + "failed in {0.duration_micros} " + "microseconds".format(event)) + + monitoring.register(CommandLogger()) + +Server discovery and monitoring events are also available. For example:: + + class ServerLogger(monitoring.ServerListener): + + def opened(self, event): + logging.info("Server {0.server_address} added to topology " + "{0.topology_id}".format(event)) + + def description_changed(self, event): + previous_server_type = event.previous_description.server_type + new_server_type = event.new_description.server_type + if new_server_type != previous_server_type: + # server_type_name was added in PyMongo 3.4 + logging.info( + "Server {0.server_address} changed type from " + "{0.previous_description.server_type_name} to " + "{0.new_description.server_type_name}".format(event)) + + def closed(self, event): + logging.warning("Server {0.server_address} removed from topology " + "{0.topology_id}".format(event)) + + + class HeartbeatLogger(monitoring.ServerHeartbeatListener): + + def started(self, event): + logging.info("Heartbeat sent to server " + "{0.connection_id}".format(event)) + + def succeeded(self, event): + # The reply.document attribute was added in PyMongo 3.4. + logging.info("Heartbeat to server {0.connection_id} " + "succeeded with reply " + "{0.reply.document}".format(event)) + + def failed(self, event): + logging.warning("Heartbeat to server {0.connection_id} " + "failed with error {0.reply}".format(event)) + + class TopologyLogger(monitoring.TopologyListener): + + def opened(self, event): + logging.info("Topology with id {0.topology_id} " + "opened".format(event)) + + def description_changed(self, event): + logging.info("Topology description updated for " + "topology id {0.topology_id}".format(event)) + previous_topology_type = event.previous_description.topology_type + new_topology_type = event.new_description.topology_type + if new_topology_type != previous_topology_type: + # topology_type_name was added in PyMongo 3.4 + logging.info( + "Topology {0.topology_id} changed type from " + "{0.previous_description.topology_type_name} to " + "{0.new_description.topology_type_name}".format(event)) + # The has_writable_server and has_readable_server methods + # were added in PyMongo 3.4. + if not event.new_description.has_writable_server(): + logging.warning("No writable servers available.") + if not event.new_description.has_readable_server(): + logging.warning("No readable servers available.") + + def closed(self, event): + logging.info("Topology with id {0.topology_id} " + "closed".format(event)) + + +Event listeners can also be registered per instance of +:class:`~pymongo.mongo_client.MongoClient`:: + + client = MongoClient(event_listeners=[CommandLogger()]) + +Note that previously registered global listeners are automatically included +when configuring per client event listeners. Registering a new global listener +will not add that listener to existing client instances. + +.. note:: Events are delivered **synchronously**. Application threads block + waiting for event handlers (e.g. :meth:`~CommandListener.started`) to + return. Care must be taken to ensure that your event handlers are efficient + enough to not adversely affect overall application performance. + +.. warning:: The command documents published through this API are *not* copies. + If you intend to modify them in any way you must copy them in your event + handler first. +""" + +import sys +import traceback + +from collections import namedtuple + +from bson.py3compat import abc +from pymongo.helpers import _handle_exception + +_Listeners = namedtuple('Listeners', + ('command_listeners', 'server_listeners', + 'server_heartbeat_listeners', 'topology_listeners')) + +_LISTENERS = _Listeners([], [], [], []) + + +class _EventListener(object): + """Abstract base class for all event listeners.""" + + +class CommandListener(_EventListener): + """Abstract base class for command listeners. + Handles `CommandStartedEvent`, `CommandSucceededEvent`, + and `CommandFailedEvent`.""" + + def started(self, event): + """Abstract method to handle a `CommandStartedEvent`. + + :Parameters: + - `event`: An instance of :class:`CommandStartedEvent`. + """ + raise NotImplementedError + + def succeeded(self, event): + """Abstract method to handle a `CommandSucceededEvent`. + + :Parameters: + - `event`: An instance of :class:`CommandSucceededEvent`. + """ + raise NotImplementedError + + def failed(self, event): + """Abstract method to handle a `CommandFailedEvent`. + + :Parameters: + - `event`: An instance of :class:`CommandFailedEvent`. + """ + raise NotImplementedError + + +class ServerHeartbeatListener(_EventListener): + """Abstract base class for server heartbeat listeners. + Handles `ServerHeartbeatStartedEvent`, `ServerHeartbeatSucceededEvent`, + and `ServerHeartbeatFailedEvent`. + + .. versionadded:: 3.3 + """ + + def started(self, event): + """Abstract method to handle a `ServerHeartbeatStartedEvent`. + + :Parameters: + - `event`: An instance of :class:`ServerHeartbeatStartedEvent`. + """ + raise NotImplementedError + + def succeeded(self, event): + """Abstract method to handle a `ServerHeartbeatSucceededEvent`. + + :Parameters: + - `event`: An instance of :class:`ServerHeartbeatSucceededEvent`. + """ + raise NotImplementedError + + def failed(self, event): + """Abstract method to handle a `ServerHeartbeatFailedEvent`. + + :Parameters: + - `event`: An instance of :class:`ServerHeartbeatFailedEvent`. + """ + raise NotImplementedError + + +class TopologyListener(_EventListener): + """Abstract base class for topology monitoring listeners. + Handles `TopologyOpenedEvent`, `TopologyDescriptionChangedEvent`, and + `TopologyClosedEvent`. + + .. versionadded:: 3.3 + """ + + def opened(self, event): + """Abstract method to handle a `TopologyOpenedEvent`. + + :Parameters: + - `event`: An instance of :class:`TopologyOpenedEvent`. + """ + raise NotImplementedError + + def description_changed(self, event): + """Abstract method to handle a `TopologyDescriptionChangedEvent`. + + :Parameters: + - `event`: An instance of :class:`TopologyDescriptionChangedEvent`. + """ + raise NotImplementedError + + def closed(self, event): + """Abstract method to handle a `TopologyClosedEvent`. + + :Parameters: + - `event`: An instance of :class:`TopologyClosedEvent`. + """ + raise NotImplementedError + + +class ServerListener(_EventListener): + """Abstract base class for server listeners. + Handles `ServerOpeningEvent`, `ServerDescriptionChangedEvent`, and + `ServerClosedEvent`. + + .. versionadded:: 3.3 + """ + + def opened(self, event): + """Abstract method to handle a `ServerOpeningEvent`. + + :Parameters: + - `event`: An instance of :class:`ServerOpeningEvent`. + """ + raise NotImplementedError + + def description_changed(self, event): + """Abstract method to handle a `ServerDescriptionChangedEvent`. + + :Parameters: + - `event`: An instance of :class:`ServerDescriptionChangedEvent`. + """ + raise NotImplementedError + + def closed(self, event): + """Abstract method to handle a `ServerClosedEvent`. + + :Parameters: + - `event`: An instance of :class:`ServerClosedEvent`. + """ + raise NotImplementedError + + +def _to_micros(dur): + """Convert duration 'dur' to microseconds.""" + return int(dur.total_seconds() * 10e5) + + +def _validate_event_listeners(option, listeners): + """Validate event listeners""" + if not isinstance(listeners, abc.Sequence): + raise TypeError("%s must be a list or tuple" % (option,)) + for listener in listeners: + if not isinstance(listener, _EventListener): + raise TypeError("Listeners for %s must be either a " + "CommandListener, ServerHeartbeatListener, " + "ServerListener, or TopologyListener." % (option,)) + return listeners + + +def register(listener): + """Register a global event listener. + + :Parameters: + - `listener`: A subclasses of :class:`CommandListener`, + :class:`ServerHeartbeatListener`, :class:`ServerListener`, or + :class:`TopologyListener`. + """ + if not isinstance(listener, _EventListener): + raise TypeError("Listeners for %s must be either a " + "CommandListener, ServerHeartbeatListener, " + "ServerListener, or TopologyListener." % (listener,)) + if isinstance(listener, CommandListener): + _LISTENERS.command_listeners.append(listener) + if isinstance(listener, ServerHeartbeatListener): + _LISTENERS.server_heartbeat_listeners.append(listener) + if isinstance(listener, ServerListener): + _LISTENERS.server_listeners.append(listener) + if isinstance(listener, TopologyListener): + _LISTENERS.topology_listeners.append(listener) + + +# Note - to avoid bugs from forgetting which if these is all lowercase and +# which are camelCase, and at the same time avoid having to add a test for +# every command, use all lowercase here and test against command_name.lower(). +_SENSITIVE_COMMANDS = set( + ["authenticate", "saslstart", "saslcontinue", "getnonce", "createuser", + "updateuser", "copydbgetnonce", "copydbsaslstart", "copydb"]) + + +class _CommandEvent(object): + """Base class for command events.""" + + __slots__ = ("__cmd_name", "__rqst_id", "__conn_id", "__op_id") + + def __init__(self, command_name, request_id, connection_id, operation_id): + self.__cmd_name = command_name + self.__rqst_id = request_id + self.__conn_id = connection_id + self.__op_id = operation_id + + @property + def command_name(self): + """The command name.""" + return self.__cmd_name + + @property + def request_id(self): + """The request id for this operation.""" + return self.__rqst_id + + @property + def connection_id(self): + """The address (host, port) of the server this command was sent to.""" + return self.__conn_id + + @property + def operation_id(self): + """An id for this series of events or None.""" + return self.__op_id + + +class CommandStartedEvent(_CommandEvent): + """Event published when a command starts. + + :Parameters: + - `command`: The command document. + - `database_name`: The name of the database this command was run against. + - `request_id`: The request id for this operation. + - `connection_id`: The address (host, port) of the server this command + was sent to. + - `operation_id`: An optional identifier for a series of related events. + """ + __slots__ = ("__cmd", "__db") + + def __init__(self, command, database_name, *args): + if not command: + raise ValueError("%r is not a valid command" % (command,)) + # Command name must be first key. + command_name = next(iter(command)) + super(CommandStartedEvent, self).__init__(command_name, *args) + if command_name.lower() in _SENSITIVE_COMMANDS: + self.__cmd = {} + else: + self.__cmd = command + self.__db = database_name + + @property + def command(self): + """The command document.""" + return self.__cmd + + @property + def database_name(self): + """The name of the database this command was run against.""" + return self.__db + + +class CommandSucceededEvent(_CommandEvent): + """Event published when a command succeeds. + + :Parameters: + - `duration`: The command duration as a datetime.timedelta. + - `reply`: The server reply document. + - `command_name`: The command name. + - `request_id`: The request id for this operation. + - `connection_id`: The address (host, port) of the server this command + was sent to. + - `operation_id`: An optional identifier for a series of related events. + """ + __slots__ = ("__duration_micros", "__reply") + + def __init__(self, duration, reply, command_name, + request_id, connection_id, operation_id): + super(CommandSucceededEvent, self).__init__( + command_name, request_id, connection_id, operation_id) + self.__duration_micros = _to_micros(duration) + if command_name.lower() in _SENSITIVE_COMMANDS: + self.__reply = {} + else: + self.__reply = reply + + @property + def duration_micros(self): + """The duration of this operation in microseconds.""" + return self.__duration_micros + + @property + def reply(self): + """The server failure document for this operation.""" + return self.__reply + + +class CommandFailedEvent(_CommandEvent): + """Event published when a command fails. + + :Parameters: + - `duration`: The command duration as a datetime.timedelta. + - `failure`: The server reply document. + - `command_name`: The command name. + - `request_id`: The request id for this operation. + - `connection_id`: The address (host, port) of the server this command + was sent to. + - `operation_id`: An optional identifier for a series of related events. + """ + __slots__ = ("__duration_micros", "__failure") + + def __init__(self, duration, failure, *args): + super(CommandFailedEvent, self).__init__(*args) + self.__duration_micros = _to_micros(duration) + self.__failure = failure + + @property + def duration_micros(self): + """The duration of this operation in microseconds.""" + return self.__duration_micros + + @property + def failure(self): + """The server failure document for this operation.""" + return self.__failure + + +class _ServerEvent(object): + """Base class for server events.""" + + __slots__ = ("__server_address", "__topology_id") + + def __init__(self, server_address, topology_id): + self.__server_address = server_address + self.__topology_id = topology_id + + @property + def server_address(self): + """The address (host/port pair) of the server""" + return self.__server_address + + @property + def topology_id(self): + """A unique identifier for the topology this server is a part of.""" + return self.__topology_id + + +class ServerDescriptionChangedEvent(_ServerEvent): + """Published when server description changes. + + .. versionadded:: 3.3 + """ + + __slots__ = ('__previous_description', '__new_description') + + def __init__(self, previous_description, new_description, *args): + super(ServerDescriptionChangedEvent, self).__init__(*args) + self.__previous_description = previous_description + self.__new_description = new_description + + @property + def previous_description(self): + """The previous + :class:`~pymongo.server_description.ServerDescription`.""" + return self.__previous_description + + @property + def new_description(self): + """The new + :class:`~pymongo.server_description.ServerDescription`.""" + return self.__new_description + + +class ServerOpeningEvent(_ServerEvent): + """Published when server is initialized. + + .. versionadded:: 3.3 + """ + + __slots__ = () + + +class ServerClosedEvent(_ServerEvent): + """Published when server is closed. + + .. versionadded:: 3.3 + """ + + __slots__ = () + + +class TopologyEvent(object): + """Base class for topology description events.""" + + __slots__ = ('__topology_id') + + def __init__(self, topology_id): + self.__topology_id = topology_id + + @property + def topology_id(self): + """A unique identifier for the topology this server is a part of.""" + return self.__topology_id + + +class TopologyDescriptionChangedEvent(TopologyEvent): + """Published when the topology description changes. + + .. versionadded:: 3.3 + """ + + __slots__ = ('__previous_description', '__new_description') + + def __init__(self, previous_description, new_description, *args): + super(TopologyDescriptionChangedEvent, self).__init__(*args) + self.__previous_description = previous_description + self.__new_description = new_description + + @property + def previous_description(self): + """The previous + :class:`~pymongo.topology_description.TopologyDescription`.""" + return self.__previous_description + + @property + def new_description(self): + """The new + :class:`~pymongo.topology_description.TopologyDescription`.""" + return self.__new_description + + +class TopologyOpenedEvent(TopologyEvent): + """Published when the topology is initialized. + + .. versionadded:: 3.3 + """ + + __slots__ = () + + +class TopologyClosedEvent(TopologyEvent): + """Published when the topology is closed. + + .. versionadded:: 3.3 + """ + + __slots__ = () + + +class _ServerHeartbeatEvent(object): + """Base class for server heartbeat events.""" + + __slots__ = ('__connection_id') + + def __init__(self, connection_id): + self.__connection_id = connection_id + + @property + def connection_id(self): + """The address (host, port) of the server this heartbeat was sent + to.""" + return self.__connection_id + + +class ServerHeartbeatStartedEvent(_ServerHeartbeatEvent): + """Published when a heartbeat is started. + + .. versionadded:: 3.3 + """ + + __slots__ = () + + +class ServerHeartbeatSucceededEvent(_ServerHeartbeatEvent): + """Fired when the server heartbeat succeeds. + + .. versionadded:: 3.3 + """ + + __slots__ = ('__duration', '__reply') + + def __init__(self, duration, reply, *args): + super(ServerHeartbeatSucceededEvent, self).__init__(*args) + self.__duration = duration + self.__reply = reply + + @property + def duration(self): + """The duration of this heartbeat in microseconds.""" + return self.__duration + + @property + def reply(self): + """An instance of :class:`~pymongo.ismaster.IsMaster`.""" + return self.__reply + + +class ServerHeartbeatFailedEvent(_ServerHeartbeatEvent): + """Fired when the server heartbeat fails, either with an "ok: 0" + or a socket exception. + + .. versionadded:: 3.3 + """ + + __slots__ = ('__duration', '__reply') + + def __init__(self, duration, reply, *args): + super(ServerHeartbeatFailedEvent, self).__init__(*args) + self.__duration = duration + self.__reply = reply + + @property + def duration(self): + """The duration of this heartbeat in microseconds.""" + return self.__duration + + @property + def reply(self): + """A subclass of :exc:`Exception`.""" + return self.__reply + + +class _EventListeners(object): + """Configure event listeners for a client instance. + + Any event listeners registered globally are included by default. + + :Parameters: + - `listeners`: A list of event listeners. + """ + def __init__(self, listeners): + self.__command_listeners = _LISTENERS.command_listeners[:] + self.__server_listeners = _LISTENERS.server_listeners[:] + lst = _LISTENERS.server_heartbeat_listeners + self.__server_heartbeat_listeners = lst[:] + self.__topology_listeners = _LISTENERS.topology_listeners[:] + if listeners is not None: + for lst in listeners: + if isinstance(lst, CommandListener): + self.__command_listeners.append(lst) + if isinstance(lst, ServerListener): + self.__server_listeners.append(lst) + if isinstance(lst, ServerHeartbeatListener): + self.__server_heartbeat_listeners.append(lst) + if isinstance(lst, TopologyListener): + self.__topology_listeners.append(lst) + self.__enabled_for_commands = bool(self.__command_listeners) + self.__enabled_for_server = bool(self.__server_listeners) + self.__enabled_for_server_heartbeat = bool( + self.__server_heartbeat_listeners) + self.__enabled_for_topology = bool(self.__topology_listeners) + + @property + def enabled_for_commands(self): + """Are any CommandListener instances registered?""" + return self.__enabled_for_commands + + @property + def enabled_for_server(self): + """Are any ServerListener instances registered?""" + return self.__enabled_for_server + + @property + def enabled_for_server_heartbeat(self): + """Are any ServerHeartbeatListener instances registered?""" + return self.__enabled_for_server_heartbeat + + @property + def enabled_for_topology(self): + """Are any TopologyListener instances registered?""" + return self.__enabled_for_topology + + def event_listeners(self): + """List of registered event listeners.""" + return (self.__command_listeners[:], + self.__server_heartbeat_listeners[:], + self.__server_listeners[:], + self.__topology_listeners[:]) + + def publish_command_start(self, command, database_name, + request_id, connection_id, op_id=None): + """Publish a CommandStartedEvent to all command listeners. + + :Parameters: + - `command`: The command document. + - `database_name`: The name of the database this command was run + against. + - `request_id`: The request id for this operation. + - `connection_id`: The address (host, port) of the server this + command was sent to. + - `op_id`: The (optional) operation id for this operation. + """ + if op_id is None: + op_id = request_id + event = CommandStartedEvent( + command, database_name, request_id, connection_id, op_id) + for subscriber in self.__command_listeners: + try: + subscriber.started(event) + except Exception: + _handle_exception() + + def publish_command_success(self, duration, reply, command_name, + request_id, connection_id, op_id=None): + """Publish a CommandSucceededEvent to all command listeners. + + :Parameters: + - `duration`: The command duration as a datetime.timedelta. + - `reply`: The server reply document. + - `command_name`: The command name. + - `request_id`: The request id for this operation. + - `connection_id`: The address (host, port) of the server this + command was sent to. + - `op_id`: The (optional) operation id for this operation. + """ + if op_id is None: + op_id = request_id + event = CommandSucceededEvent( + duration, reply, command_name, request_id, connection_id, op_id) + for subscriber in self.__command_listeners: + try: + subscriber.succeeded(event) + except Exception: + _handle_exception() + + def publish_command_failure(self, duration, failure, command_name, + request_id, connection_id, op_id=None): + """Publish a CommandFailedEvent to all command listeners. + + :Parameters: + - `duration`: The command duration as a datetime.timedelta. + - `failure`: The server reply document or failure description + document. + - `command_name`: The command name. + - `request_id`: The request id for this operation. + - `connection_id`: The address (host, port) of the server this + command was sent to. + - `op_id`: The (optional) operation id for this operation. + """ + if op_id is None: + op_id = request_id + event = CommandFailedEvent( + duration, failure, command_name, request_id, connection_id, op_id) + for subscriber in self.__command_listeners: + try: + subscriber.failed(event) + except Exception: + _handle_exception() + + def publish_server_heartbeat_started(self, connection_id): + """Publish a ServerHeartbeatStartedEvent to all server heartbeat + listeners. + + :Parameters: + - `connection_id`: The address (host/port pair) of the connection. + """ + event = ServerHeartbeatStartedEvent(connection_id) + for subscriber in self.__server_heartbeat_listeners: + try: + subscriber.started(event) + except Exception: + _handle_exception() + + def publish_server_heartbeat_succeeded(self, connection_id, duration, + reply): + """Publish a ServerHeartbeatSucceededEvent to all server heartbeat + listeners. + + :Parameters: + - `connection_id`: The address (host/port pair) of the connection. + - `duration`: The execution time of the event in the highest possible + resolution for the platform. + - `reply`: The command reply. + """ + event = ServerHeartbeatSucceededEvent(duration, reply, connection_id) + for subscriber in self.__server_heartbeat_listeners: + try: + subscriber.succeeded(event) + except Exception: + _handle_exception() + + def publish_server_heartbeat_failed(self, connection_id, duration, reply): + """Publish a ServerHeartbeatFailedEvent to all server heartbeat + listeners. + + :Parameters: + - `connection_id`: The address (host/port pair) of the connection. + - `duration`: The execution time of the event in the highest possible + resolution for the platform. + - `reply`: The command reply. + """ + event = ServerHeartbeatFailedEvent(duration, reply, connection_id) + for subscriber in self.__server_heartbeat_listeners: + try: + subscriber.failed(event) + except Exception: + _handle_exception() + + def publish_server_opened(self, server_address, topology_id): + """Publish a ServerOpeningEvent to all server listeners. + + :Parameters: + - `server_address`: The address (host/port pair) of the server. + - `topology_id`: A unique identifier for the topology this server + is a part of. + """ + event = ServerOpeningEvent(server_address, topology_id) + for subscriber in self.__server_listeners: + try: + subscriber.opened(event) + except Exception: + _handle_exception() + + def publish_server_closed(self, server_address, topology_id): + """Publish a ServerClosedEvent to all server listeners. + + :Parameters: + - `server_address`: The address (host/port pair) of the server. + - `topology_id`: A unique identifier for the topology this server + is a part of. + """ + event = ServerClosedEvent(server_address, topology_id) + for subscriber in self.__server_listeners: + try: + subscriber.closed(event) + except Exception: + _handle_exception() + + def publish_server_description_changed(self, previous_description, + new_description, server_address, + topology_id): + """Publish a ServerDescriptionChangedEvent to all server listeners. + + :Parameters: + - `previous_description`: The previous server description. + - `server_address`: The address (host/port pair) of the server. + - `new_description`: The new server description. + - `topology_id`: A unique identifier for the topology this server + is a part of. + """ + event = ServerDescriptionChangedEvent(previous_description, + new_description, server_address, + topology_id) + for subscriber in self.__server_listeners: + try: + subscriber.description_changed(event) + except Exception: + _handle_exception() + + def publish_topology_opened(self, topology_id): + """Publish a TopologyOpenedEvent to all topology listeners. + + :Parameters: + - `topology_id`: A unique identifier for the topology this server + is a part of. + """ + event = TopologyOpenedEvent(topology_id) + for subscriber in self.__topology_listeners: + try: + subscriber.opened(event) + except Exception: + _handle_exception() + + def publish_topology_closed(self, topology_id): + """Publish a TopologyClosedEvent to all topology listeners. + + :Parameters: + - `topology_id`: A unique identifier for the topology this server + is a part of. + """ + event = TopologyClosedEvent(topology_id) + for subscriber in self.__topology_listeners: + try: + subscriber.closed(event) + except Exception: + _handle_exception() + + def publish_topology_description_changed(self, previous_description, + new_description, topology_id): + """Publish a TopologyDescriptionChangedEvent to all topology listeners. + + :Parameters: + - `previous_description`: The previous topology description. + - `new_description`: The new topology description. + - `topology_id`: A unique identifier for the topology this server + is a part of. + """ + event = TopologyDescriptionChangedEvent(previous_description, + new_description, topology_id) + for subscriber in self.__topology_listeners: + try: + subscriber.description_changed(event) + except Exception: + _handle_exception() diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/monotonic.py b/mongo_mac/lib/python3.6/site-packages/pymongo/monotonic.py new file mode 100644 index 0000000..3be25b8 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/monotonic.py @@ -0,0 +1,38 @@ +# Copyright 2014-2015 MongoDB, Inc. +# +# 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. + +"""Time. Monotonic if possible. +""" + +from __future__ import absolute_import + +__all__ = ['time'] + +try: + # Patches standard time module. + # From https://pypi.python.org/pypi/Monotime. + import monotime +except ImportError: + pass + +try: + # From https://pypi.python.org/pypi/monotonic. + from monotonic import monotonic as time +except ImportError: + try: + # Monotime or Python 3. + from time import monotonic as time + except ImportError: + # Not monotonic. + from time import time diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/network.py b/mongo_mac/lib/python3.6/site-packages/pymongo/network.py new file mode 100644 index 0000000..c9ee2b1 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/network.py @@ -0,0 +1,305 @@ +# Copyright 2015-present MongoDB, Inc. +# +# 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. + +"""Internal network layer helper methods.""" + +import datetime +import errno +import select +import struct +import threading + +_HAS_POLL = True +_EVENT_MASK = 0 +try: + from select import poll + _EVENT_MASK = ( + select.POLLIN | select.POLLPRI | select.POLLERR | select.POLLHUP) +except ImportError: + _HAS_POLL = False + +try: + from select import error as _SELECT_ERROR +except ImportError: + _SELECT_ERROR = OSError + +from bson.py3compat import PY3 + +from pymongo import helpers, message +from pymongo.common import MAX_MESSAGE_SIZE +from pymongo.compression_support import decompress, _NO_COMPRESSION +from pymongo.errors import (AutoReconnect, + NotMasterError, + OperationFailure, + ProtocolError) +from pymongo.message import _UNPACK_REPLY + + +_UNPACK_HEADER = struct.Struct("<iiii").unpack + + +def command(sock, dbname, spec, slave_ok, is_mongos, + read_preference, codec_options, session, client, check=True, + allowable_errors=None, address=None, + check_keys=False, listeners=None, max_bson_size=None, + read_concern=None, + parse_write_concern_error=False, + collation=None, + compression_ctx=None, + use_op_msg=False, + unacknowledged=False, + user_fields=None): + """Execute a command over the socket, or raise socket.error. + + :Parameters: + - `sock`: a raw socket instance + - `dbname`: name of the database on which to run the command + - `spec`: a command document as an ordered dict type, eg SON. + - `slave_ok`: whether to set the SlaveOkay wire protocol bit + - `is_mongos`: are we connected to a mongos? + - `read_preference`: a read preference + - `codec_options`: a CodecOptions instance + - `session`: optional ClientSession instance. + - `client`: optional MongoClient instance for updating $clusterTime. + - `check`: raise OperationFailure if there are errors + - `allowable_errors`: errors to ignore if `check` is True + - `address`: the (host, port) of `sock` + - `check_keys`: if True, check `spec` for invalid keys + - `listeners`: An instance of :class:`~pymongo.monitoring.EventListeners` + - `max_bson_size`: The maximum encoded bson size for this server + - `read_concern`: The read concern for this command. + - `parse_write_concern_error`: Whether to parse the ``writeConcernError`` + field in the command response. + - `collation`: The collation for this command. + - `compression_ctx`: optional compression Context. + - `use_op_msg`: True if we should use OP_MSG. + - `unacknowledged`: True if this is an unacknowledged command. + - `user_fields` (optional): Response fields that should be decoded + using the TypeDecoders from codec_options, passed to + bson._decode_all_selective. + """ + name = next(iter(spec)) + ns = dbname + '.$cmd' + flags = 4 if slave_ok else 0 + + # Publish the original command document, perhaps with lsid and $clusterTime. + orig = spec + if is_mongos and not use_op_msg: + spec = message._maybe_add_read_preference(spec, read_preference) + if read_concern and not (session and session._in_transaction): + if read_concern.level: + spec['readConcern'] = read_concern.document + if (session and session.options.causal_consistency + and session.operation_time is not None): + spec.setdefault( + 'readConcern', {})['afterClusterTime'] = session.operation_time + if collation is not None: + spec['collation'] = collation + + publish = listeners is not None and listeners.enabled_for_commands + if publish: + start = datetime.datetime.now() + + if compression_ctx and name.lower() in _NO_COMPRESSION: + compression_ctx = None + + if use_op_msg: + flags = 2 if unacknowledged else 0 + request_id, msg, size, max_doc_size = message._op_msg( + flags, spec, dbname, read_preference, slave_ok, check_keys, + codec_options, ctx=compression_ctx) + # If this is an unacknowledged write then make sure the encoded doc(s) + # are small enough, otherwise rely on the server to return an error. + if (unacknowledged and max_bson_size is not None and + max_doc_size > max_bson_size): + message._raise_document_too_large(name, size, max_bson_size) + else: + request_id, msg, size = message.query( + flags, ns, 0, -1, spec, None, codec_options, check_keys, + compression_ctx) + + if (max_bson_size is not None + and size > max_bson_size + message._COMMAND_OVERHEAD): + message._raise_document_too_large( + name, size, max_bson_size + message._COMMAND_OVERHEAD) + + if publish: + encoding_duration = datetime.datetime.now() - start + listeners.publish_command_start(orig, dbname, request_id, address) + start = datetime.datetime.now() + + try: + sock.sendall(msg) + if use_op_msg and unacknowledged: + # Unacknowledged, fake a successful command response. + response_doc = {"ok": 1} + else: + reply = receive_message(sock, request_id) + unpacked_docs = reply.unpack_response( + codec_options=codec_options, user_fields=user_fields) + + response_doc = unpacked_docs[0] + if client: + client._receive_cluster_time(response_doc, session) + if check: + helpers._check_command_response( + response_doc, None, allowable_errors, + parse_write_concern_error=parse_write_concern_error) + except Exception as exc: + if publish: + duration = (datetime.datetime.now() - start) + encoding_duration + if isinstance(exc, (NotMasterError, OperationFailure)): + failure = exc.details + else: + failure = message._convert_exception(exc) + listeners.publish_command_failure( + duration, failure, name, request_id, address) + raise + if publish: + duration = (datetime.datetime.now() - start) + encoding_duration + listeners.publish_command_success( + duration, response_doc, name, request_id, address) + return response_doc + +_UNPACK_COMPRESSION_HEADER = struct.Struct("<iiB").unpack + +def receive_message(sock, request_id, max_message_size=MAX_MESSAGE_SIZE): + """Receive a raw BSON message or raise socket.error.""" + # Ignore the response's request id. + length, _, response_to, op_code = _UNPACK_HEADER( + _receive_data_on_socket(sock, 16)) + # No request_id for exhaust cursor "getMore". + if request_id is not None: + if request_id != response_to: + raise ProtocolError("Got response id %r but expected " + "%r" % (response_to, request_id)) + if length <= 16: + raise ProtocolError("Message length (%r) not longer than standard " + "message header size (16)" % (length,)) + if length > max_message_size: + raise ProtocolError("Message length (%r) is larger than server max " + "message size (%r)" % (length, max_message_size)) + if op_code == 2012: + op_code, _, compressor_id = _UNPACK_COMPRESSION_HEADER( + _receive_data_on_socket(sock, 9)) + data = decompress( + _receive_data_on_socket(sock, length - 25), compressor_id) + else: + data = _receive_data_on_socket(sock, length - 16) + + try: + unpack_reply = _UNPACK_REPLY[op_code] + except KeyError: + raise ProtocolError("Got opcode %r but expected " + "%r" % (op_code, _UNPACK_REPLY.keys())) + return unpack_reply(data) + + +# memoryview was introduced in Python 2.7 but we only use it on Python 3 +# because before 2.7.4 the struct module did not support memoryview: +# https://bugs.python.org/issue10212. +# In Jython, using slice assignment on a memoryview results in a +# NullPointerException. +if not PY3: + def _receive_data_on_socket(sock, length): + buf = bytearray(length) + i = 0 + while length: + try: + chunk = sock.recv(length) + except (IOError, OSError) as exc: + if _errno_from_exception(exc) == errno.EINTR: + continue + raise + if chunk == b"": + raise AutoReconnect("connection closed") + + buf[i:i + len(chunk)] = chunk + i += len(chunk) + length -= len(chunk) + + return bytes(buf) +else: + def _receive_data_on_socket(sock, length): + buf = bytearray(length) + mv = memoryview(buf) + bytes_read = 0 + while bytes_read < length: + try: + chunk_length = sock.recv_into(mv[bytes_read:]) + except (IOError, OSError) as exc: + if _errno_from_exception(exc) == errno.EINTR: + continue + raise + if chunk_length == 0: + raise AutoReconnect("connection closed") + + bytes_read += chunk_length + + return mv + + +def _errno_from_exception(exc): + if hasattr(exc, 'errno'): + return exc.errno + elif exc.args: + return exc.args[0] + else: + return None + + +class SocketChecker(object): + + def __init__(self): + if _HAS_POLL: + self._lock = threading.Lock() + self._poller = poll() + else: + self._lock = None + self._poller = None + + def socket_closed(self, sock): + """Return True if we know socket has been closed, False otherwise. + """ + while True: + try: + if self._poller: + with self._lock: + self._poller.register(sock, _EVENT_MASK) + try: + rd = self._poller.poll(0) + finally: + self._poller.unregister(sock) + else: + rd, _, _ = select.select([sock], [], [], 0) + except (RuntimeError, KeyError): + # RuntimeError is raised during a concurrent poll. KeyError + # is raised by unregister if the socket is not in the poller. + # These errors should not be possible since we protect the + # poller with a mutex. + raise + except ValueError: + # ValueError is raised by register/unregister/select if the + # socket file descriptor is negative or outside the range for + # select (> 1023). + return True + except (_SELECT_ERROR, IOError) as exc: + if _errno_from_exception(exc) in (errno.EINTR, errno.EAGAIN): + continue + return True + except Exception: + # Any other exceptions should be attributed to a closed + # or invalid socket. + return True + return len(rd) > 0 diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/operations.py b/mongo_mac/lib/python3.6/site-packages/pymongo/operations.py new file mode 100644 index 0000000..acec05e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/operations.py @@ -0,0 +1,370 @@ +# Copyright 2015-present MongoDB, Inc. +# +# 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. + +"""Operation class definitions.""" + +from pymongo.common import validate_boolean, validate_is_mapping, validate_list +from pymongo.collation import validate_collation_or_none +from pymongo.helpers import _gen_index_name, _index_document, _index_list + + +class InsertOne(object): + """Represents an insert_one operation.""" + + __slots__ = ("_doc",) + + def __init__(self, document): + """Create an InsertOne instance. + + For use with :meth:`~pymongo.collection.Collection.bulk_write`. + + :Parameters: + - `document`: The document to insert. If the document is missing an + _id field one will be added. + """ + self._doc = document + + def _add_to_bulk(self, bulkobj): + """Add this operation to the _Bulk instance `bulkobj`.""" + bulkobj.add_insert(self._doc) + + def __repr__(self): + return "InsertOne(%r)" % (self._doc,) + + def __eq__(self, other): + if type(other) == type(self): + return other._doc == self._doc + return NotImplemented + + def __ne__(self, other): + return not self == other + + +class DeleteOne(object): + """Represents a delete_one operation.""" + + __slots__ = ("_filter", "_collation") + + def __init__(self, filter, collation=None): + """Create a DeleteOne instance. + + For use with :meth:`~pymongo.collection.Collection.bulk_write`. + + :Parameters: + - `filter`: A query that matches the document to delete. + - `collation` (optional): An instance of + :class:`~pymongo.collation.Collation`. This option is only + supported on MongoDB 3.4 and above. + + .. versionchanged:: 3.5 + Added the `collation` option. + """ + if filter is not None: + validate_is_mapping("filter", filter) + self._filter = filter + self._collation = collation + + def _add_to_bulk(self, bulkobj): + """Add this operation to the _Bulk instance `bulkobj`.""" + bulkobj.add_delete(self._filter, 1, collation=self._collation) + + def __repr__(self): + return "DeleteOne(%r, %r)" % (self._filter, self._collation) + + def __eq__(self, other): + if type(other) == type(self): + return ((other._filter, other._collation) == + (self._filter, self._collation)) + return NotImplemented + + def __ne__(self, other): + return not self == other + + +class DeleteMany(object): + """Represents a delete_many operation.""" + + __slots__ = ("_filter", "_collation") + + def __init__(self, filter, collation=None): + """Create a DeleteMany instance. + + For use with :meth:`~pymongo.collection.Collection.bulk_write`. + + :Parameters: + - `filter`: A query that matches the documents to delete. + - `collation` (optional): An instance of + :class:`~pymongo.collation.Collation`. This option is only + supported on MongoDB 3.4 and above. + + .. versionchanged:: 3.5 + Added the `collation` option. + """ + if filter is not None: + validate_is_mapping("filter", filter) + self._filter = filter + self._collation = collation + + def _add_to_bulk(self, bulkobj): + """Add this operation to the _Bulk instance `bulkobj`.""" + bulkobj.add_delete(self._filter, 0, collation=self._collation) + + def __repr__(self): + return "DeleteMany(%r, %r)" % (self._filter, self._collation) + + def __eq__(self, other): + if type(other) == type(self): + return ((other._filter, other._collation) == + (self._filter, self._collation)) + return NotImplemented + + def __ne__(self, other): + return not self == other + + +class ReplaceOne(object): + """Represents a replace_one operation.""" + + __slots__ = ("_filter", "_doc", "_upsert", "_collation") + + def __init__(self, filter, replacement, upsert=False, collation=None): + """Create a ReplaceOne instance. + + For use with :meth:`~pymongo.collection.Collection.bulk_write`. + + :Parameters: + - `filter`: A query that matches the document to replace. + - `replacement`: The new document. + - `upsert` (optional): If ``True``, perform an insert if no documents + match the filter. + - `collation` (optional): An instance of + :class:`~pymongo.collation.Collation`. This option is only + supported on MongoDB 3.4 and above. + + .. versionchanged:: 3.5 + Added the `collation` option. + """ + if filter is not None: + validate_is_mapping("filter", filter) + if upsert is not None: + validate_boolean("upsert", upsert) + self._filter = filter + self._doc = replacement + self._upsert = upsert + self._collation = collation + + def _add_to_bulk(self, bulkobj): + """Add this operation to the _Bulk instance `bulkobj`.""" + bulkobj.add_replace(self._filter, self._doc, self._upsert, + collation=self._collation) + + def __eq__(self, other): + if type(other) == type(self): + return ( + (other._filter, other._doc, other._upsert, other._collation) == + (self._filter, self._doc, self._upsert, self._collation)) + return NotImplemented + + def __ne__(self, other): + return not self == other + + def __repr__(self): + return "%s(%r, %r, %r, %r)" % ( + self.__class__.__name__, self._filter, self._doc, self._upsert, + self._collation) + + +class _UpdateOp(object): + """Private base class for update operations.""" + + __slots__ = ("_filter", "_doc", "_upsert", "_collation", "_array_filters") + + def __init__(self, filter, doc, upsert, collation, array_filters): + if filter is not None: + validate_is_mapping("filter", filter) + if upsert is not None: + validate_boolean("upsert", upsert) + if array_filters is not None: + validate_list("array_filters", array_filters) + self._filter = filter + self._doc = doc + self._upsert = upsert + self._collation = collation + self._array_filters = array_filters + + def __eq__(self, other): + if type(other) == type(self): + return ( + (other._filter, other._doc, other._upsert, other._collation, + other._array_filters) == + (self._filter, self._doc, self._upsert, self._collation, + self._array_filters)) + return NotImplemented + + def __ne__(self, other): + return not self == other + + def __repr__(self): + return "%s(%r, %r, %r, %r, %r)" % ( + self.__class__.__name__, self._filter, self._doc, self._upsert, + self._collation, self._array_filters) + + +class UpdateOne(_UpdateOp): + """Represents an update_one operation.""" + + __slots__ = () + + def __init__(self, filter, update, upsert=False, collation=None, + array_filters=None): + """Represents an update_one operation. + + For use with :meth:`~pymongo.collection.Collection.bulk_write`. + + :Parameters: + - `filter`: A query that matches the document to update. + - `update`: The modifications to apply. + - `upsert` (optional): If ``True``, perform an insert if no documents + match the filter. + - `collation` (optional): An instance of + :class:`~pymongo.collation.Collation`. This option is only + supported on MongoDB 3.4 and above. + - `array_filters` (optional): A list of filters specifying which + array elements an update should apply. Requires MongoDB 3.6+. + + .. versionchanged:: 3.6 + Added the `array_filters` option. + .. versionchanged:: 3.5 + Added the `collation` option. + """ + super(UpdateOne, self).__init__(filter, update, upsert, collation, + array_filters) + + def _add_to_bulk(self, bulkobj): + """Add this operation to the _Bulk instance `bulkobj`.""" + bulkobj.add_update(self._filter, self._doc, False, self._upsert, + collation=self._collation, + array_filters=self._array_filters) + + +class UpdateMany(_UpdateOp): + """Represents an update_many operation.""" + + __slots__ = () + + def __init__(self, filter, update, upsert=False, collation=None, + array_filters=None): + """Create an UpdateMany instance. + + For use with :meth:`~pymongo.collection.Collection.bulk_write`. + + :Parameters: + - `filter`: A query that matches the documents to update. + - `update`: The modifications to apply. + - `upsert` (optional): If ``True``, perform an insert if no documents + match the filter. + - `collation` (optional): An instance of + :class:`~pymongo.collation.Collation`. This option is only + supported on MongoDB 3.4 and above. + - `array_filters` (optional): A list of filters specifying which + array elements an update should apply. Requires MongoDB 3.6+. + + .. versionchanged:: 3.6 + Added the `array_filters` option. + .. versionchanged:: 3.5 + Added the `collation` option. + """ + super(UpdateMany, self).__init__(filter, update, upsert, collation, + array_filters) + + def _add_to_bulk(self, bulkobj): + """Add this operation to the _Bulk instance `bulkobj`.""" + bulkobj.add_update(self._filter, self._doc, True, self._upsert, + collation=self._collation, + array_filters=self._array_filters) + + +class IndexModel(object): + """Represents an index to create.""" + + __slots__ = ("__document",) + + def __init__(self, keys, **kwargs): + """Create an Index instance. + + For use with :meth:`~pymongo.collection.Collection.create_indexes`. + + Takes either a single key or a list of (key, direction) pairs. + The key(s) must be an instance of :class:`basestring` + (:class:`str` in python 3), and the direction(s) must be one of + (:data:`~pymongo.ASCENDING`, :data:`~pymongo.DESCENDING`, + :data:`~pymongo.GEO2D`, :data:`~pymongo.GEOHAYSTACK`, + :data:`~pymongo.GEOSPHERE`, :data:`~pymongo.HASHED`, + :data:`~pymongo.TEXT`). + + Valid options include, but are not limited to: + + - `name`: custom name to use for this index - if none is + given, a name will be generated. + - `unique`: if ``True`` creates a uniqueness constraint on the index. + - `background`: if ``True`` this index should be created in the + background. + - `sparse`: if ``True``, omit from the index any documents that lack + the indexed field. + - `bucketSize`: for use with geoHaystack indexes. + Number of documents to group together within a certain proximity + to a given longitude and latitude. + - `min`: minimum value for keys in a :data:`~pymongo.GEO2D` + index. + - `max`: maximum value for keys in a :data:`~pymongo.GEO2D` + index. + - `expireAfterSeconds`: <int> Used to create an expiring (TTL) + collection. MongoDB will automatically delete documents from + this collection after <int> seconds. The indexed field must + be a UTC datetime or the data will not expire. + - `partialFilterExpression`: A document that specifies a filter for + a partial index. + - `collation`: An instance of :class:`~pymongo.collation.Collation` + that specifies the collation to use in MongoDB >= 3.4. + + See the MongoDB documentation for a full list of supported options by + server version. + + .. note:: `partialFilterExpression` requires server version **>= 3.2** + + :Parameters: + - `keys`: a single key or a list of (key, direction) + pairs specifying the index to create + - `**kwargs` (optional): any additional index creation + options (see the above list) should be passed as keyword + arguments + + .. versionchanged:: 3.2 + Added partialFilterExpression to support partial indexes. + """ + keys = _index_list(keys) + if "name" not in kwargs: + kwargs["name"] = _gen_index_name(keys) + kwargs["key"] = _index_document(keys) + collation = validate_collation_or_none(kwargs.pop('collation', None)) + self.__document = kwargs + if collation is not None: + self.__document['collation'] = collation + + @property + def document(self): + """An index document suitable for passing to the createIndexes + command. + """ + return self.__document diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/periodic_executor.py b/mongo_mac/lib/python3.6/site-packages/pymongo/periodic_executor.py new file mode 100644 index 0000000..2a32544 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/periodic_executor.py @@ -0,0 +1,174 @@ +# Copyright 2014-present MongoDB, Inc. +# +# 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. + +"""Run a target function on a background thread.""" + +import atexit +import threading +import time +import weakref + +from pymongo.monotonic import time as _time + + +class PeriodicExecutor(object): + def __init__(self, interval, min_interval, target, name=None): + """"Run a target function periodically on a background thread. + + If the target's return value is false, the executor stops. + + :Parameters: + - `interval`: Seconds between calls to `target`. + - `min_interval`: Minimum seconds between calls if `wake` is + called very often. + - `target`: A function. + - `name`: A name to give the underlying thread. + """ + # threading.Event and its internal condition variable are expensive + # in Python 2, see PYTHON-983. Use a boolean to know when to wake. + # The executor's design is constrained by several Python issues, see + # "periodic_executor.rst" in this repository. + self._event = False + self._interval = interval + self._min_interval = min_interval + self._target = target + self._stopped = False + self._thread = None + self._name = name + + self._thread_will_exit = False + self._lock = threading.Lock() + + def open(self): + """Start. Multiple calls have no effect. + + Not safe to call from multiple threads at once. + """ + with self._lock: + if self._thread_will_exit: + # If the background thread has read self._stopped as True + # there is a chance that it has not yet exited. The call to + # join should not block indefinitely because there is no + # other work done outside the while loop in self._run. + try: + self._thread.join() + except ReferenceError: + # Thread terminated. + pass + self._thread_will_exit = False + self._stopped = False + started = False + try: + started = self._thread and self._thread.is_alive() + except ReferenceError: + # Thread terminated. + pass + + if not started: + thread = threading.Thread(target=self._run, name=self._name) + thread.daemon = True + self._thread = weakref.proxy(thread) + _register_executor(self) + thread.start() + + def close(self, dummy=None): + """Stop. To restart, call open(). + + The dummy parameter allows an executor's close method to be a weakref + callback; see monitor.py. + """ + self._stopped = True + + def join(self, timeout=None): + if self._thread is not None: + try: + self._thread.join(timeout) + except (ReferenceError, RuntimeError): + # Thread already terminated, or not yet started. + pass + + def wake(self): + """Execute the target function soon.""" + self._event = True + + def __should_stop(self): + with self._lock: + if self._stopped: + self._thread_will_exit = True + return True + return False + + def _run(self): + while not self.__should_stop(): + try: + if not self._target(): + self._stopped = True + break + except: + with self._lock: + self._stopped = True + self._thread_will_exit = True + + raise + + deadline = _time() + self._interval + + while not self._stopped and _time() < deadline: + time.sleep(self._min_interval) + if self._event: + break # Early wake. + + self._event = False + + +# _EXECUTORS has a weakref to each running PeriodicExecutor. Once started, +# an executor is kept alive by a strong reference from its thread and perhaps +# from other objects. When the thread dies and all other referrers are freed, +# the executor is freed and removed from _EXECUTORS. If any threads are +# running when the interpreter begins to shut down, we try to halt and join +# them to avoid spurious errors. +_EXECUTORS = set() + + +def _register_executor(executor): + ref = weakref.ref(executor, _on_executor_deleted) + _EXECUTORS.add(ref) + + +def _on_executor_deleted(ref): + _EXECUTORS.remove(ref) + + +def _shutdown_executors(): + if _EXECUTORS is None: + return + + # Copy the set. Stopping threads has the side effect of removing executors. + executors = list(_EXECUTORS) + + # First signal all executors to close... + for ref in executors: + executor = ref() + if executor: + executor.close() + + # ...then try to join them. + for ref in executors: + executor = ref() + if executor: + executor.join(1) + + executor = None + +atexit.register(_shutdown_executors) diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/pool.py b/mongo_mac/lib/python3.6/site-packages/pymongo/pool.py new file mode 100644 index 0000000..15d98fd --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/pool.py @@ -0,0 +1,1113 @@ +# Copyright 2011-present MongoDB, Inc. +# +# 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 contextlib +import copy +import os +import platform +import socket +import sys +import threading +import collections + +try: + import ssl + from ssl import SSLError + _HAVE_SNI = getattr(ssl, 'HAS_SNI', False) +except ImportError: + _HAVE_SNI = False + class SSLError(socket.error): + pass + +try: + from ssl import CertificateError as _SSLCertificateError +except ImportError: + class _SSLCertificateError(ValueError): + pass + + +from bson import DEFAULT_CODEC_OPTIONS +from bson.py3compat import imap, itervalues, _unicode, integer_types +from bson.son import SON +from pymongo import auth, helpers, thread_util, __version__ +from pymongo.client_session import _validate_session_write_concern +from pymongo.common import (MAX_BSON_SIZE, + MAX_MESSAGE_SIZE, + MAX_WIRE_VERSION, + MAX_WRITE_BATCH_SIZE, + ORDERED_TYPES) +from pymongo.errors import (AutoReconnect, + ConnectionFailure, + ConfigurationError, + InvalidOperation, + DocumentTooLarge, + NetworkTimeout, + NotMasterError, + OperationFailure) +from pymongo.ismaster import IsMaster +from pymongo.monotonic import time as _time +from pymongo.network import (command, + receive_message, + SocketChecker) +from pymongo.read_preferences import ReadPreference +from pymongo.server_type import SERVER_TYPE +# Always use our backport so we always have support for IP address matching +from pymongo.ssl_match_hostname import match_hostname, CertificateError + +# For SNI support. According to RFC6066, section 3, IPv4 and IPv6 literals are +# not permitted for SNI hostname. +try: + from ipaddress import ip_address + def is_ip_address(address): + try: + ip_address(_unicode(address)) + return True + except (ValueError, UnicodeError): + return False +except ImportError: + if hasattr(socket, 'inet_pton') and socket.has_ipv6: + # Most *nix, recent Windows + def is_ip_address(address): + try: + # inet_pton rejects IPv4 literals with leading zeros + # (e.g. 192.168.0.01), inet_aton does not, and we + # can connect to them without issue. Use inet_aton. + socket.inet_aton(address) + return True + except socket.error: + try: + socket.inet_pton(socket.AF_INET6, address) + return True + except socket.error: + return False + else: + # No inet_pton + def is_ip_address(address): + try: + socket.inet_aton(address) + return True + except socket.error: + if ':' in address: + # ':' is not a valid character for a hostname. If we get + # here a few things have to be true: + # - We're on a recent version of python 2.7 (2.7.9+). + # Older 2.7 versions don't support SNI. + # - We're on Windows XP or some unusual Unix that doesn't + # have inet_pton. + # - The application is using IPv6 literals with TLS, which + # is pretty unusual. + return True + return False + +try: + from fcntl import fcntl, F_GETFD, F_SETFD, FD_CLOEXEC + def _set_non_inheritable_non_atomic(fd): + """Set the close-on-exec flag on the given file descriptor.""" + flags = fcntl(fd, F_GETFD) + fcntl(fd, F_SETFD, flags | FD_CLOEXEC) +except ImportError: + # Windows, various platforms we don't claim to support + # (Jython, IronPython, ...), systems that don't provide + # everything we need from fcntl, etc. + def _set_non_inheritable_non_atomic(dummy): + """Dummy function for platforms that don't provide fcntl.""" + pass + +_MAX_TCP_KEEPIDLE = 300 +_MAX_TCP_KEEPINTVL = 10 +_MAX_TCP_KEEPCNT = 9 + +if sys.platform == 'win32': + try: + import _winreg as winreg + except ImportError: + import winreg + + try: + with winreg.OpenKey( + winreg.HKEY_LOCAL_MACHINE, + r"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters") as key: + _DEFAULT_TCP_IDLE_MS, _ = winreg.QueryValueEx(key, "KeepAliveTime") + _DEFAULT_TCP_INTERVAL_MS, _ = winreg.QueryValueEx( + key, "KeepAliveInterval") + # Make sure these are integers. + if not isinstance(_DEFAULT_TCP_IDLE_MS, integer_types): + raise ValueError + if not isinstance(_DEFAULT_TCP_INTERVAL_MS, integer_types): + raise ValueError + except (OSError, ValueError): + # We could not check the default values so do not attempt to override. + def _set_keepalive_times(dummy): + pass + else: + def _set_keepalive_times(sock): + idle_ms = min(_DEFAULT_TCP_IDLE_MS, _MAX_TCP_KEEPIDLE * 1000) + interval_ms = min(_DEFAULT_TCP_INTERVAL_MS, + _MAX_TCP_KEEPINTVL * 1000) + if (idle_ms < _DEFAULT_TCP_IDLE_MS or + interval_ms < _DEFAULT_TCP_INTERVAL_MS): + sock.ioctl(socket.SIO_KEEPALIVE_VALS, + (1, idle_ms, interval_ms)) +else: + def _set_tcp_option(sock, tcp_option, max_value): + if hasattr(socket, tcp_option): + sockopt = getattr(socket, tcp_option) + try: + # PYTHON-1350 - NetBSD doesn't implement getsockopt for + # TCP_KEEPIDLE and friends. Don't attempt to set the + # values there. + default = sock.getsockopt(socket.IPPROTO_TCP, sockopt) + if default > max_value: + sock.setsockopt(socket.IPPROTO_TCP, sockopt, max_value) + except socket.error: + pass + + def _set_keepalive_times(sock): + _set_tcp_option(sock, 'TCP_KEEPIDLE', _MAX_TCP_KEEPIDLE) + _set_tcp_option(sock, 'TCP_KEEPINTVL', _MAX_TCP_KEEPINTVL) + _set_tcp_option(sock, 'TCP_KEEPCNT', _MAX_TCP_KEEPCNT) + +_METADATA = SON([ + ('driver', SON([('name', 'PyMongo'), ('version', __version__)])), +]) + +if sys.platform.startswith('linux'): + # platform.linux_distribution was deprecated in Python 3.5. + if sys.version_info[:2] < (3, 5): + # Distro name and version (e.g. Ubuntu 16.04 xenial) + _name = ' '.join([part for part in + platform.linux_distribution() if part]) + else: + _name = platform.system() + _METADATA['os'] = SON([ + ('type', platform.system()), + ('name', _name), + ('architecture', platform.machine()), + # Kernel version (e.g. 4.4.0-17-generic). + ('version', platform.release()) + ]) +elif sys.platform == 'darwin': + _METADATA['os'] = SON([ + ('type', platform.system()), + ('name', platform.system()), + ('architecture', platform.machine()), + # (mac|i|tv)OS(X) version (e.g. 10.11.6) instead of darwin + # kernel version. + ('version', platform.mac_ver()[0]) + ]) +elif sys.platform == 'win32': + _METADATA['os'] = SON([ + ('type', platform.system()), + # "Windows XP", "Windows 7", "Windows 10", etc. + ('name', ' '.join((platform.system(), platform.release()))), + ('architecture', platform.machine()), + # Windows patch level (e.g. 5.1.2600-SP3) + ('version', '-'.join(platform.win32_ver()[1:3])) + ]) +elif sys.platform.startswith('java'): + _name, _ver, _arch = platform.java_ver()[-1] + _METADATA['os'] = SON([ + # Linux, Windows 7, Mac OS X, etc. + ('type', _name), + ('name', _name), + # x86, x86_64, AMD64, etc. + ('architecture', _arch), + # Linux kernel version, OSX version, etc. + ('version', _ver) + ]) +else: + # Get potential alias (e.g. SunOS 5.11 becomes Solaris 2.11) + _aliased = platform.system_alias( + platform.system(), platform.release(), platform.version()) + _METADATA['os'] = SON([ + ('type', platform.system()), + ('name', ' '.join([part for part in _aliased[:2] if part])), + ('architecture', platform.machine()), + ('version', _aliased[2]) + ]) + +if platform.python_implementation().startswith('PyPy'): + _METADATA['platform'] = ' '.join( + (platform.python_implementation(), + '.'.join(imap(str, sys.pypy_version_info)), + '(Python %s)' % '.'.join(imap(str, sys.version_info)))) +elif sys.platform.startswith('java'): + _METADATA['platform'] = ' '.join( + (platform.python_implementation(), + '.'.join(imap(str, sys.version_info)), + '(%s)' % ' '.join((platform.system(), platform.release())))) +else: + _METADATA['platform'] = ' '.join( + (platform.python_implementation(), + '.'.join(imap(str, sys.version_info)))) + + +# If the first getaddrinfo call of this interpreter's life is on a thread, +# while the main thread holds the import lock, getaddrinfo deadlocks trying +# to import the IDNA codec. Import it here, where presumably we're on the +# main thread, to avoid the deadlock. See PYTHON-607. +u'foo'.encode('idna') + + +def _raise_connection_failure(address, error, msg_prefix=None): + """Convert a socket.error to ConnectionFailure and raise it.""" + host, port = address + # If connecting to a Unix socket, port will be None. + if port is not None: + msg = '%s:%d: %s' % (host, port, error) + else: + msg = '%s: %s' % (host, error) + if msg_prefix: + msg = msg_prefix + msg + if isinstance(error, socket.timeout): + raise NetworkTimeout(msg) + elif isinstance(error, SSLError) and 'timed out' in str(error): + # CPython 2.7 and PyPy 2.x do not distinguish network + # timeouts from other SSLErrors (https://bugs.python.org/issue10272). + # Luckily, we can work around this limitation because the phrase + # 'timed out' appears in all the timeout related SSLErrors raised + # on the above platforms. + raise NetworkTimeout(msg) + else: + raise AutoReconnect(msg) + + +class PoolOptions(object): + + __slots__ = ('__max_pool_size', '__min_pool_size', + '__max_idle_time_seconds', + '__connect_timeout', '__socket_timeout', + '__wait_queue_timeout', '__wait_queue_multiple', + '__ssl_context', '__ssl_match_hostname', '__socket_keepalive', + '__event_listeners', '__appname', '__driver', '__metadata', + '__compression_settings') + + def __init__(self, max_pool_size=100, min_pool_size=0, + max_idle_time_seconds=None, connect_timeout=None, + socket_timeout=None, wait_queue_timeout=None, + wait_queue_multiple=None, ssl_context=None, + ssl_match_hostname=True, socket_keepalive=True, + event_listeners=None, appname=None, driver=None, + compression_settings=None): + + self.__max_pool_size = max_pool_size + self.__min_pool_size = min_pool_size + self.__max_idle_time_seconds = max_idle_time_seconds + self.__connect_timeout = connect_timeout + self.__socket_timeout = socket_timeout + self.__wait_queue_timeout = wait_queue_timeout + self.__wait_queue_multiple = wait_queue_multiple + self.__ssl_context = ssl_context + self.__ssl_match_hostname = ssl_match_hostname + self.__socket_keepalive = socket_keepalive + self.__event_listeners = event_listeners + self.__appname = appname + self.__driver = driver + self.__compression_settings = compression_settings + self.__metadata = copy.deepcopy(_METADATA) + if appname: + self.__metadata['application'] = {'name': appname} + + # Combine the "driver" MongoClient option with PyMongo's info, like: + # { + # 'driver': { + # 'name': 'PyMongo|MyDriver', + # 'version': '3.7.0|1.2.3', + # }, + # 'platform': 'CPython 3.6.0|MyPlatform' + # } + if driver: + if driver.name: + self.__metadata['driver']['name'] = "%s|%s" % ( + _METADATA['driver']['name'], driver.name) + if driver.version: + self.__metadata['driver']['version'] = "%s|%s" % ( + _METADATA['driver']['version'], driver.version) + if driver.platform: + self.__metadata['platform'] = "%s|%s" % ( + _METADATA['platform'], driver.platform) + + @property + def max_pool_size(self): + """The maximum allowable number of concurrent connections to each + connected server. Requests to a server will block if there are + `maxPoolSize` outstanding connections to the requested server. + Defaults to 100. Cannot be 0. + + When a server's pool has reached `max_pool_size`, operations for that + server block waiting for a socket to be returned to the pool. If + ``waitQueueTimeoutMS`` is set, a blocked operation will raise + :exc:`~pymongo.errors.ConnectionFailure` after a timeout. + By default ``waitQueueTimeoutMS`` is not set. + """ + return self.__max_pool_size + + @property + def min_pool_size(self): + """The minimum required number of concurrent connections that the pool + will maintain to each connected server. Default is 0. + """ + return self.__min_pool_size + + @property + def max_idle_time_seconds(self): + """The maximum number of seconds that a connection can remain + idle in the pool before being removed and replaced. Defaults to + `None` (no limit). + """ + return self.__max_idle_time_seconds + + @property + def connect_timeout(self): + """How long a connection can take to be opened before timing out. + """ + return self.__connect_timeout + + @property + def socket_timeout(self): + """How long a send or receive on a socket can take before timing out. + """ + return self.__socket_timeout + + @property + def wait_queue_timeout(self): + """How long a thread will wait for a socket from the pool if the pool + has no free sockets. + """ + return self.__wait_queue_timeout + + @property + def wait_queue_multiple(self): + """Multiplied by max_pool_size to give the number of threads allowed + to wait for a socket at one time. + """ + return self.__wait_queue_multiple + + @property + def ssl_context(self): + """An SSLContext instance or None. + """ + return self.__ssl_context + + @property + def ssl_match_hostname(self): + """Call ssl.match_hostname if cert_reqs is not ssl.CERT_NONE. + """ + return self.__ssl_match_hostname + + @property + def socket_keepalive(self): + """Whether to send periodic messages to determine if a connection + is closed. + """ + return self.__socket_keepalive + + @property + def event_listeners(self): + """An instance of pymongo.monitoring._EventListeners. + """ + return self.__event_listeners + + @property + def appname(self): + """The application name, for sending with ismaster in server handshake. + """ + return self.__appname + + @property + def driver(self): + """Driver name and version, for sending with ismaster in handshake. + """ + return self.__driver + + @property + def compression_settings(self): + return self.__compression_settings + + @property + def metadata(self): + """A dict of metadata about the application, driver, os, and platform. + """ + return self.__metadata.copy() + + +class SocketInfo(object): + """Store a socket with some metadata. + + :Parameters: + - `sock`: a raw socket object + - `pool`: a Pool instance + - `address`: the server's (host, port) + """ + def __init__(self, sock, pool, address): + self.sock = sock + self.address = address + self.authset = set() + self.closed = False + self.last_checkin_time = _time() + self.performed_handshake = False + self.is_writable = False + self.max_wire_version = MAX_WIRE_VERSION + self.max_bson_size = MAX_BSON_SIZE + self.max_message_size = MAX_MESSAGE_SIZE + self.max_write_batch_size = MAX_WRITE_BATCH_SIZE + self.supports_sessions = False + self.is_mongos = False + self.op_msg_enabled = False + self.listeners = pool.opts.event_listeners + self.compression_settings = pool.opts.compression_settings + self.compression_context = None + + # The pool's pool_id changes with each reset() so we can close sockets + # created before the last reset. + self.pool_id = pool.pool_id + + def ismaster(self, metadata, cluster_time): + cmd = SON([('ismaster', 1)]) + if not self.performed_handshake: + cmd['client'] = metadata + if self.compression_settings: + cmd['compression'] = self.compression_settings.compressors + + if self.max_wire_version >= 6 and cluster_time is not None: + cmd['$clusterTime'] = cluster_time + + ismaster = IsMaster(self.command('admin', cmd, publish_events=False)) + self.is_writable = ismaster.is_writable + self.max_wire_version = ismaster.max_wire_version + self.max_bson_size = ismaster.max_bson_size + self.max_message_size = ismaster.max_message_size + self.max_write_batch_size = ismaster.max_write_batch_size + self.supports_sessions = ( + ismaster.logical_session_timeout_minutes is not None) + self.is_mongos = ismaster.server_type == SERVER_TYPE.Mongos + if not self.performed_handshake and self.compression_settings: + ctx = self.compression_settings.get_compression_context( + ismaster.compressors) + self.compression_context = ctx + + self.performed_handshake = True + self.op_msg_enabled = ismaster.max_wire_version >= 6 + return ismaster + + def command(self, dbname, spec, slave_ok=False, + read_preference=ReadPreference.PRIMARY, + codec_options=DEFAULT_CODEC_OPTIONS, check=True, + allowable_errors=None, check_keys=False, + read_concern=None, + write_concern=None, + parse_write_concern_error=False, + collation=None, + session=None, + client=None, + retryable_write=False, + publish_events=True, + user_fields=None): + """Execute a command or raise an error. + + :Parameters: + - `dbname`: name of the database on which to run the command + - `spec`: a command document as a dict, SON, or mapping object + - `slave_ok`: whether to set the SlaveOkay wire protocol bit + - `read_preference`: a read preference + - `codec_options`: a CodecOptions instance + - `check`: raise OperationFailure if there are errors + - `allowable_errors`: errors to ignore if `check` is True + - `check_keys`: if True, check `spec` for invalid keys + - `read_concern`: The read concern for this command. + - `write_concern`: The write concern for this command. + - `parse_write_concern_error`: Whether to parse the + ``writeConcernError`` field in the command response. + - `collation`: The collation for this command. + - `session`: optional ClientSession instance. + - `client`: optional MongoClient for gossipping $clusterTime. + - `retryable_write`: True if this command is a retryable write. + - `publish_events`: Should we publish events for this command? + - `user_fields` (optional): Response fields that should be decoded + using the TypeDecoders from codec_options, passed to + bson._decode_all_selective. + """ + self.validate_session(client, session) + session = _validate_session_write_concern(session, write_concern) + + # Ensure command name remains in first place. + if not isinstance(spec, ORDERED_TYPES): + spec = SON(spec) + + if (read_concern and self.max_wire_version < 4 + and not read_concern.ok_for_legacy): + raise ConfigurationError( + 'read concern level of %s is not valid ' + 'with a max wire version of %d.' + % (read_concern.level, self.max_wire_version)) + if not (write_concern is None or write_concern.acknowledged or + collation is None): + raise ConfigurationError( + 'Collation is unsupported for unacknowledged writes.') + if (self.max_wire_version >= 5 and + write_concern and + not write_concern.is_server_default): + spec['writeConcern'] = write_concern.document + elif self.max_wire_version < 5 and collation is not None: + raise ConfigurationError( + 'Must be connected to MongoDB 3.4+ to use a collation.') + + if session: + session._apply_to(spec, retryable_write, read_preference, self) + self.send_cluster_time(spec, session, client) + listeners = self.listeners if publish_events else None + unacknowledged = write_concern and not write_concern.acknowledged + if self.op_msg_enabled: + self._raise_if_not_writable(unacknowledged) + try: + return command(self.sock, dbname, spec, slave_ok, + self.is_mongos, read_preference, codec_options, + session, client, check, allowable_errors, + self.address, check_keys, listeners, + self.max_bson_size, read_concern, + parse_write_concern_error=parse_write_concern_error, + collation=collation, + compression_ctx=self.compression_context, + use_op_msg=self.op_msg_enabled, + unacknowledged=unacknowledged, + user_fields=user_fields) + except OperationFailure: + raise + # Catch socket.error, KeyboardInterrupt, etc. and close ourselves. + except BaseException as error: + self._raise_connection_failure(error) + + def send_message(self, message, max_doc_size): + """Send a raw BSON message or raise ConnectionFailure. + + If a network exception is raised, the socket is closed. + """ + if (self.max_bson_size is not None + and max_doc_size > self.max_bson_size): + raise DocumentTooLarge( + "BSON document too large (%d bytes) - the connected server " + "supports BSON document sizes up to %d bytes." % + (max_doc_size, self.max_bson_size)) + + try: + self.sock.sendall(message) + except BaseException as error: + self._raise_connection_failure(error) + + def receive_message(self, request_id): + """Receive a raw BSON message or raise ConnectionFailure. + + If any exception is raised, the socket is closed. + """ + try: + return receive_message(self.sock, request_id, + self.max_message_size) + except BaseException as error: + self._raise_connection_failure(error) + + def _raise_if_not_writable(self, unacknowledged): + """Raise NotMasterError on unacknowledged write if this socket is not + writable. + """ + if unacknowledged and not self.is_writable: + # Write won't succeed, bail as if we'd received a not master error. + raise NotMasterError("not master") + + def legacy_write(self, request_id, msg, max_doc_size, with_last_error): + """Send OP_INSERT, etc., optionally returning response as a dict. + + Can raise ConnectionFailure or OperationFailure. + + :Parameters: + - `request_id`: an int. + - `msg`: bytes, an OP_INSERT, OP_UPDATE, or OP_DELETE message, + perhaps with a getlasterror command appended. + - `max_doc_size`: size in bytes of the largest document in `msg`. + - `with_last_error`: True if a getlasterror command is appended. + """ + self._raise_if_not_writable(not with_last_error) + + self.send_message(msg, max_doc_size) + if with_last_error: + reply = self.receive_message(request_id) + return helpers._check_gle_response(reply.command_response()) + + def write_command(self, request_id, msg): + """Send "insert" etc. command, returning response as a dict. + + Can raise ConnectionFailure or OperationFailure. + + :Parameters: + - `request_id`: an int. + - `msg`: bytes, the command message. + """ + self.send_message(msg, 0) + reply = self.receive_message(request_id) + result = reply.command_response() + + # Raises NotMasterError or OperationFailure. + helpers._check_command_response(result) + return result + + def check_auth(self, all_credentials): + """Update this socket's authentication. + + Log in or out to bring this socket's credentials up to date with + those provided. Can raise ConnectionFailure or OperationFailure. + + :Parameters: + - `all_credentials`: dict, maps auth source to MongoCredential. + """ + if all_credentials or self.authset: + cached = set(itervalues(all_credentials)) + authset = self.authset.copy() + + # Logout any credentials that no longer exist in the cache. + for credentials in authset - cached: + auth.logout(credentials.source, self) + self.authset.discard(credentials) + + for credentials in cached - authset: + auth.authenticate(credentials, self) + self.authset.add(credentials) + + def authenticate(self, credentials): + """Log in to the server and store these credentials in `authset`. + + Can raise ConnectionFailure or OperationFailure. + + :Parameters: + - `credentials`: A MongoCredential. + """ + auth.authenticate(credentials, self) + self.authset.add(credentials) + + def validate_session(self, client, session): + """Validate this session before use with client. + + Raises error if this session is logged in as a different user or + the client is not the one that created the session. + """ + if session: + if session._client is not client: + raise InvalidOperation( + 'Can only use session with the MongoClient that' + ' started it') + if session._authset != self.authset: + raise InvalidOperation( + 'Cannot use session after authenticating with different' + ' credentials') + + def close(self): + self.closed = True + # Avoid exceptions on interpreter shutdown. + try: + self.sock.close() + except Exception: + pass + + def send_cluster_time(self, command, session, client): + """Add cluster time for MongoDB >= 3.6.""" + if self.max_wire_version >= 6 and client: + client._send_cluster_time(command, session) + + def update_last_checkin_time(self): + self.last_checkin_time = _time() + + def idle_time_seconds(self): + """Seconds since this socket was last checked into its pool.""" + return _time() - self.last_checkin_time + + def _raise_connection_failure(self, error): + # Catch *all* exceptions from socket methods and close the socket. In + # regular Python, socket operations only raise socket.error, even if + # the underlying cause was a Ctrl-C: a signal raised during socket.recv + # is expressed as an EINTR error from poll. See internal_select_ex() in + # socketmodule.c. All error codes from poll become socket.error at + # first. Eventually in PyEval_EvalFrameEx the interpreter checks for + # signals and throws KeyboardInterrupt into the current frame on the + # main thread. + # + # But in Gevent and Eventlet, the polling mechanism (epoll, kqueue, + # ...) is called in Python code, which experiences the signal as a + # KeyboardInterrupt from the start, rather than as an initial + # socket.error, so we catch that, close the socket, and reraise it. + self.close() + if isinstance(error, socket.error): + _raise_connection_failure(self.address, error) + else: + raise error + + def __eq__(self, other): + return self.sock == other.sock + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.sock) + + def __repr__(self): + return "SocketInfo(%s)%s at %s" % ( + repr(self.sock), + self.closed and " CLOSED" or "", + id(self) + ) + + +def _create_connection(address, options): + """Given (host, port) and PoolOptions, connect and return a socket object. + + Can raise socket.error. + + This is a modified version of create_connection from CPython >= 2.7. + """ + host, port = address + + # Check if dealing with a unix domain socket + if host.endswith('.sock'): + if not hasattr(socket, "AF_UNIX"): + raise ConnectionFailure("UNIX-sockets are not supported " + "on this system") + sock = socket.socket(socket.AF_UNIX) + # SOCK_CLOEXEC not supported for Unix sockets. + _set_non_inheritable_non_atomic(sock.fileno()) + try: + sock.connect(host) + return sock + except socket.error: + sock.close() + raise + + # Don't try IPv6 if we don't support it. Also skip it if host + # is 'localhost' (::1 is fine). Avoids slow connect issues + # like PYTHON-356. + family = socket.AF_INET + if socket.has_ipv6 and host != 'localhost': + family = socket.AF_UNSPEC + + err = None + for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): + af, socktype, proto, dummy, sa = res + # SOCK_CLOEXEC was new in CPython 3.2, and only available on a limited + # number of platforms (newer Linux and *BSD). Starting with CPython 3.4 + # all file descriptors are created non-inheritable. See PEP 446. + try: + sock = socket.socket( + af, socktype | getattr(socket, 'SOCK_CLOEXEC', 0), proto) + except socket.error: + # Can SOCK_CLOEXEC be defined even if the kernel doesn't support + # it? + sock = socket.socket(af, socktype, proto) + # Fallback when SOCK_CLOEXEC isn't available. + _set_non_inheritable_non_atomic(sock.fileno()) + try: + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + sock.settimeout(options.connect_timeout) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, + options.socket_keepalive) + if options.socket_keepalive: + _set_keepalive_times(sock) + sock.connect(sa) + return sock + except socket.error as e: + err = e + sock.close() + + if err is not None: + raise err + else: + # This likely means we tried to connect to an IPv6 only + # host with an OS/kernel or Python interpreter that doesn't + # support IPv6. The test case is Jython2.5.1 which doesn't + # support IPv6 at all. + raise socket.error('getaddrinfo failed') + + +_PY37PLUS = sys.version_info[:2] >= (3, 7) + + +def _configured_socket(address, options): + """Given (host, port) and PoolOptions, return a configured socket. + + Can raise socket.error, ConnectionFailure, or CertificateError. + + Sets socket's SSL and timeout options. + """ + sock = _create_connection(address, options) + ssl_context = options.ssl_context + + if ssl_context is not None: + host = address[0] + try: + # According to RFC6066, section 3, IPv4 and IPv6 literals are + # not permitted for SNI hostname. + # Previous to Python 3.7 wrap_socket would blindly pass + # IP addresses as SNI hostname. + # https://bugs.python.org/issue32185 + # We have to pass hostname / ip address to wrap_socket + # to use SSLContext.check_hostname. + if _HAVE_SNI and (not is_ip_address(host) or _PY37PLUS): + sock = ssl_context.wrap_socket(sock, server_hostname=host) + else: + sock = ssl_context.wrap_socket(sock) + except _SSLCertificateError: + sock.close() + # Raise CertificateError directly like we do after match_hostname + # below. + raise + except IOError as exc: + sock.close() + # We raise AutoReconnect for transient and permanent SSL handshake + # failures alike. Permanent handshake failures, like protocol + # mismatch, will be turned into ServerSelectionTimeoutErrors later. + _raise_connection_failure(address, exc, "SSL handshake failed: ") + if (ssl_context.verify_mode and not + getattr(ssl_context, "check_hostname", False) and + options.ssl_match_hostname): + try: + match_hostname(sock.getpeercert(), hostname=host) + except CertificateError: + sock.close() + raise + + sock.settimeout(options.socket_timeout) + return sock + + +# Do *not* explicitly inherit from object or Jython won't call __del__ +# http://bugs.jython.org/issue1057 +class Pool: + def __init__(self, address, options, handshake=True): + """ + :Parameters: + - `address`: a (hostname, port) tuple + - `options`: a PoolOptions instance + - `handshake`: whether to call ismaster for each new SocketInfo + """ + # Check a socket's health with socket_closed() every once in a while. + # Can override for testing: 0 to always check, None to never check. + self._check_interval_seconds = 1 + # LIFO pool. Sockets are ordered on idle time. Sockets claimed + # and returned to pool from the left side. Stale sockets removed + # from the right side. + self.sockets = collections.deque() + self.lock = threading.Lock() + self.active_sockets = 0 + + # Keep track of resets, so we notice sockets created before the most + # recent reset and close them. + self.pool_id = 0 + self.pid = os.getpid() + self.address = address + self.opts = options + self.handshake = handshake + + if (self.opts.wait_queue_multiple is None or + self.opts.max_pool_size is None): + max_waiters = None + else: + max_waiters = ( + self.opts.max_pool_size * self.opts.wait_queue_multiple) + + self._socket_semaphore = thread_util.create_semaphore( + self.opts.max_pool_size, max_waiters) + self.socket_checker = SocketChecker() + + def reset(self): + with self.lock: + self.pool_id += 1 + self.pid = os.getpid() + sockets, self.sockets = self.sockets, collections.deque() + self.active_sockets = 0 + + for sock_info in sockets: + sock_info.close() + + def remove_stale_sockets(self): + """Removes stale sockets then adds new ones if pool is too small.""" + if self.opts.max_idle_time_seconds is not None: + with self.lock: + while (self.sockets and + self.sockets[-1].idle_time_seconds() > self.opts.max_idle_time_seconds): + sock_info = self.sockets.pop() + sock_info.close() + while True: + with self.lock: + if (len(self.sockets) + self.active_sockets >= + self.opts.min_pool_size): + # There are enough sockets in the pool. + break + + # We must acquire the semaphore to respect max_pool_size. + if not self._socket_semaphore.acquire(False): + break + try: + sock_info = self.connect() + with self.lock: + self.sockets.appendleft(sock_info) + finally: + self._socket_semaphore.release() + + def connect(self): + """Connect to Mongo and return a new SocketInfo. + + Can raise ConnectionFailure or CertificateError. + + Note that the pool does not keep a reference to the socket -- you + must call return_socket() when you're done with it. + """ + sock = None + try: + sock = _configured_socket(self.address, self.opts) + except socket.error as error: + if sock is not None: + sock.close() + _raise_connection_failure(self.address, error) + + sock_info = SocketInfo(sock, self, self.address) + if self.handshake: + sock_info.ismaster(self.opts.metadata, None) + return sock_info + + @contextlib.contextmanager + def get_socket(self, all_credentials, checkout=False): + """Get a socket from the pool. Use with a "with" statement. + + Returns a :class:`SocketInfo` object wrapping a connected + :class:`socket.socket`. + + This method should always be used in a with-statement:: + + with pool.get_socket(credentials, checkout) as socket_info: + socket_info.send_message(msg) + data = socket_info.receive_message(op_code, request_id) + + The socket is logged in or out as needed to match ``all_credentials`` + using the correct authentication mechanism for the server's wire + protocol version. + + Can raise ConnectionFailure or OperationFailure. + + :Parameters: + - `all_credentials`: dict, maps auth source to MongoCredential. + - `checkout` (optional): keep socket checked out. + """ + # First get a socket, then attempt authentication. Simplifies + # semaphore management in the face of network errors during auth. + sock_info = self._get_socket_no_auth() + try: + sock_info.check_auth(all_credentials) + yield sock_info + except: + # Exception in caller. Decrement semaphore. + self.return_socket(sock_info) + raise + else: + if not checkout: + self.return_socket(sock_info) + + def _get_socket_no_auth(self): + """Get or create a SocketInfo. Can raise ConnectionFailure.""" + # We use the pid here to avoid issues with fork / multiprocessing. + # See test.test_client:TestClient.test_fork for an example of + # what could go wrong otherwise + if self.pid != os.getpid(): + self.reset() + + # Get a free socket or create one. + if not self._socket_semaphore.acquire( + True, self.opts.wait_queue_timeout): + self._raise_wait_queue_timeout() + with self.lock: + self.active_sockets += 1 + + # We've now acquired the semaphore and must release it on error. + try: + try: + # set.pop() isn't atomic in Jython less than 2.7, see + # http://bugs.jython.org/issue1854 + with self.lock: + # Can raise ConnectionFailure. + sock_info = self.sockets.popleft() + except IndexError: + # Can raise ConnectionFailure or CertificateError. + sock_info = self.connect() + else: + # Can raise ConnectionFailure. + sock_info = self._check(sock_info) + except Exception: + self._socket_semaphore.release() + with self.lock: + self.active_sockets -= 1 + raise + + return sock_info + + def return_socket(self, sock_info): + """Return the socket to the pool, or if it's closed discard it.""" + if self.pid != os.getpid(): + self.reset() + else: + if sock_info.pool_id != self.pool_id: + sock_info.close() + elif not sock_info.closed: + sock_info.update_last_checkin_time() + with self.lock: + self.sockets.appendleft(sock_info) + + self._socket_semaphore.release() + with self.lock: + self.active_sockets -= 1 + + def _check(self, sock_info): + """This side-effecty function checks if this socket has been idle for + for longer than the max idle time, or if the socket has been closed by + some external network error, and if so, attempts to create a new + socket. If this connection attempt fails we raise the + ConnectionFailure. + + Checking sockets lets us avoid seeing *some* + :class:`~pymongo.errors.AutoReconnect` exceptions on server + hiccups, etc. We only check if the socket was closed by an external + error if it has been > 1 second since the socket was checked into the + pool, to keep performance reasonable - we can't avoid AutoReconnects + completely anyway. + """ + idle_time_seconds = sock_info.idle_time_seconds() + # If socket is idle, open a new one. + if (self.opts.max_idle_time_seconds is not None and + idle_time_seconds > self.opts.max_idle_time_seconds): + sock_info.close() + return self.connect() + + if (self._check_interval_seconds is not None and ( + 0 == self._check_interval_seconds or + idle_time_seconds > self._check_interval_seconds)): + if self.socket_checker.socket_closed(sock_info.sock): + sock_info.close() + return self.connect() + + return sock_info + + def _raise_wait_queue_timeout(self): + raise ConnectionFailure( + 'Timed out waiting for socket from pool with max_size %r and' + ' wait_queue_timeout %r' % ( + self.opts.max_pool_size, self.opts.wait_queue_timeout)) + + def __del__(self): + # Avoid ResourceWarnings in Python 3 + for sock_info in self.sockets: + sock_info.close() diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/read_concern.py b/mongo_mac/lib/python3.6/site-packages/pymongo/read_concern.py new file mode 100644 index 0000000..3ba8c85 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/read_concern.py @@ -0,0 +1,76 @@ +# Copyright 2015 MongoDB, Inc. +# +# 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. + +"""Tools for working with read concerns.""" + +from bson.py3compat import string_type + + +class ReadConcern(object): + """ReadConcern + + :Parameters: + - `level`: (string) The read concern level specifies the level of + isolation for read operations. For example, a read operation using a + read concern level of ``majority`` will only return data that has been + written to a majority of nodes. If the level is left unspecified, the + server default will be used. + + .. versionadded:: 3.2 + + """ + + def __init__(self, level=None): + if level is None or isinstance(level, string_type): + self.__level = level + else: + raise TypeError( + 'level must be a string or None.') + + @property + def level(self): + """The read concern level.""" + return self.__level + + @property + def ok_for_legacy(self): + """Return ``True`` if this read concern is compatible with + old wire protocol versions.""" + return self.level is None or self.level == 'local' + + @property + def document(self): + """The document representation of this read concern. + + .. note:: + :class:`ReadConcern` is immutable. Mutating the value of + :attr:`document` does not mutate this :class:`ReadConcern`. + """ + doc = {} + if self.__level: + doc['level'] = self.level + return doc + + def __eq__(self, other): + if isinstance(other, ReadConcern): + return self.document == other.document + return NotImplemented + + def __repr__(self): + if self.level: + return 'ReadConcern(%s)' % self.level + return 'ReadConcern()' + + +DEFAULT_READ_CONCERN = ReadConcern() diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/read_preferences.py b/mongo_mac/lib/python3.6/site-packages/pymongo/read_preferences.py new file mode 100644 index 0000000..f4425ac --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/read_preferences.py @@ -0,0 +1,471 @@ +# Copyright 2012-present MongoDB, Inc. +# +# 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. + +"""Utilities for choosing which member of a replica set to read from.""" + +from bson.py3compat import abc, integer_types +from pymongo import max_staleness_selectors +from pymongo.errors import ConfigurationError +from pymongo.server_selectors import (member_with_tags_server_selector, + secondary_with_tags_server_selector) + + +_PRIMARY = 0 +_PRIMARY_PREFERRED = 1 +_SECONDARY = 2 +_SECONDARY_PREFERRED = 3 +_NEAREST = 4 + + +_MONGOS_MODES = ( + 'primary', + 'primaryPreferred', + 'secondary', + 'secondaryPreferred', + 'nearest', +) + + +def _validate_tag_sets(tag_sets): + """Validate tag sets for a MongoReplicaSetClient. + """ + if tag_sets is None: + return tag_sets + + if not isinstance(tag_sets, list): + raise TypeError(( + "Tag sets %r invalid, must be a list") % (tag_sets,)) + if len(tag_sets) == 0: + raise ValueError(( + "Tag sets %r invalid, must be None or contain at least one set of" + " tags") % (tag_sets,)) + + for tags in tag_sets: + if not isinstance(tags, abc.Mapping): + raise TypeError( + "Tag set %r invalid, must be an instance of dict, " + "bson.son.SON or other type that inherits from " + "collection.Mapping" % (tags,)) + + return tag_sets + + +def _invalid_max_staleness_msg(max_staleness): + return ("maxStalenessSeconds must be a positive integer, not %s" % + max_staleness) + + +# Some duplication with common.py to avoid import cycle. +def _validate_max_staleness(max_staleness): + """Validate max_staleness.""" + if max_staleness == -1: + return -1 + + if not isinstance(max_staleness, integer_types): + raise TypeError(_invalid_max_staleness_msg(max_staleness)) + + if max_staleness <= 0: + raise ValueError(_invalid_max_staleness_msg(max_staleness)) + + return max_staleness + + +class _ServerMode(object): + """Base class for all read preferences. + """ + + __slots__ = ("__mongos_mode", "__mode", "__tag_sets", "__max_staleness") + + def __init__(self, mode, tag_sets=None, max_staleness=-1): + self.__mongos_mode = _MONGOS_MODES[mode] + self.__mode = mode + self.__tag_sets = _validate_tag_sets(tag_sets) + self.__max_staleness = _validate_max_staleness(max_staleness) + + @property + def name(self): + """The name of this read preference. + """ + return self.__class__.__name__ + + @property + def mongos_mode(self): + """The mongos mode of this read preference. + """ + return self.__mongos_mode + + @property + def document(self): + """Read preference as a document. + """ + doc = {'mode': self.__mongos_mode} + if self.__tag_sets not in (None, [{}]): + doc['tags'] = self.__tag_sets + if self.__max_staleness != -1: + doc['maxStalenessSeconds'] = self.__max_staleness + return doc + + @property + def mode(self): + """The mode of this read preference instance. + """ + return self.__mode + + @property + def tag_sets(self): + """Set ``tag_sets`` to a list of dictionaries like [{'dc': 'ny'}] to + read only from members whose ``dc`` tag has the value ``"ny"``. + To specify a priority-order for tag sets, provide a list of + tag sets: ``[{'dc': 'ny'}, {'dc': 'la'}, {}]``. A final, empty tag + set, ``{}``, means "read from any member that matches the mode, + ignoring tags." MongoReplicaSetClient tries each set of tags in turn + until it finds a set of tags with at least one matching member. + + .. seealso:: `Data-Center Awareness + <http://www.mongodb.org/display/DOCS/Data+Center+Awareness>`_ + """ + return list(self.__tag_sets) if self.__tag_sets else [{}] + + @property + def max_staleness(self): + """The maximum estimated length of time (in seconds) a replica set + secondary can fall behind the primary in replication before it will + no longer be selected for operations, or -1 for no maximum.""" + return self.__max_staleness + + @property + def min_wire_version(self): + """The wire protocol version the server must support. + + Some read preferences impose version requirements on all servers (e.g. + maxStalenessSeconds requires MongoDB 3.4 / maxWireVersion 5). + + All servers' maxWireVersion must be at least this read preference's + `min_wire_version`, or the driver raises + :exc:`~pymongo.errors.ConfigurationError`. + """ + return 0 if self.__max_staleness == -1 else 5 + + def __repr__(self): + return "%s(tag_sets=%r, max_staleness=%r)" % ( + self.name, self.__tag_sets, self.__max_staleness) + + def __eq__(self, other): + if isinstance(other, _ServerMode): + return (self.mode == other.mode and + self.tag_sets == other.tag_sets and + self.max_staleness == other.max_staleness) + return NotImplemented + + def __ne__(self, other): + return not self == other + + def __getstate__(self): + """Return value of object for pickling. + + Needed explicitly because __slots__() defined. + """ + return {'mode': self.__mode, + 'tag_sets': self.__tag_sets, + 'max_staleness': self.__max_staleness} + + def __setstate__(self, value): + """Restore from pickling.""" + self.__mode = value['mode'] + self.__mongos_mode = _MONGOS_MODES[self.__mode] + self.__tag_sets = _validate_tag_sets(value['tag_sets']) + self.__max_staleness = _validate_max_staleness(value['max_staleness']) + + +class Primary(_ServerMode): + """Primary read preference. + + * When directly connected to one mongod queries are allowed if the server + is standalone or a replica set primary. + * When connected to a mongos queries are sent to the primary of a shard. + * When connected to a replica set queries are sent to the primary of + the replica set. + """ + + __slots__ = () + + def __init__(self): + super(Primary, self).__init__(_PRIMARY) + + def __call__(self, selection): + """Apply this read preference to a Selection.""" + return selection.primary_selection + + def __repr__(self): + return "Primary()" + + def __eq__(self, other): + if isinstance(other, _ServerMode): + return other.mode == _PRIMARY + return NotImplemented + + +class PrimaryPreferred(_ServerMode): + """PrimaryPreferred read preference. + + * When directly connected to one mongod queries are allowed to standalone + servers, to a replica set primary, or to replica set secondaries. + * When connected to a mongos queries are sent to the primary of a shard if + available, otherwise a shard secondary. + * When connected to a replica set queries are sent to the primary if + available, otherwise a secondary. + + :Parameters: + - `tag_sets`: The :attr:`~tag_sets` to use if the primary is not + available. + - `max_staleness`: (integer, in seconds) The maximum estimated + length of time a replica set secondary can fall behind the primary in + replication before it will no longer be selected for operations. + Default -1, meaning no maximum. If it is set, it must be at least + 90 seconds. + """ + + __slots__ = () + + def __init__(self, tag_sets=None, max_staleness=-1): + super(PrimaryPreferred, self).__init__(_PRIMARY_PREFERRED, + tag_sets, + max_staleness) + + def __call__(self, selection): + """Apply this read preference to Selection.""" + if selection.primary: + return selection.primary_selection + else: + return secondary_with_tags_server_selector( + self.tag_sets, + max_staleness_selectors.select( + self.max_staleness, selection)) + + +class Secondary(_ServerMode): + """Secondary read preference. + + * When directly connected to one mongod queries are allowed to standalone + servers, to a replica set primary, or to replica set secondaries. + * When connected to a mongos queries are distributed among shard + secondaries. An error is raised if no secondaries are available. + * When connected to a replica set queries are distributed among + secondaries. An error is raised if no secondaries are available. + + :Parameters: + - `tag_sets`: The :attr:`~tag_sets` for this read preference. + - `max_staleness`: (integer, in seconds) The maximum estimated + length of time a replica set secondary can fall behind the primary in + replication before it will no longer be selected for operations. + Default -1, meaning no maximum. If it is set, it must be at least + 90 seconds. + """ + + __slots__ = () + + def __init__(self, tag_sets=None, max_staleness=-1): + super(Secondary, self).__init__(_SECONDARY, tag_sets, max_staleness) + + def __call__(self, selection): + """Apply this read preference to Selection.""" + return secondary_with_tags_server_selector( + self.tag_sets, + max_staleness_selectors.select( + self.max_staleness, selection)) + + +class SecondaryPreferred(_ServerMode): + """SecondaryPreferred read preference. + + * When directly connected to one mongod queries are allowed to standalone + servers, to a replica set primary, or to replica set secondaries. + * When connected to a mongos queries are distributed among shard + secondaries, or the shard primary if no secondary is available. + * When connected to a replica set queries are distributed among + secondaries, or the primary if no secondary is available. + + :Parameters: + - `tag_sets`: The :attr:`~tag_sets` for this read preference. + - `max_staleness`: (integer, in seconds) The maximum estimated + length of time a replica set secondary can fall behind the primary in + replication before it will no longer be selected for operations. + Default -1, meaning no maximum. If it is set, it must be at least + 90 seconds. + """ + + __slots__ = () + + def __init__(self, tag_sets=None, max_staleness=-1): + super(SecondaryPreferred, self).__init__(_SECONDARY_PREFERRED, + tag_sets, + max_staleness) + + def __call__(self, selection): + """Apply this read preference to Selection.""" + secondaries = secondary_with_tags_server_selector( + self.tag_sets, + max_staleness_selectors.select( + self.max_staleness, selection)) + + if secondaries: + return secondaries + else: + return selection.primary_selection + + +class Nearest(_ServerMode): + """Nearest read preference. + + * When directly connected to one mongod queries are allowed to standalone + servers, to a replica set primary, or to replica set secondaries. + * When connected to a mongos queries are distributed among all members of + a shard. + * When connected to a replica set queries are distributed among all + members. + + :Parameters: + - `tag_sets`: The :attr:`~tag_sets` for this read preference. + - `max_staleness`: (integer, in seconds) The maximum estimated + length of time a replica set secondary can fall behind the primary in + replication before it will no longer be selected for operations. + Default -1, meaning no maximum. If it is set, it must be at least + 90 seconds. + """ + + __slots__ = () + + def __init__(self, tag_sets=None, max_staleness=-1): + super(Nearest, self).__init__(_NEAREST, tag_sets, max_staleness) + + def __call__(self, selection): + """Apply this read preference to Selection.""" + return member_with_tags_server_selector( + self.tag_sets, + max_staleness_selectors.select( + self.max_staleness, selection)) + + +_ALL_READ_PREFERENCES = (Primary, PrimaryPreferred, + Secondary, SecondaryPreferred, Nearest) + + +def make_read_preference(mode, tag_sets, max_staleness=-1): + if mode == _PRIMARY: + if tag_sets not in (None, [{}]): + raise ConfigurationError("Read preference primary " + "cannot be combined with tags") + if max_staleness != -1: + raise ConfigurationError("Read preference primary cannot be " + "combined with maxStalenessSeconds") + return Primary() + return _ALL_READ_PREFERENCES[mode](tag_sets, max_staleness) + + +_MODES = ( + 'PRIMARY', + 'PRIMARY_PREFERRED', + 'SECONDARY', + 'SECONDARY_PREFERRED', + 'NEAREST', +) + + +class ReadPreference(object): + """An enum that defines the read preference modes supported by PyMongo. + + See :doc:`/examples/high_availability` for code examples. + + A read preference is used in three cases: + + :class:`~pymongo.mongo_client.MongoClient` connected to a single mongod: + + - ``PRIMARY``: Queries are allowed if the server is standalone or a replica + set primary. + - All other modes allow queries to standalone servers, to a replica set + primary, or to replica set secondaries. + + :class:`~pymongo.mongo_client.MongoClient` initialized with the + ``replicaSet`` option: + + - ``PRIMARY``: Read from the primary. This is the default, and provides the + strongest consistency. If no primary is available, raise + :class:`~pymongo.errors.AutoReconnect`. + + - ``PRIMARY_PREFERRED``: Read from the primary if available, or if there is + none, read from a secondary. + + - ``SECONDARY``: Read from a secondary. If no secondary is available, + raise :class:`~pymongo.errors.AutoReconnect`. + + - ``SECONDARY_PREFERRED``: Read from a secondary if available, otherwise + from the primary. + + - ``NEAREST``: Read from any member. + + :class:`~pymongo.mongo_client.MongoClient` connected to a mongos, with a + sharded cluster of replica sets: + + - ``PRIMARY``: Read from the primary of the shard, or raise + :class:`~pymongo.errors.OperationFailure` if there is none. + This is the default. + + - ``PRIMARY_PREFERRED``: Read from the primary of the shard, or if there is + none, read from a secondary of the shard. + + - ``SECONDARY``: Read from a secondary of the shard, or raise + :class:`~pymongo.errors.OperationFailure` if there is none. + + - ``SECONDARY_PREFERRED``: Read from a secondary of the shard if available, + otherwise from the shard primary. + + - ``NEAREST``: Read from any shard member. + """ + PRIMARY = Primary() + PRIMARY_PREFERRED = PrimaryPreferred() + SECONDARY = Secondary() + SECONDARY_PREFERRED = SecondaryPreferred() + NEAREST = Nearest() + + +def read_pref_mode_from_name(name): + """Get the read preference mode from mongos/uri name. + """ + return _MONGOS_MODES.index(name) + + +class MovingAverage(object): + """Tracks an exponentially-weighted moving average.""" + def __init__(self): + self.average = None + + def add_sample(self, sample): + if sample < 0: + # Likely system time change while waiting for ismaster response + # and not using time.monotonic. Ignore it, the next one will + # probably be valid. + return + if self.average is None: + self.average = sample + else: + # The Server Selection Spec requires an exponentially weighted + # average with alpha = 0.2. + self.average = 0.8 * self.average + 0.2 * sample + + def get(self): + """Get the calculated average, or None if no samples yet.""" + return self.average + + def reset(self): + self.average = None diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/response.py b/mongo_mac/lib/python3.6/site-packages/pymongo/response.py new file mode 100644 index 0000000..a91490e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/response.py @@ -0,0 +1,101 @@ +# Copyright 2014-present MongoDB, Inc. +# +# 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. + +"""Represent a response from the server.""" + + +class Response(object): + __slots__ = ('_data', '_address', '_request_id', '_duration', + '_from_command') + + def __init__(self, data, address, request_id, duration, from_command): + """Represent a response from the server. + + :Parameters: + - `data`: A network response message. + - `address`: (host, port) of the source server. + - `request_id`: The request id of this operation. + - `duration`: The duration of the operation. + - `from_command`: if the response is the result of a db command. + """ + self._data = data + self._address = address + self._request_id = request_id + self._duration = duration + self._from_command = from_command + + @property + def data(self): + """Server response's raw BSON bytes.""" + return self._data + + @property + def address(self): + """(host, port) of the source server.""" + return self._address + + @property + def request_id(self): + """The request id of this operation.""" + return self._request_id + + @property + def duration(self): + """The duration of the operation.""" + return self._duration + + @property + def from_command(self): + """If the response is a result from a db command.""" + return self._from_command + + +class ExhaustResponse(Response): + __slots__ = ('_socket_info', '_pool') + + def __init__(self, data, address, socket_info, pool, request_id, duration, + from_command): + """Represent a response to an exhaust cursor's initial query. + + :Parameters: + - `data`: A network response message. + - `address`: (host, port) of the source server. + - `socket_info`: The SocketInfo used for the initial query. + - `pool`: The Pool from which the SocketInfo came. + - `request_id`: The request id of this operation. + - `duration`: The duration of the operation. + - `from_command`: If the response is the result of a db command. + """ + super(ExhaustResponse, self).__init__(data, + address, + request_id, + duration, + from_command) + self._socket_info = socket_info + self._pool = pool + + @property + def socket_info(self): + """The SocketInfo used for the initial query. + + The server will send batches on this socket, without waiting for + getMores from the client, until the result set is exhausted or there + is an error. + """ + return self._socket_info + + @property + def pool(self): + """The Pool from which the SocketInfo came.""" + return self._pool diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/results.py b/mongo_mac/lib/python3.6/site-packages/pymongo/results.py new file mode 100644 index 0000000..a5025e9 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/results.py @@ -0,0 +1,226 @@ +# Copyright 2015-present MongoDB, Inc. +# +# 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. + +"""Result class definitions.""" + +from pymongo.errors import InvalidOperation + + +class _WriteResult(object): + """Base class for write result classes.""" + + __slots__ = ("__acknowledged",) + + def __init__(self, acknowledged): + self.__acknowledged = acknowledged + + def _raise_if_unacknowledged(self, property_name): + """Raise an exception on property access if unacknowledged.""" + if not self.__acknowledged: + raise InvalidOperation("A value for %s is not available when " + "the write is unacknowledged. Check the " + "acknowledged attribute to avoid this " + "error." % (property_name,)) + + @property + def acknowledged(self): + """Is this the result of an acknowledged write operation? + + The :attr:`acknowledged` attribute will be ``False`` when using + ``WriteConcern(w=0)``, otherwise ``True``. + + .. note:: + If the :attr:`acknowledged` attribute is ``False`` all other + attibutes of this class will raise + :class:`~pymongo.errors.InvalidOperation` when accessed. Values for + other attributes cannot be determined if the write operation was + unacknowledged. + + .. seealso:: + :class:`~pymongo.write_concern.WriteConcern` + """ + return self.__acknowledged + + +class InsertOneResult(_WriteResult): + """The return type for :meth:`~pymongo.collection.Collection.insert_one`. + """ + + __slots__ = ("__inserted_id", "__acknowledged") + + def __init__(self, inserted_id, acknowledged): + self.__inserted_id = inserted_id + super(InsertOneResult, self).__init__(acknowledged) + + @property + def inserted_id(self): + """The inserted document's _id.""" + return self.__inserted_id + + +class InsertManyResult(_WriteResult): + """The return type for :meth:`~pymongo.collection.Collection.insert_many`. + """ + + __slots__ = ("__inserted_ids", "__acknowledged") + + def __init__(self, inserted_ids, acknowledged): + self.__inserted_ids = inserted_ids + super(InsertManyResult, self).__init__(acknowledged) + + @property + def inserted_ids(self): + """A list of _ids of the inserted documents, in the order provided. + + .. note:: If ``False`` is passed for the `ordered` parameter to + :meth:`~pymongo.collection.Collection.insert_many` the server + may have inserted the documents in a different order than what + is presented here. + """ + return self.__inserted_ids + + +class UpdateResult(_WriteResult): + """The return type for :meth:`~pymongo.collection.Collection.update_one`, + :meth:`~pymongo.collection.Collection.update_many`, and + :meth:`~pymongo.collection.Collection.replace_one`. + """ + + __slots__ = ("__raw_result", "__acknowledged") + + def __init__(self, raw_result, acknowledged): + self.__raw_result = raw_result + super(UpdateResult, self).__init__(acknowledged) + + @property + def raw_result(self): + """The raw result document returned by the server.""" + return self.__raw_result + + @property + def matched_count(self): + """The number of documents matched for this update.""" + self._raise_if_unacknowledged("matched_count") + if self.upserted_id is not None: + return 0 + return self.__raw_result.get("n", 0) + + @property + def modified_count(self): + """The number of documents modified. + + .. note:: modified_count is only reported by MongoDB 2.6 and later. + When connected to an earlier server version, or in certain mixed + version sharding configurations, this attribute will be set to + ``None``. + """ + self._raise_if_unacknowledged("modified_count") + return self.__raw_result.get("nModified") + + @property + def upserted_id(self): + """The _id of the inserted document if an upsert took place. Otherwise + ``None``. + """ + self._raise_if_unacknowledged("upserted_id") + return self.__raw_result.get("upserted") + + +class DeleteResult(_WriteResult): + """The return type for :meth:`~pymongo.collection.Collection.delete_one` + and :meth:`~pymongo.collection.Collection.delete_many`""" + + __slots__ = ("__raw_result", "__acknowledged") + + def __init__(self, raw_result, acknowledged): + self.__raw_result = raw_result + super(DeleteResult, self).__init__(acknowledged) + + @property + def raw_result(self): + """The raw result document returned by the server.""" + return self.__raw_result + + @property + def deleted_count(self): + """The number of documents deleted.""" + self._raise_if_unacknowledged("deleted_count") + return self.__raw_result.get("n", 0) + + +class BulkWriteResult(_WriteResult): + """An object wrapper for bulk API write results.""" + + __slots__ = ("__bulk_api_result", "__acknowledged") + + def __init__(self, bulk_api_result, acknowledged): + """Create a BulkWriteResult instance. + + :Parameters: + - `bulk_api_result`: A result dict from the bulk API + - `acknowledged`: Was this write result acknowledged? If ``False`` + then all properties of this object will raise + :exc:`~pymongo.errors.InvalidOperation`. + """ + self.__bulk_api_result = bulk_api_result + super(BulkWriteResult, self).__init__(acknowledged) + + @property + def bulk_api_result(self): + """The raw bulk API result.""" + return self.__bulk_api_result + + @property + def inserted_count(self): + """The number of documents inserted.""" + self._raise_if_unacknowledged("inserted_count") + return self.__bulk_api_result.get("nInserted") + + @property + def matched_count(self): + """The number of documents matched for an update.""" + self._raise_if_unacknowledged("matched_count") + return self.__bulk_api_result.get("nMatched") + + @property + def modified_count(self): + """The number of documents modified. + + .. note:: modified_count is only reported by MongoDB 2.6 and later. + When connected to an earlier server version, or in certain mixed + version sharding configurations, this attribute will be set to + ``None``. + """ + self._raise_if_unacknowledged("modified_count") + return self.__bulk_api_result.get("nModified") + + @property + def deleted_count(self): + """The number of documents deleted.""" + self._raise_if_unacknowledged("deleted_count") + return self.__bulk_api_result.get("nRemoved") + + @property + def upserted_count(self): + """The number of documents upserted.""" + self._raise_if_unacknowledged("upserted_count") + return self.__bulk_api_result.get("nUpserted") + + @property + def upserted_ids(self): + """A map of operation index to the _id of the upserted document.""" + self._raise_if_unacknowledged("upserted_ids") + if self.__bulk_api_result: + return dict((upsert["index"], upsert["_id"]) + for upsert in self.bulk_api_result["upserted"]) diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/saslprep.py b/mongo_mac/lib/python3.6/site-packages/pymongo/saslprep.py new file mode 100644 index 0000000..baa1a40 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/saslprep.py @@ -0,0 +1,108 @@ +# Copyright 2016-present MongoDB, Inc. +# +# 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. + +"""An implementation of RFC4013 SASLprep.""" + +from bson.py3compat import text_type as _text_type + +try: + import stringprep +except ImportError: + HAVE_STRINGPREP = False + def saslprep(data): + """SASLprep dummy""" + if isinstance(data, _text_type): + raise TypeError( + "The stringprep module is not available. Usernames and " + "passwords must be ASCII strings.") + return data +else: + HAVE_STRINGPREP = True + import unicodedata + # RFC4013 section 2.3 prohibited output. + _PROHIBITED = ( + # A strict reading of RFC 4013 requires table c12 here, but + # characters from it are mapped to SPACE in the Map step. Can + # normalization reintroduce them somehow? + stringprep.in_table_c12, + stringprep.in_table_c21_c22, + stringprep.in_table_c3, + stringprep.in_table_c4, + stringprep.in_table_c5, + stringprep.in_table_c6, + stringprep.in_table_c7, + stringprep.in_table_c8, + stringprep.in_table_c9) + + def saslprep(data, prohibit_unassigned_code_points=True): + """An implementation of RFC4013 SASLprep. + + :Parameters: + - `data`: The string to SASLprep. Unicode strings + (python 2.x unicode, 3.x str) are supported. Byte strings + (python 2.x str, 3.x bytes) are ignored. + - `prohibit_unassigned_code_points`: True / False. RFC 3454 + and RFCs for various SASL mechanisms distinguish between + `queries` (unassigned code points allowed) and + `stored strings` (unassigned code points prohibited). Defaults + to ``True`` (unassigned code points are prohibited). + + :Returns: + The SASLprep'ed version of `data`. + """ + if not isinstance(data, _text_type): + return data + + if prohibit_unassigned_code_points: + prohibited = _PROHIBITED + (stringprep.in_table_a1,) + else: + prohibited = _PROHIBITED + + # RFC3454 section 2, step 1 - Map + # RFC4013 section 2.1 mappings + # Map Non-ASCII space characters to SPACE (U+0020). Map + # commonly mapped to nothing characters to, well, nothing. + in_table_c12 = stringprep.in_table_c12 + in_table_b1 = stringprep.in_table_b1 + data = u"".join( + [u"\u0020" if in_table_c12(elt) else elt + for elt in data if not in_table_b1(elt)]) + + # RFC3454 section 2, step 2 - Normalize + # RFC4013 section 2.2 normalization + data = unicodedata.ucd_3_2_0.normalize('NFKC', data) + + in_table_d1 = stringprep.in_table_d1 + if in_table_d1(data[0]): + if not in_table_d1(data[-1]): + # RFC3454, Section 6, #3. If a string contains any + # RandALCat character, the first and last characters + # MUST be RandALCat characters. + raise ValueError("SASLprep: failed bidirectional check") + # RFC3454, Section 6, #2. If a string contains any RandALCat + # character, it MUST NOT contain any LCat character. + prohibited = prohibited + (stringprep.in_table_d2,) + else: + # RFC3454, Section 6, #3. Following the logic of #3, if + # the first character is not a RandALCat, no other character + # can be either. + prohibited = prohibited + (in_table_d1,) + + # RFC3454 section 2, step 3 and 4 - Prohibit and check bidi + for char in data: + if any(in_table(char) for in_table in prohibited): + raise ValueError( + "SASLprep: failed prohibited character check") + + return data diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/server.py b/mongo_mac/lib/python3.6/site-packages/pymongo/server.py new file mode 100644 index 0000000..8c71623 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/server.py @@ -0,0 +1,169 @@ +# Copyright 2014-present MongoDB, Inc. +# +# 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. + +"""Communicate with one MongoDB server in a topology.""" + +import contextlib + +from datetime import datetime + +from pymongo.message import _convert_exception +from pymongo.response import Response, ExhaustResponse +from pymongo.server_type import SERVER_TYPE + + +class Server(object): + def __init__(self, server_description, pool, monitor, topology_id=None, + listeners=None, events=None): + """Represent one MongoDB server.""" + self._description = server_description + self._pool = pool + self._monitor = monitor + self._topology_id = topology_id + self._publish = listeners is not None and listeners.enabled_for_server + self._listener = listeners + self._events = None + if self._publish: + self._events = events() + + def open(self): + """Start monitoring, or restart after a fork. + + Multiple calls have no effect. + """ + self._monitor.open() + + def reset(self): + """Clear the connection pool.""" + self.pool.reset() + + def close(self): + """Clear the connection pool and stop the monitor. + + Reconnect with open(). + """ + if self._publish: + self._events.put((self._listener.publish_server_closed, + (self._description.address, self._topology_id))) + self._monitor.close() + self._pool.reset() + + def request_check(self): + """Check the server's state soon.""" + self._monitor.request_check() + + def send_message_with_response( + self, + operation, + set_slave_okay, + all_credentials, + listeners, + exhaust=False): + """Send a message to MongoDB and return a Response object. + + Can raise ConnectionFailure. + + :Parameters: + - `operation`: A _Query or _GetMore object. + - `set_slave_okay`: Pass to operation.get_message. + - `all_credentials`: dict, maps auth source to MongoCredential. + - `listeners`: Instance of _EventListeners or None. + - `exhaust` (optional): If True, the socket used stays checked out. + It is returned along with its Pool in the Response. + """ + with self.get_socket(all_credentials, exhaust) as sock_info: + + duration = None + publish = listeners.enabled_for_commands + if publish: + start = datetime.now() + + use_find_cmd = operation.use_command(sock_info, exhaust) + message = operation.get_message( + set_slave_okay, sock_info, use_find_cmd) + request_id, data, max_doc_size = self._split_message(message) + + if publish: + encoding_duration = datetime.now() - start + cmd, dbn = operation.as_command(sock_info) + listeners.publish_command_start( + cmd, dbn, request_id, sock_info.address) + start = datetime.now() + + try: + sock_info.send_message(data, max_doc_size) + reply = sock_info.receive_message(request_id) + except Exception as exc: + if publish: + duration = (datetime.now() - start) + encoding_duration + failure = _convert_exception(exc) + listeners.publish_command_failure( + duration, failure, next(iter(cmd)), request_id, + sock_info.address) + raise + + if publish: + duration = (datetime.now() - start) + encoding_duration + + if exhaust: + return ExhaustResponse( + data=reply, + address=self._description.address, + socket_info=sock_info, + pool=self._pool, + duration=duration, + request_id=request_id, + from_command=use_find_cmd) + else: + return Response( + data=reply, + address=self._description.address, + duration=duration, + request_id=request_id, + from_command=use_find_cmd) + + def get_socket(self, all_credentials, checkout=False): + return self.pool.get_socket(all_credentials, checkout) + + @property + def description(self): + return self._description + + @description.setter + def description(self, server_description): + assert server_description.address == self._description.address + self._description = server_description + + @property + def pool(self): + return self._pool + + def _split_message(self, message): + """Return request_id, data, max_doc_size. + + :Parameters: + - `message`: (request_id, data, max_doc_size) or (request_id, data) + """ + if len(message) == 3: + return message + else: + # get_more and kill_cursors messages don't include BSON documents. + request_id, data = message + return request_id, data, 0 + + def __str__(self): + d = self._description + return '<Server "%s:%s" %s>' % ( + d.address[0], d.address[1], + SERVER_TYPE._fields[d.server_type]) diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/server_description.py b/mongo_mac/lib/python3.6/site-packages/pymongo/server_description.py new file mode 100644 index 0000000..b777855 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/server_description.py @@ -0,0 +1,202 @@ +# Copyright 2014-present MongoDB, Inc. +# +# 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. + +"""Represent one server the driver is connected to.""" + +from bson import EPOCH_NAIVE +from pymongo.server_type import SERVER_TYPE +from pymongo.ismaster import IsMaster +from pymongo.monotonic import time as _time + + +class ServerDescription(object): + """Immutable representation of one server. + + :Parameters: + - `address`: A (host, port) pair + - `ismaster`: Optional IsMaster instance + - `round_trip_time`: Optional float + - `error`: Optional, the last error attempting to connect to the server + """ + + __slots__ = ( + '_address', '_server_type', '_all_hosts', '_tags', '_replica_set_name', + '_primary', '_max_bson_size', '_max_message_size', + '_max_write_batch_size', '_min_wire_version', '_max_wire_version', + '_round_trip_time', '_me', '_is_writable', '_is_readable', + '_ls_timeout_minutes', '_error', '_set_version', '_election_id', + '_cluster_time', '_last_write_date', '_last_update_time') + + def __init__( + self, + address, + ismaster=None, + round_trip_time=None, + error=None): + self._address = address + if not ismaster: + ismaster = IsMaster({}) + + self._server_type = ismaster.server_type + self._all_hosts = ismaster.all_hosts + self._tags = ismaster.tags + self._replica_set_name = ismaster.replica_set_name + self._primary = ismaster.primary + self._max_bson_size = ismaster.max_bson_size + self._max_message_size = ismaster.max_message_size + self._max_write_batch_size = ismaster.max_write_batch_size + self._min_wire_version = ismaster.min_wire_version + self._max_wire_version = ismaster.max_wire_version + self._set_version = ismaster.set_version + self._election_id = ismaster.election_id + self._cluster_time = ismaster.cluster_time + self._is_writable = ismaster.is_writable + self._is_readable = ismaster.is_readable + self._ls_timeout_minutes = ismaster.logical_session_timeout_minutes + self._round_trip_time = round_trip_time + self._me = ismaster.me + self._last_update_time = _time() + self._error = error + + if ismaster.last_write_date: + # Convert from datetime to seconds. + delta = ismaster.last_write_date - EPOCH_NAIVE + self._last_write_date = delta.total_seconds() + else: + self._last_write_date = None + + @property + def address(self): + """The address (host, port) of this server.""" + return self._address + + @property + def server_type(self): + """The type of this server.""" + return self._server_type + + @property + def server_type_name(self): + """The server type as a human readable string. + + .. versionadded:: 3.4 + """ + return SERVER_TYPE._fields[self._server_type] + + @property + def all_hosts(self): + """List of hosts, passives, and arbiters known to this server.""" + return self._all_hosts + + @property + def tags(self): + return self._tags + + @property + def replica_set_name(self): + """Replica set name or None.""" + return self._replica_set_name + + @property + def primary(self): + """This server's opinion about who the primary is, or None.""" + return self._primary + + @property + def max_bson_size(self): + return self._max_bson_size + + @property + def max_message_size(self): + return self._max_message_size + + @property + def max_write_batch_size(self): + return self._max_write_batch_size + + @property + def min_wire_version(self): + return self._min_wire_version + + @property + def max_wire_version(self): + return self._max_wire_version + + @property + def set_version(self): + return self._set_version + + @property + def election_id(self): + return self._election_id + + @property + def cluster_time(self): + return self._cluster_time + + @property + def election_tuple(self): + return self._set_version, self._election_id + + @property + def me(self): + return self._me + + @property + def logical_session_timeout_minutes(self): + return self._ls_timeout_minutes + + @property + def last_write_date(self): + return self._last_write_date + + @property + def last_update_time(self): + return self._last_update_time + + @property + def round_trip_time(self): + """The current average latency or None.""" + # This override is for unittesting only! + if self._address in self._host_to_round_trip_time: + return self._host_to_round_trip_time[self._address] + + return self._round_trip_time + + @property + def error(self): + """The last error attempting to connect to the server, or None.""" + return self._error + + @property + def is_writable(self): + return self._is_writable + + @property + def is_readable(self): + return self._is_readable + + @property + def is_server_type_known(self): + return self.server_type != SERVER_TYPE.Unknown + + @property + def retryable_writes_supported(self): + """Checks if this server supports retryable writes.""" + return ( + self._ls_timeout_minutes is not None and + self._server_type in (SERVER_TYPE.Mongos, SERVER_TYPE.RSPrimary)) + + # For unittesting only. Use under no circumstances! + _host_to_round_trip_time = {} diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/server_selectors.py b/mongo_mac/lib/python3.6/site-packages/pymongo/server_selectors.py new file mode 100644 index 0000000..01f1306 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/server_selectors.py @@ -0,0 +1,156 @@ +# Copyright 2014-2016 MongoDB, Inc. +# +# 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. + +"""Criteria to select some ServerDescriptions from a TopologyDescription.""" + +from pymongo.server_type import SERVER_TYPE + + +class Selection(object): + """Input or output of a server selector function.""" + + @classmethod + def from_topology_description(cls, topology_description): + known_servers = topology_description.known_servers + primary = None + for sd in known_servers: + if sd.server_type == SERVER_TYPE.RSPrimary: + primary = sd + break + + return Selection(topology_description, + topology_description.known_servers, + topology_description.common_wire_version, + primary) + + def __init__(self, + topology_description, + server_descriptions, + common_wire_version, + primary): + self.topology_description = topology_description + self.server_descriptions = server_descriptions + self.primary = primary + self.common_wire_version = common_wire_version + + def with_server_descriptions(self, server_descriptions): + return Selection(self.topology_description, + server_descriptions, + self.common_wire_version, + self.primary) + + def secondary_with_max_last_write_date(self): + secondaries = secondary_server_selector(self) + if secondaries.server_descriptions: + return max(secondaries.server_descriptions, + key=lambda sd: sd.last_write_date) + + @property + def primary_selection(self): + primaries = [self.primary] if self.primary else [] + return self.with_server_descriptions(primaries) + + @property + def heartbeat_frequency(self): + return self.topology_description.heartbeat_frequency + + @property + def topology_type(self): + return self.topology_description.topology_type + + def __bool__(self): + return bool(self.server_descriptions) + + __nonzero__ = __bool__ # Python 2. + + def __getitem__(self, item): + return self.server_descriptions[item] + + +def any_server_selector(selection): + return selection + + +def readable_server_selector(selection): + return selection.with_server_descriptions( + [s for s in selection.server_descriptions if s.is_readable]) + + +def writable_server_selector(selection): + return selection.with_server_descriptions( + [s for s in selection.server_descriptions if s.is_writable]) + + +def secondary_server_selector(selection): + return selection.with_server_descriptions( + [s for s in selection.server_descriptions + if s.server_type == SERVER_TYPE.RSSecondary]) + + +def arbiter_server_selector(selection): + return selection.with_server_descriptions( + [s for s in selection.server_descriptions + if s.server_type == SERVER_TYPE.RSArbiter]) + + +def writable_preferred_server_selector(selection): + """Like PrimaryPreferred but doesn't use tags or latency.""" + return (writable_server_selector(selection) or + secondary_server_selector(selection)) + + +def apply_single_tag_set(tag_set, selection): + """All servers matching one tag set. + + A tag set is a dict. A server matches if its tags are a superset: + A server tagged {'a': '1', 'b': '2'} matches the tag set {'a': '1'}. + + The empty tag set {} matches any server. + """ + def tags_match(server_tags): + for key, value in tag_set.items(): + if key not in server_tags or server_tags[key] != value: + return False + + return True + + return selection.with_server_descriptions( + [s for s in selection.server_descriptions if tags_match(s.tags)]) + + +def apply_tag_sets(tag_sets, selection): + """All servers match a list of tag sets. + + tag_sets is a list of dicts. The empty tag set {} matches any server, + and may be provided at the end of the list as a fallback. So + [{'a': 'value'}, {}] expresses a preference for servers tagged + {'a': 'value'}, but accepts any server if none matches the first + preference. + """ + for tag_set in tag_sets: + with_tag_set = apply_single_tag_set(tag_set, selection) + if with_tag_set: + return with_tag_set + + return selection.with_server_descriptions([]) + + +def secondary_with_tags_server_selector(tag_sets, selection): + """All near-enough secondaries matching the tag sets.""" + return apply_tag_sets(tag_sets, secondary_server_selector(selection)) + + +def member_with_tags_server_selector(tag_sets, selection): + """All near-enough members matching the tag sets.""" + return apply_tag_sets(tag_sets, readable_server_selector(selection)) diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/server_type.py b/mongo_mac/lib/python3.6/site-packages/pymongo/server_type.py new file mode 100644 index 0000000..c231aa0 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/server_type.py @@ -0,0 +1,23 @@ +# Copyright 2014-2015 MongoDB, Inc. +# +# 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. + +"""Type codes for MongoDB servers.""" + +from collections import namedtuple + + +SERVER_TYPE = namedtuple('ServerType', + ['Unknown', 'Mongos', 'RSPrimary', 'RSSecondary', + 'RSArbiter', 'RSOther', 'RSGhost', + 'Standalone'])(*range(8)) diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/settings.py b/mongo_mac/lib/python3.6/site-packages/pymongo/settings.py new file mode 100644 index 0000000..a03bbc9 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/settings.py @@ -0,0 +1,123 @@ +# Copyright 2014-present MongoDB, Inc. +# +# 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. + +"""Represent MongoClient's configuration.""" + +import threading + +from bson.objectid import ObjectId +from pymongo import common, monitor, pool +from pymongo.common import LOCAL_THRESHOLD_MS, SERVER_SELECTION_TIMEOUT +from pymongo.errors import ConfigurationError +from pymongo.topology_description import TOPOLOGY_TYPE +from pymongo.pool import PoolOptions +from pymongo.server_description import ServerDescription + + +class TopologySettings(object): + def __init__(self, + seeds=None, + replica_set_name=None, + pool_class=None, + pool_options=None, + monitor_class=None, + condition_class=None, + local_threshold_ms=LOCAL_THRESHOLD_MS, + server_selection_timeout=SERVER_SELECTION_TIMEOUT, + heartbeat_frequency=common.HEARTBEAT_FREQUENCY, + server_selector=None): + """Represent MongoClient's configuration. + + Take a list of (host, port) pairs and optional replica set name. + """ + if heartbeat_frequency < common.MIN_HEARTBEAT_INTERVAL: + raise ConfigurationError( + "heartbeatFrequencyMS cannot be less than %d" % ( + common.MIN_HEARTBEAT_INTERVAL * 1000,)) + + self._seeds = seeds or [('localhost', 27017)] + self._replica_set_name = replica_set_name + self._pool_class = pool_class or pool.Pool + self._pool_options = pool_options or PoolOptions() + self._monitor_class = monitor_class or monitor.Monitor + self._condition_class = condition_class or threading.Condition + self._local_threshold_ms = local_threshold_ms + self._server_selection_timeout = server_selection_timeout + self._server_selector = server_selector + self._heartbeat_frequency = heartbeat_frequency + self._direct = (len(self._seeds) == 1 and not replica_set_name) + self._topology_id = ObjectId() + + @property + def seeds(self): + """List of server addresses.""" + return self._seeds + + @property + def replica_set_name(self): + return self._replica_set_name + + @property + def pool_class(self): + return self._pool_class + + @property + def pool_options(self): + return self._pool_options + + @property + def monitor_class(self): + return self._monitor_class + + @property + def condition_class(self): + return self._condition_class + + @property + def local_threshold_ms(self): + return self._local_threshold_ms + + @property + def server_selection_timeout(self): + return self._server_selection_timeout + + @property + def server_selector(self): + return self._server_selector + + @property + def heartbeat_frequency(self): + return self._heartbeat_frequency + + @property + def direct(self): + """Connect directly to a single server, or use a set of servers? + + True if there is one seed and no replica_set_name. + """ + return self._direct + + def get_topology_type(self): + if self.direct: + return TOPOLOGY_TYPE.Single + elif self.replica_set_name is not None: + return TOPOLOGY_TYPE.ReplicaSetNoPrimary + else: + return TOPOLOGY_TYPE.Unknown + + def get_server_descriptions(self): + """Initial dict of (address, ServerDescription) for all seeds.""" + return dict([ + (address, ServerDescription(address)) + for address in self.seeds]) diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/son_manipulator.py b/mongo_mac/lib/python3.6/site-packages/pymongo/son_manipulator.py new file mode 100644 index 0000000..f470d6f --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/son_manipulator.py @@ -0,0 +1,191 @@ +# Copyright 2009-present MongoDB, Inc. +# +# 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. + +"""**DEPRECATED**: Manipulators that can edit SON objects as they enter and exit +a database. + +The :class:`~pymongo.son_manipulator.SONManipulator` API has limitations as a +technique for transforming your data. Instead, it is more flexible and +straightforward to transform outgoing documents in your own code before passing +them to PyMongo, and transform incoming documents after receiving them from +PyMongo. SON Manipulators will be removed from PyMongo in 4.0. + +PyMongo does **not** apply SON manipulators to documents passed to +the modern methods :meth:`~pymongo.collection.Collection.bulk_write`, +:meth:`~pymongo.collection.Collection.insert_one`, +:meth:`~pymongo.collection.Collection.insert_many`, +:meth:`~pymongo.collection.Collection.update_one`, or +:meth:`~pymongo.collection.Collection.update_many`. SON manipulators are +**not** applied to documents returned by the modern methods +:meth:`~pymongo.collection.Collection.find_one_and_delete`, +:meth:`~pymongo.collection.Collection.find_one_and_replace`, and +:meth:`~pymongo.collection.Collection.find_one_and_update`. +""" + +from bson.dbref import DBRef +from bson.objectid import ObjectId +from bson.py3compat import abc +from bson.son import SON + + +class SONManipulator(object): + """A base son manipulator. + + This manipulator just saves and restores objects without changing them. + """ + + def will_copy(self): + """Will this SON manipulator make a copy of the incoming document? + + Derived classes that do need to make a copy should override this + method, returning True instead of False. All non-copying manipulators + will be applied first (so that the user's document will be updated + appropriately), followed by copying manipulators. + """ + return False + + def transform_incoming(self, son, collection): + """Manipulate an incoming SON object. + + :Parameters: + - `son`: the SON object to be inserted into the database + - `collection`: the collection the object is being inserted into + """ + if self.will_copy(): + return SON(son) + return son + + def transform_outgoing(self, son, collection): + """Manipulate an outgoing SON object. + + :Parameters: + - `son`: the SON object being retrieved from the database + - `collection`: the collection this object was stored in + """ + if self.will_copy(): + return SON(son) + return son + + +class ObjectIdInjector(SONManipulator): + """A son manipulator that adds the _id field if it is missing. + + .. versionchanged:: 2.7 + ObjectIdInjector is no longer used by PyMongo, but remains in this + module for backwards compatibility. + """ + + def transform_incoming(self, son, collection): + """Add an _id field if it is missing. + """ + if not "_id" in son: + son["_id"] = ObjectId() + return son + + +# This is now handled during BSON encoding (for performance reasons), +# but I'm keeping this here as a reference for those implementing new +# SONManipulators. +class ObjectIdShuffler(SONManipulator): + """A son manipulator that moves _id to the first position. + """ + + def will_copy(self): + """We need to copy to be sure that we are dealing with SON, not a dict. + """ + return True + + def transform_incoming(self, son, collection): + """Move _id to the front if it's there. + """ + if not "_id" in son: + return son + transformed = SON({"_id": son["_id"]}) + transformed.update(son) + return transformed + + +class NamespaceInjector(SONManipulator): + """A son manipulator that adds the _ns field. + """ + + def transform_incoming(self, son, collection): + """Add the _ns field to the incoming object + """ + son["_ns"] = collection.name + return son + + +class AutoReference(SONManipulator): + """Transparently reference and de-reference already saved embedded objects. + + This manipulator should probably only be used when the NamespaceInjector is + also being used, otherwise it doesn't make too much sense - documents can + only be auto-referenced if they have an *_ns* field. + + NOTE: this will behave poorly if you have a circular reference. + + TODO: this only works for documents that are in the same database. To fix + this we'll need to add a DatabaseInjector that adds *_db* and then make + use of the optional *database* support for DBRefs. + """ + + def __init__(self, db): + self.database = db + + def will_copy(self): + """We need to copy so the user's document doesn't get transformed refs. + """ + return True + + def transform_incoming(self, son, collection): + """Replace embedded documents with DBRefs. + """ + + def transform_value(value): + if isinstance(value, abc.MutableMapping): + if "_id" in value and "_ns" in value: + return DBRef(value["_ns"], transform_value(value["_id"])) + else: + return transform_dict(SON(value)) + elif isinstance(value, list): + return [transform_value(v) for v in value] + return value + + def transform_dict(object): + for (key, value) in object.items(): + object[key] = transform_value(value) + return object + + return transform_dict(SON(son)) + + def transform_outgoing(self, son, collection): + """Replace DBRefs with embedded documents. + """ + + def transform_value(value): + if isinstance(value, DBRef): + return self.database.dereference(value) + elif isinstance(value, list): + return [transform_value(v) for v in value] + elif isinstance(value, abc.MutableMapping): + return transform_dict(SON(value)) + return value + + def transform_dict(object): + for (key, value) in object.items(): + object[key] = transform_value(value) + return object + + return transform_dict(SON(son)) diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/ssl_context.py b/mongo_mac/lib/python3.6/site-packages/pymongo/ssl_context.py new file mode 100644 index 0000000..6afb2d2 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/ssl_context.py @@ -0,0 +1,96 @@ +# Copyright 2014-present MongoDB, Inc. +# +# 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. + +"""A fake SSLContext implementation.""" + +try: + import ssl +except ImportError: + pass + + +class SSLContext(object): + """A fake SSLContext. + + This implements an API similar to ssl.SSLContext from python 3.2 + but does not implement methods or properties that would be + incompatible with ssl.wrap_socket from python 2.7 < 2.7.9. + + You must pass protocol which must be one of the PROTOCOL_* constants + defined in the ssl module. ssl.PROTOCOL_SSLv23 is recommended for maximum + interoperability. + """ + + __slots__ = ('_cafile', '_certfile', + '_keyfile', '_protocol', '_verify_mode') + + def __init__(self, protocol): + self._cafile = None + self._certfile = None + self._keyfile = None + self._protocol = protocol + self._verify_mode = ssl.CERT_NONE + + @property + def protocol(self): + """The protocol version chosen when constructing the context. + This attribute is read-only. + """ + return self._protocol + + def __get_verify_mode(self): + """Whether to try to verify other peers' certificates and how to + behave if verification fails. This attribute must be one of + ssl.CERT_NONE, ssl.CERT_OPTIONAL or ssl.CERT_REQUIRED. + """ + return self._verify_mode + + def __set_verify_mode(self, value): + """Setter for verify_mode.""" + self._verify_mode = value + + verify_mode = property(__get_verify_mode, __set_verify_mode) + + def load_cert_chain(self, certfile, keyfile=None): + """Load a private key and the corresponding certificate. The certfile + string must be the path to a single file in PEM format containing the + certificate as well as any number of CA certificates needed to + establish the certificate's authenticity. The keyfile string, if + present, must point to a file containing the private key. Otherwise + the private key will be taken from certfile as well. + """ + self._certfile = certfile + self._keyfile = keyfile + + def load_verify_locations(self, cafile=None, dummy=None): + """Load a set of "certification authority"(CA) certificates used to + validate other peers' certificates when `~verify_mode` is other than + ssl.CERT_NONE. + """ + self._cafile = cafile + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, + suppress_ragged_eofs=True, dummy=None): + """Wrap an existing Python socket sock and return an ssl.SSLSocket + object. + """ + return ssl.wrap_socket(sock, keyfile=self._keyfile, + certfile=self._certfile, + server_side=server_side, + cert_reqs=self._verify_mode, + ssl_version=self._protocol, + ca_certs=self._cafile, + do_handshake_on_connect=do_handshake_on_connect, + suppress_ragged_eofs=suppress_ragged_eofs) diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/ssl_match_hostname.py b/mongo_mac/lib/python3.6/site-packages/pymongo/ssl_match_hostname.py new file mode 100644 index 0000000..49e3dd6 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/ssl_match_hostname.py @@ -0,0 +1,135 @@ +# Backport of the match_hostname logic from python 3.5, with small +# changes to support IP address matching on python 2.7 and 3.4. + +import re +import sys + +try: + # Python 3.4+, or the ipaddress module from pypi. + from ipaddress import ip_address +except ImportError: + ip_address = lambda address: None + +# ipaddress.ip_address requires unicode +if sys.version_info[0] < 3: + _unicode = unicode +else: + _unicode = lambda value: value + + +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(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 _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 + ip = ip_address(_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. + + 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: + host_ip = ip_address(_unicode(hostname)) + except (ValueError, UnicodeError): + # Not an IP address (common case) + host_ip = None + 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/mongo_mac/lib/python3.6/site-packages/pymongo/ssl_support.py b/mongo_mac/lib/python3.6/site-packages/pymongo/ssl_support.py new file mode 100644 index 0000000..181c8b1 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/ssl_support.py @@ -0,0 +1,191 @@ +# Copyright 2014-present MongoDB, Inc. +# +# 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. + +"""Support for SSL in PyMongo.""" + +import atexit +import sys +import threading + +HAVE_SSL = True +try: + import ssl +except ImportError: + HAVE_SSL = False + +HAVE_CERTIFI = False +try: + import certifi + HAVE_CERTIFI = True +except ImportError: + pass + +HAVE_WINCERTSTORE = False +try: + from wincertstore import CertFile + HAVE_WINCERTSTORE = True +except ImportError: + pass + +from bson.py3compat import string_type +from pymongo.errors import ConfigurationError + +_WINCERTSLOCK = threading.Lock() +_WINCERTS = None + +_PY37PLUS = sys.version_info[:2] >= (3, 7) + +if HAVE_SSL: + try: + # Python 2.7.9+, PyPy 2.5.1+, etc. + from ssl import SSLContext + except ImportError: + from pymongo.ssl_context import SSLContext + + def validate_cert_reqs(option, value): + """Validate the cert reqs are valid. It must be None or one of the + three values ``ssl.CERT_NONE``, ``ssl.CERT_OPTIONAL`` or + ``ssl.CERT_REQUIRED``. + """ + if value is None: + return value + elif isinstance(value, string_type) and hasattr(ssl, value): + value = getattr(ssl, value) + + if value in (ssl.CERT_NONE, ssl.CERT_OPTIONAL, ssl.CERT_REQUIRED): + return value + raise ValueError("The value of %s must be one of: " + "`ssl.CERT_NONE`, `ssl.CERT_OPTIONAL` or " + "`ssl.CERT_REQUIRED`" % (option,)) + + def _load_wincerts(): + """Set _WINCERTS to an instance of wincertstore.Certfile.""" + global _WINCERTS + + certfile = CertFile() + certfile.addstore("CA") + certfile.addstore("ROOT") + atexit.register(certfile.close) + + _WINCERTS = certfile + + # XXX: Possible future work. + # - OCSP? Not supported by python at all. + # http://bugs.python.org/issue17123 + # - Adding an ssl_context keyword argument to MongoClient? This might + # be useful for sites that have unusual requirements rather than + # trying to expose every SSLContext option through a keyword/uri + # parameter. + def get_ssl_context(*args): + """Create and return an SSLContext object.""" + (certfile, + keyfile, + passphrase, + ca_certs, + cert_reqs, + crlfile, + match_hostname) = args + verify_mode = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs + # Note PROTOCOL_SSLv23 is about the most misleading name imaginable. + # This configures the server and client to negotiate the + # highest protocol version they both support. A very good thing. + # PROTOCOL_TLS_CLIENT was added in CPython 3.6, deprecating + # PROTOCOL_SSLv23. + ctx = SSLContext( + getattr(ssl, "PROTOCOL_TLS_CLIENT", ssl.PROTOCOL_SSLv23)) + # SSLContext.check_hostname was added in CPython 2.7.9 and 3.4. + # PROTOCOL_TLS_CLIENT (added in Python 3.6) enables it by default. + if hasattr(ctx, "check_hostname"): + if _PY37PLUS and verify_mode != ssl.CERT_NONE: + # Python 3.7 uses OpenSSL's hostname matching implementation + # making it the obvious version to start using this with. + # Python 3.6 might have been a good version, but it suffers + # from https://bugs.python.org/issue32185. + # We'll use our bundled match_hostname for older Python + # versions, which also supports IP address matching + # with Python < 3.5. + ctx.check_hostname = match_hostname + else: + ctx.check_hostname = False + if hasattr(ctx, "options"): + # Explicitly disable SSLv2, SSLv3 and TLS compression. Note that + # up to date versions of MongoDB 2.4 and above already disable + # SSLv2 and SSLv3, python disables SSLv2 by default in >= 2.7.7 + # and >= 3.3.4 and SSLv3 in >= 3.4.3. There is no way for us to do + # any of this explicitly for python 2.7 before 2.7.9. + ctx.options |= getattr(ssl, "OP_NO_SSLv2", 0) + ctx.options |= getattr(ssl, "OP_NO_SSLv3", 0) + # OpenSSL >= 1.0.0 + ctx.options |= getattr(ssl, "OP_NO_COMPRESSION", 0) + # Python 3.7+ with OpenSSL >= 1.1.0h + ctx.options |= getattr(ssl, "OP_NO_RENEGOTIATION", 0) + if certfile is not None: + try: + if passphrase is not None: + vi = sys.version_info + # Since python just added a new parameter to an existing method + # this seems to be about the best we can do. + if (vi[0] == 2 and vi < (2, 7, 9) or + vi[0] == 3 and vi < (3, 3)): + raise ConfigurationError( + "Support for ssl_pem_passphrase requires " + "python 2.7.9+ (pypy 2.5.1+) or 3.3+") + ctx.load_cert_chain(certfile, keyfile, passphrase) + else: + ctx.load_cert_chain(certfile, keyfile) + except ssl.SSLError as exc: + raise ConfigurationError( + "Private key doesn't match certificate: %s" % (exc,)) + if crlfile is not None: + if not hasattr(ctx, "verify_flags"): + raise ConfigurationError( + "Support for ssl_crlfile requires " + "python 2.7.9+ (pypy 2.5.1+) or 3.4+") + # Match the server's behavior. + ctx.verify_flags = ssl.VERIFY_CRL_CHECK_LEAF + ctx.load_verify_locations(crlfile) + if ca_certs is not None: + ctx.load_verify_locations(ca_certs) + elif cert_reqs != ssl.CERT_NONE: + # CPython >= 2.7.9 or >= 3.4.0, pypy >= 2.5.1 + if hasattr(ctx, "load_default_certs"): + ctx.load_default_certs() + # Python >= 3.2.0, useless on Windows. + elif (sys.platform != "win32" and + hasattr(ctx, "set_default_verify_paths")): + ctx.set_default_verify_paths() + elif sys.platform == "win32" and HAVE_WINCERTSTORE: + with _WINCERTSLOCK: + if _WINCERTS is None: + _load_wincerts() + ctx.load_verify_locations(_WINCERTS.name) + elif HAVE_CERTIFI: + ctx.load_verify_locations(certifi.where()) + else: + raise ConfigurationError( + "`ssl_cert_reqs` is not ssl.CERT_NONE and no system " + "CA certificates could be loaded. `ssl_ca_certs` is " + "required.") + ctx.verify_mode = verify_mode + return ctx +else: + def validate_cert_reqs(option, dummy): + """No ssl module, raise ConfigurationError.""" + raise ConfigurationError("The value of %s is set but can't be " + "validated. The ssl module is not available" + % (option,)) + + def get_ssl_context(*dummy): + """No ssl module, raise ConfigurationError.""" + raise ConfigurationError("The ssl module is not available.") diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/thread_util.py b/mongo_mac/lib/python3.6/site-packages/pymongo/thread_util.py new file mode 100644 index 0000000..3869ec3 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/thread_util.py @@ -0,0 +1,131 @@ +# Copyright 2012-2015 MongoDB, Inc. +# +# 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. + +"""Utilities for multi-threading support.""" + +import threading +try: + from time import monotonic as _time +except ImportError: + from time import time as _time + +from pymongo.monotonic import time as _time +from pymongo.errors import ExceededMaxWaiters + + +### Begin backport from CPython 3.2 for timeout support for Semaphore.acquire +class Semaphore: + + # After Tim Peters' semaphore class, but not quite the same (no maximum) + + def __init__(self, value=1): + if value < 0: + raise ValueError("semaphore initial value must be >= 0") + self._cond = threading.Condition(threading.Lock()) + self._value = value + + def acquire(self, blocking=True, timeout=None): + if not blocking and timeout is not None: + raise ValueError("can't specify timeout for non-blocking acquire") + rc = False + endtime = None + self._cond.acquire() + while self._value == 0: + if not blocking: + break + if timeout is not None: + if endtime is None: + endtime = _time() + timeout + else: + timeout = endtime - _time() + if timeout <= 0: + break + self._cond.wait(timeout) + else: + self._value = self._value - 1 + rc = True + self._cond.release() + return rc + + __enter__ = acquire + + def release(self): + self._cond.acquire() + self._value = self._value + 1 + self._cond.notify() + self._cond.release() + + def __exit__(self, t, v, tb): + self.release() + + @property + def counter(self): + return self._value + + +class BoundedSemaphore(Semaphore): + """Semaphore that checks that # releases is <= # acquires""" + def __init__(self, value=1): + Semaphore.__init__(self, value) + self._initial_value = value + + def release(self): + if self._value >= self._initial_value: + raise ValueError("Semaphore released too many times") + return Semaphore.release(self) +### End backport from CPython 3.2 + + +class DummySemaphore(object): + def __init__(self, value=None): + pass + + def acquire(self, blocking=True, timeout=None): + return True + + def release(self): + pass + + +class MaxWaitersBoundedSemaphore(object): + def __init__(self, semaphore_class, value=1, max_waiters=1): + self.waiter_semaphore = semaphore_class(max_waiters) + self.semaphore = semaphore_class(value) + + def acquire(self, blocking=True, timeout=None): + if not self.waiter_semaphore.acquire(False): + raise ExceededMaxWaiters() + try: + return self.semaphore.acquire(blocking, timeout) + finally: + self.waiter_semaphore.release() + + def __getattr__(self, name): + return getattr(self.semaphore, name) + + +class MaxWaitersBoundedSemaphoreThread(MaxWaitersBoundedSemaphore): + def __init__(self, value=1, max_waiters=1): + MaxWaitersBoundedSemaphore.__init__( + self, BoundedSemaphore, value, max_waiters) + + +def create_semaphore(max_size, max_waiters): + if max_size is None: + return DummySemaphore() + else: + if max_waiters is None: + return BoundedSemaphore(max_size) + else: + return MaxWaitersBoundedSemaphoreThread(max_size, max_waiters) diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/topology.py b/mongo_mac/lib/python3.6/site-packages/pymongo/topology.py new file mode 100644 index 0000000..60f4fa7 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/topology.py @@ -0,0 +1,633 @@ +# Copyright 2014-present MongoDB, Inc. +# +# 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. + +"""Internal class to monitor a topology of one or more servers.""" + +import os +import random +import threading +import warnings +import weakref + +from bson.py3compat import itervalues, PY3 +if PY3: + import queue as Queue +else: + import Queue + +from pymongo import common +from pymongo import periodic_executor +from pymongo.pool import PoolOptions +from pymongo.topology_description import (updated_topology_description, + SERVER_TYPE, + TOPOLOGY_TYPE, + TopologyDescription) +from pymongo.errors import ServerSelectionTimeoutError, ConfigurationError +from pymongo.monotonic import time as _time +from pymongo.server import Server +from pymongo.server_selectors import (any_server_selector, + arbiter_server_selector, + secondary_server_selector, + readable_server_selector, + writable_server_selector, + Selection) +from pymongo.client_session import _ServerSessionPool + + +def process_events_queue(queue_ref): + q = queue_ref() + if not q: + return False # Cancel PeriodicExecutor. + + while True: + try: + event = q.get_nowait() + except Queue.Empty: + break + else: + fn, args = event + fn(*args) + + return True # Continue PeriodicExecutor. + + +class Topology(object): + """Monitor a topology of one or more servers.""" + def __init__(self, topology_settings): + self._topology_id = topology_settings._topology_id + self._listeners = topology_settings._pool_options.event_listeners + pub = self._listeners is not None + self._publish_server = pub and self._listeners.enabled_for_server + self._publish_tp = pub and self._listeners.enabled_for_topology + + # Create events queue if there are publishers. + self._events = None + self._events_thread = None + + if self._publish_server or self._publish_tp: + self._events = Queue.Queue(maxsize=100) + + if self._publish_tp: + self._events.put((self._listeners.publish_topology_opened, + (self._topology_id,))) + self._settings = topology_settings + topology_description = TopologyDescription( + topology_settings.get_topology_type(), + topology_settings.get_server_descriptions(), + topology_settings.replica_set_name, + None, + None, + topology_settings) + + self._description = topology_description + if self._publish_tp: + initial_td = TopologyDescription(TOPOLOGY_TYPE.Unknown, {}, None, + None, None, self._settings) + self._events.put(( + self._listeners.publish_topology_description_changed, + (initial_td, self._description, self._topology_id))) + + for seed in topology_settings.seeds: + if self._publish_server: + self._events.put((self._listeners.publish_server_opened, + (seed, self._topology_id))) + + # Store the seed list to help diagnose errors in _error_message(). + self._seed_addresses = list(topology_description.server_descriptions()) + self._opened = False + self._lock = threading.Lock() + self._condition = self._settings.condition_class(self._lock) + self._servers = {} + self._pid = None + self._max_cluster_time = None + self._session_pool = _ServerSessionPool() + + if self._publish_server or self._publish_tp: + def target(): + return process_events_queue(weak) + + executor = periodic_executor.PeriodicExecutor( + interval=common.EVENTS_QUEUE_FREQUENCY, + min_interval=0.5, + target=target, + name="pymongo_events_thread") + + # We strongly reference the executor and it weakly references + # the queue via this closure. When the topology is freed, stop + # the executor soon. + weak = weakref.ref(self._events) + self.__events_executor = executor + executor.open() + + def open(self): + """Start monitoring, or restart after a fork. + + No effect if called multiple times. + + .. warning:: Topology is shared among multiple threads and is protected + by mutual exclusion. Using Topology from a process other than the one + that initialized it will emit a warning and may result in deadlock. To + prevent this from happening, MongoClient must be created after any + forking. + + """ + if self._pid is None: + self._pid = os.getpid() + else: + if os.getpid() != self._pid: + warnings.warn( + "MongoClient opened before fork. Create MongoClient only " + "after forking. See PyMongo's documentation for details: " + "http://api.mongodb.org/python/current/faq.html#" + "is-pymongo-fork-safe") + + with self._lock: + self._ensure_opened() + + def select_servers(self, + selector, + server_selection_timeout=None, + address=None): + """Return a list of Servers matching selector, or time out. + + :Parameters: + - `selector`: function that takes a list of Servers and returns + a subset of them. + - `server_selection_timeout` (optional): maximum seconds to wait. + If not provided, the default value common.SERVER_SELECTION_TIMEOUT + is used. + - `address`: optional server address to select. + + Calls self.open() if needed. + + Raises exc:`ServerSelectionTimeoutError` after + `server_selection_timeout` if no matching servers are found. + """ + if server_selection_timeout is None: + server_timeout = self._settings.server_selection_timeout + else: + server_timeout = server_selection_timeout + + with self._lock: + server_descriptions = self._select_servers_loop( + selector, server_timeout, address) + + return [self.get_server_by_address(sd.address) + for sd in server_descriptions] + + def _select_servers_loop(self, selector, timeout, address): + """select_servers() guts. Hold the lock when calling this.""" + now = _time() + end_time = now + timeout + server_descriptions = self._description.apply_selector( + selector, address, custom_selector=self._settings.server_selector) + + while not server_descriptions: + # No suitable servers. + if timeout == 0 or now > end_time: + raise ServerSelectionTimeoutError( + self._error_message(selector)) + + self._ensure_opened() + self._request_check_all() + + # Release the lock and wait for the topology description to + # change, or for a timeout. We won't miss any changes that + # came after our most recent apply_selector call, since we've + # held the lock until now. + self._condition.wait(common.MIN_HEARTBEAT_INTERVAL) + self._description.check_compatible() + now = _time() + server_descriptions = self._description.apply_selector( + selector, address, + custom_selector=self._settings.server_selector) + + self._description.check_compatible() + return server_descriptions + + def select_server(self, + selector, + server_selection_timeout=None, + address=None): + """Like select_servers, but choose a random server if several match.""" + return random.choice(self.select_servers(selector, + server_selection_timeout, + address)) + + def select_server_by_address(self, address, + server_selection_timeout=None): + """Return a Server for "address", reconnecting if necessary. + + If the server's type is not known, request an immediate check of all + servers. Time out after "server_selection_timeout" if the server + cannot be reached. + + :Parameters: + - `address`: A (host, port) pair. + - `server_selection_timeout` (optional): maximum seconds to wait. + If not provided, the default value + common.SERVER_SELECTION_TIMEOUT is used. + + Calls self.open() if needed. + + Raises exc:`ServerSelectionTimeoutError` after + `server_selection_timeout` if no matching servers are found. + """ + return self.select_server(any_server_selector, + server_selection_timeout, + address) + + def _process_change(self, server_description): + """Process a new ServerDescription on an opened topology. + + Hold the lock when calling this. + """ + td_old = self._description + if self._publish_server: + old_server_description = td_old._server_descriptions[ + server_description.address] + self._events.put(( + self._listeners.publish_server_description_changed, + (old_server_description, server_description, + server_description.address, self._topology_id))) + + self._description = updated_topology_description( + self._description, server_description) + + self._update_servers() + self._receive_cluster_time_no_lock(server_description.cluster_time) + + if self._publish_tp: + self._events.put(( + self._listeners.publish_topology_description_changed, + (td_old, self._description, self._topology_id))) + + # Wake waiters in select_servers(). + self._condition.notify_all() + + def on_change(self, server_description): + """Process a new ServerDescription after an ismaster call completes.""" + # We do no I/O holding the lock. + with self._lock: + # Monitors may continue working on ismaster calls for some time + # after a call to Topology.close, so this method may be called at + # any time. Ensure the topology is open before processing the + # change. + # Any monitored server was definitely in the topology description + # once. Check if it's still in the description or if some state- + # change removed it. E.g., we got a host list from the primary + # that didn't include this server. + if (self._opened and + self._description.has_server(server_description.address)): + self._process_change(server_description) + + def get_server_by_address(self, address): + """Get a Server or None. + + Returns the current version of the server immediately, even if it's + Unknown or absent from the topology. Only use this in unittests. + In driver code, use select_server_by_address, since then you're + assured a recent view of the server's type and wire protocol version. + """ + return self._servers.get(address) + + def has_server(self, address): + return address in self._servers + + def get_primary(self): + """Return primary's address or None.""" + # Implemented here in Topology instead of MongoClient, so it can lock. + with self._lock: + topology_type = self._description.topology_type + if topology_type != TOPOLOGY_TYPE.ReplicaSetWithPrimary: + return None + + return writable_server_selector(self._new_selection())[0].address + + def _get_replica_set_members(self, selector): + """Return set of replica set member addresses.""" + # Implemented here in Topology instead of MongoClient, so it can lock. + with self._lock: + topology_type = self._description.topology_type + if topology_type not in (TOPOLOGY_TYPE.ReplicaSetWithPrimary, + TOPOLOGY_TYPE.ReplicaSetNoPrimary): + return set() + + return set([sd.address for sd in selector(self._new_selection())]) + + def get_secondaries(self): + """Return set of secondary addresses.""" + return self._get_replica_set_members(secondary_server_selector) + + def get_arbiters(self): + """Return set of arbiter addresses.""" + return self._get_replica_set_members(arbiter_server_selector) + + def max_cluster_time(self): + """Return a document, the highest seen $clusterTime.""" + return self._max_cluster_time + + def _receive_cluster_time_no_lock(self, cluster_time): + # Driver Sessions Spec: "Whenever a driver receives a cluster time from + # a server it MUST compare it to the current highest seen cluster time + # for the deployment. If the new cluster time is higher than the + # highest seen cluster time it MUST become the new highest seen cluster + # time. Two cluster times are compared using only the BsonTimestamp + # value of the clusterTime embedded field." + if cluster_time: + # ">" uses bson.timestamp.Timestamp's comparison operator. + if (not self._max_cluster_time + or cluster_time['clusterTime'] > + self._max_cluster_time['clusterTime']): + self._max_cluster_time = cluster_time + + def receive_cluster_time(self, cluster_time): + with self._lock: + self._receive_cluster_time_no_lock(cluster_time) + + def request_check_all(self, wait_time=5): + """Wake all monitors, wait for at least one to check its server.""" + with self._lock: + self._request_check_all() + self._condition.wait(wait_time) + + def reset_pool(self, address): + with self._lock: + server = self._servers.get(address) + if server: + server.pool.reset() + + def reset_server(self, address): + """Clear our pool for a server and mark it Unknown. + + Do *not* request an immediate check. + """ + with self._lock: + self._reset_server(address) + + def reset_server_and_request_check(self, address): + """Clear our pool for a server, mark it Unknown, and check it soon.""" + with self._lock: + self._reset_server(address) + self._request_check(address) + + def update_pool(self): + # Remove any stale sockets and add new sockets if pool is too small. + with self._lock: + for server in self._servers.values(): + server._pool.remove_stale_sockets() + + def close(self): + """Clear pools and terminate monitors. Topology reopens on demand.""" + with self._lock: + for server in self._servers.values(): + server.close() + + # Mark all servers Unknown. + self._description = self._description.reset() + self._update_servers() + self._opened = False + + # Publish only after releasing the lock. + if self._publish_tp: + self._events.put((self._listeners.publish_topology_closed, + (self._topology_id,))) + if self._publish_server or self._publish_tp: + self.__events_executor.close() + + @property + def description(self): + return self._description + + def pop_all_sessions(self): + """Pop all session ids from the pool.""" + with self._lock: + return self._session_pool.pop_all() + + def get_server_session(self): + """Start or resume a server session, or raise ConfigurationError.""" + with self._lock: + session_timeout = self._description.logical_session_timeout_minutes + if session_timeout is None: + # Maybe we need an initial scan? Can raise ServerSelectionError. + if self._description.topology_type == TOPOLOGY_TYPE.Single: + if not self._description.has_known_servers: + self._select_servers_loop( + any_server_selector, + self._settings.server_selection_timeout, + None) + elif not self._description.readable_servers: + self._select_servers_loop( + readable_server_selector, + self._settings.server_selection_timeout, + None) + + session_timeout = self._description.logical_session_timeout_minutes + if session_timeout is None: + raise ConfigurationError( + "Sessions are not supported by this MongoDB deployment") + + return self._session_pool.get_server_session(session_timeout) + + def return_server_session(self, server_session, lock): + if lock: + with self._lock: + session_timeout = \ + self._description.logical_session_timeout_minutes + if session_timeout is not None: + self._session_pool.return_server_session(server_session, + session_timeout) + else: + # Called from a __del__ method, can't use a lock. + self._session_pool.return_server_session_no_lock(server_session) + + def is_mongos_non_blocking(self): + """Return if we are connected to a Mongos without blocking. + + If the state is unknown, return False. + """ + with self._lock: + if not self._opened: + return False + if self._description.topology_type == TOPOLOGY_TYPE.Sharded: + return True + server_descriptions = self._description.apply_selector( + writable_server_selector, None) + if not server_descriptions: + return False + return server_descriptions[0].server_type == SERVER_TYPE.Mongos + + def _new_selection(self): + """A Selection object, initially including all known servers. + + Hold the lock when calling this. + """ + return Selection.from_topology_description(self._description) + + def _ensure_opened(self): + """Start monitors, or restart after a fork. + + Hold the lock when calling this. + """ + if not self._opened: + self._opened = True + self._update_servers() + + # Start or restart the events publishing thread. + if self._publish_tp or self._publish_server: + self.__events_executor.open() + + # Ensure that the monitors are open. + for server in itervalues(self._servers): + server.open() + + def _reset_server(self, address): + """Clear our pool for a server and mark it Unknown. + + Hold the lock when calling this. Does *not* request an immediate check. + """ + server = self._servers.get(address) + + # "server" is None if another thread removed it from the topology. + if server: + server.reset() + + # Mark this server Unknown. + self._description = self._description.reset_server(address) + self._update_servers() + + def _request_check(self, address): + """Wake one monitor. Hold the lock when calling this.""" + server = self._servers.get(address) + + # "server" is None if another thread removed it from the topology. + if server: + server.request_check() + + def _request_check_all(self): + """Wake all monitors. Hold the lock when calling this.""" + for server in self._servers.values(): + server.request_check() + + def _update_servers(self): + """Sync our Servers from TopologyDescription.server_descriptions. + + Hold the lock while calling this. + """ + for address, sd in self._description.server_descriptions().items(): + if address not in self._servers: + monitor = self._settings.monitor_class( + server_description=sd, + topology=self, + pool=self._create_pool_for_monitor(address), + topology_settings=self._settings) + + weak = None + if self._publish_server: + weak = weakref.ref(self._events) + server = Server( + server_description=sd, + pool=self._create_pool_for_server(address), + monitor=monitor, + topology_id=self._topology_id, + listeners=self._listeners, + events=weak) + + self._servers[address] = server + server.open() + else: + self._servers[address].description = sd + + for address, server in list(self._servers.items()): + if not self._description.has_server(address): + server.close() + self._servers.pop(address) + + def _create_pool_for_server(self, address): + return self._settings.pool_class(address, self._settings.pool_options) + + def _create_pool_for_monitor(self, address): + options = self._settings.pool_options + + # According to the Server Discovery And Monitoring Spec, monitors use + # connect_timeout for both connect_timeout and socket_timeout. The + # pool only has one socket so maxPoolSize and so on aren't needed. + monitor_pool_options = PoolOptions( + connect_timeout=options.connect_timeout, + socket_timeout=options.connect_timeout, + ssl_context=options.ssl_context, + ssl_match_hostname=options.ssl_match_hostname, + event_listeners=options.event_listeners, + appname=options.appname, + driver=options.driver) + + return self._settings.pool_class(address, monitor_pool_options, + handshake=False) + + def _error_message(self, selector): + """Format an error message if server selection fails. + + Hold the lock when calling this. + """ + is_replica_set = self._description.topology_type in ( + TOPOLOGY_TYPE.ReplicaSetWithPrimary, + TOPOLOGY_TYPE.ReplicaSetNoPrimary) + + if is_replica_set: + server_plural = 'replica set members' + elif self._description.topology_type == TOPOLOGY_TYPE.Sharded: + server_plural = 'mongoses' + else: + server_plural = 'servers' + + if self._description.known_servers: + # We've connected, but no servers match the selector. + if selector is writable_server_selector: + if is_replica_set: + return 'No primary available for writes' + else: + return 'No %s available for writes' % server_plural + else: + return 'No %s match selector "%s"' % (server_plural, selector) + else: + addresses = list(self._description.server_descriptions()) + servers = list(self._description.server_descriptions().values()) + if not servers: + if is_replica_set: + # We removed all servers because of the wrong setName? + return 'No %s available for replica set name "%s"' % ( + server_plural, self._settings.replica_set_name) + else: + return 'No %s available' % server_plural + + # 1 or more servers, all Unknown. Are they unknown for one reason? + error = servers[0].error + same = all(server.error == error for server in servers[1:]) + if same: + if error is None: + # We're still discovering. + return 'No %s found yet' % server_plural + + if (is_replica_set and not + set(addresses).intersection(self._seed_addresses)): + # We replaced our seeds with new hosts but can't reach any. + return ( + 'Could not reach any servers in %s. Replica set is' + ' configured with internal hostnames or IPs?' % + addresses) + + return str(error) + else: + return ','.join(str(server.error) for server in servers + if server.error) diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/topology_description.py b/mongo_mac/lib/python3.6/site-packages/pymongo/topology_description.py new file mode 100644 index 0000000..eca7615 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/topology_description.py @@ -0,0 +1,545 @@ +# Copyright 2014-present MongoDB, Inc. +# +# 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. + +"""Represent a deployment of MongoDB servers.""" + +from collections import namedtuple + +from pymongo import common +from pymongo.errors import ConfigurationError +from pymongo.read_preferences import ReadPreference +from pymongo.server_description import ServerDescription +from pymongo.server_selectors import Selection +from pymongo.server_type import SERVER_TYPE + + +TOPOLOGY_TYPE = namedtuple('TopologyType', ['Single', 'ReplicaSetNoPrimary', + 'ReplicaSetWithPrimary', 'Sharded', + 'Unknown'])(*range(5)) + + +class TopologyDescription(object): + def __init__(self, + topology_type, + server_descriptions, + replica_set_name, + max_set_version, + max_election_id, + topology_settings): + """Representation of a deployment of MongoDB servers. + + :Parameters: + - `topology_type`: initial type + - `server_descriptions`: dict of (address, ServerDescription) for + all seeds + - `replica_set_name`: replica set name or None + - `max_set_version`: greatest setVersion seen from a primary, or None + - `max_election_id`: greatest electionId seen from a primary, or None + - `topology_settings`: a TopologySettings + """ + self._topology_type = topology_type + self._replica_set_name = replica_set_name + self._server_descriptions = server_descriptions + self._max_set_version = max_set_version + self._max_election_id = max_election_id + + # The heartbeat_frequency is used in staleness estimates. + self._topology_settings = topology_settings + + # Is PyMongo compatible with all servers' wire protocols? + self._incompatible_err = None + + for s in self._server_descriptions.values(): + if not s.is_server_type_known: + continue + + # s.min/max_wire_version is the server's wire protocol. + # MIN/MAX_SUPPORTED_WIRE_VERSION is what PyMongo supports. + server_too_new = ( + # Server too new. + s.min_wire_version is not None + and s.min_wire_version > common.MAX_SUPPORTED_WIRE_VERSION) + + server_too_old = ( + # Server too old. + s.max_wire_version is not None + and s.max_wire_version < common.MIN_SUPPORTED_WIRE_VERSION) + + if server_too_new: + self._incompatible_err = ( + "Server at %s:%d requires wire version %d, but this " + "version of PyMongo only supports up to %d." + % (s.address[0], s.address[1], + s.min_wire_version, common.MAX_SUPPORTED_WIRE_VERSION)) + + elif server_too_old: + self._incompatible_err = ( + "Server at %s:%d reports wire version %d, but this " + "version of PyMongo requires at least %d (MongoDB %s)." + % (s.address[0], s.address[1], + s.max_wire_version, + common.MIN_SUPPORTED_WIRE_VERSION, + common.MIN_SUPPORTED_SERVER_VERSION)) + + break + + # Server Discovery And Monitoring Spec: Whenever a client updates the + # TopologyDescription from an ismaster response, it MUST set + # TopologyDescription.logicalSessionTimeoutMinutes to the smallest + # logicalSessionTimeoutMinutes value among ServerDescriptions of all + # data-bearing server types. If any have a null + # logicalSessionTimeoutMinutes, then + # TopologyDescription.logicalSessionTimeoutMinutes MUST be set to null. + readable_servers = self.readable_servers + if not readable_servers: + self._ls_timeout_minutes = None + elif any(s.logical_session_timeout_minutes is None + for s in readable_servers): + self._ls_timeout_minutes = None + else: + self._ls_timeout_minutes = min(s.logical_session_timeout_minutes + for s in readable_servers) + + def check_compatible(self): + """Raise ConfigurationError if any server is incompatible. + + A server is incompatible if its wire protocol version range does not + overlap with PyMongo's. + """ + if self._incompatible_err: + raise ConfigurationError(self._incompatible_err) + + def has_server(self, address): + return address in self._server_descriptions + + def reset_server(self, address): + """A copy of this description, with one server marked Unknown.""" + return updated_topology_description(self, ServerDescription(address)) + + def reset(self): + """A copy of this description, with all servers marked Unknown.""" + if self._topology_type == TOPOLOGY_TYPE.ReplicaSetWithPrimary: + topology_type = TOPOLOGY_TYPE.ReplicaSetNoPrimary + else: + topology_type = self._topology_type + + # The default ServerDescription's type is Unknown. + sds = dict((address, ServerDescription(address)) + for address in self._server_descriptions) + + return TopologyDescription( + topology_type, + sds, + self._replica_set_name, + self._max_set_version, + self._max_election_id, + self._topology_settings) + + def server_descriptions(self): + """Dict of (address, + :class:`~pymongo.server_description.ServerDescription`).""" + return self._server_descriptions.copy() + + @property + def topology_type(self): + """The type of this topology.""" + return self._topology_type + + @property + def topology_type_name(self): + """The topology type as a human readable string. + + .. versionadded:: 3.4 + """ + return TOPOLOGY_TYPE._fields[self._topology_type] + + @property + def replica_set_name(self): + """The replica set name.""" + return self._replica_set_name + + @property + def max_set_version(self): + """Greatest setVersion seen from a primary, or None.""" + return self._max_set_version + + @property + def max_election_id(self): + """Greatest electionId seen from a primary, or None.""" + return self._max_election_id + + @property + def logical_session_timeout_minutes(self): + """Minimum logical session timeout, or None.""" + return self._ls_timeout_minutes + + @property + def known_servers(self): + """List of Servers of types besides Unknown.""" + return [s for s in self._server_descriptions.values() + if s.is_server_type_known] + + @property + def has_known_servers(self): + """Whether there are any Servers of types besides Unknown.""" + return any(s for s in self._server_descriptions.values() + if s.is_server_type_known) + + @property + def readable_servers(self): + """List of readable Servers.""" + return [s for s in self._server_descriptions.values() if s.is_readable] + + @property + def common_wire_version(self): + """Minimum of all servers' max wire versions, or None.""" + servers = self.known_servers + if servers: + return min(s.max_wire_version for s in self.known_servers) + + return None + + @property + def heartbeat_frequency(self): + return self._topology_settings.heartbeat_frequency + + def apply_selector(self, selector, address, custom_selector=None): + + def apply_local_threshold(selection): + if not selection: + return [] + + settings = self._topology_settings + + # Round trip time in seconds. + fastest = min( + s.round_trip_time for s in selection.server_descriptions) + threshold = settings.local_threshold_ms / 1000.0 + return [s for s in selection.server_descriptions + if (s.round_trip_time - fastest) <= threshold] + + if getattr(selector, 'min_wire_version', 0): + common_wv = self.common_wire_version + if common_wv and common_wv < selector.min_wire_version: + raise ConfigurationError( + "%s requires min wire version %d, but topology's min" + " wire version is %d" % (selector, + selector.min_wire_version, + common_wv)) + + if self.topology_type == TOPOLOGY_TYPE.Single: + # Ignore selectors for standalone. + return self.known_servers + elif address: + # Ignore selectors when explicit address is requested. + description = self.server_descriptions().get(address) + return [description] if description else [] + elif self.topology_type == TOPOLOGY_TYPE.Sharded: + # Ignore read preference. + selection = Selection.from_topology_description(self) + else: + selection = selector(Selection.from_topology_description(self)) + + # Apply custom selector followed by localThresholdMS. + if custom_selector is not None and selection: + selection = selection.with_server_descriptions( + custom_selector(selection.server_descriptions)) + return apply_local_threshold(selection) + + def has_readable_server(self, read_preference=ReadPreference.PRIMARY): + """Does this topology have any readable servers available matching the + given read preference? + + :Parameters: + - `read_preference`: an instance of a read preference from + :mod:`~pymongo.read_preferences`. Defaults to + :attr:`~pymongo.read_preferences.ReadPreference.PRIMARY`. + + .. note:: When connected directly to a single server this method + always returns ``True``. + + .. versionadded:: 3.4 + """ + common.validate_read_preference("read_preference", read_preference) + return any(self.apply_selector(read_preference, None)) + + def has_writable_server(self): + """Does this topology have a writable server available? + + .. note:: When connected directly to a single server this method + always returns ``True``. + + .. versionadded:: 3.4 + """ + return self.has_readable_server(ReadPreference.PRIMARY) + + +# If topology type is Unknown and we receive an ismaster response, what should +# the new topology type be? +_SERVER_TYPE_TO_TOPOLOGY_TYPE = { + SERVER_TYPE.Mongos: TOPOLOGY_TYPE.Sharded, + SERVER_TYPE.RSPrimary: TOPOLOGY_TYPE.ReplicaSetWithPrimary, + SERVER_TYPE.RSSecondary: TOPOLOGY_TYPE.ReplicaSetNoPrimary, + SERVER_TYPE.RSArbiter: TOPOLOGY_TYPE.ReplicaSetNoPrimary, + SERVER_TYPE.RSOther: TOPOLOGY_TYPE.ReplicaSetNoPrimary, +} + + +def updated_topology_description(topology_description, server_description): + """Return an updated copy of a TopologyDescription. + + :Parameters: + - `topology_description`: the current TopologyDescription + - `server_description`: a new ServerDescription that resulted from + an ismaster call + + Called after attempting (successfully or not) to call ismaster on the + server at server_description.address. Does not modify topology_description. + """ + address = server_description.address + + # These values will be updated, if necessary, to form the new + # TopologyDescription. + topology_type = topology_description.topology_type + set_name = topology_description.replica_set_name + max_set_version = topology_description.max_set_version + max_election_id = topology_description.max_election_id + server_type = server_description.server_type + + # Don't mutate the original dict of server descriptions; copy it. + sds = topology_description.server_descriptions() + + # Replace this server's description with the new one. + sds[address] = server_description + + if topology_type == TOPOLOGY_TYPE.Single: + # Single type never changes. + return TopologyDescription( + TOPOLOGY_TYPE.Single, + sds, + set_name, + max_set_version, + max_election_id, + topology_description._topology_settings) + + if topology_type == TOPOLOGY_TYPE.Unknown: + if server_type == SERVER_TYPE.Standalone: + sds.pop(address) + + elif server_type not in (SERVER_TYPE.Unknown, SERVER_TYPE.RSGhost): + topology_type = _SERVER_TYPE_TO_TOPOLOGY_TYPE[server_type] + + if topology_type == TOPOLOGY_TYPE.Sharded: + if server_type not in (SERVER_TYPE.Mongos, SERVER_TYPE.Unknown): + sds.pop(address) + + elif topology_type == TOPOLOGY_TYPE.ReplicaSetNoPrimary: + if server_type in (SERVER_TYPE.Standalone, SERVER_TYPE.Mongos): + sds.pop(address) + + elif server_type == SERVER_TYPE.RSPrimary: + (topology_type, + set_name, + max_set_version, + max_election_id) = _update_rs_from_primary(sds, + set_name, + server_description, + max_set_version, + max_election_id) + + elif server_type in ( + SERVER_TYPE.RSSecondary, + SERVER_TYPE.RSArbiter, + SERVER_TYPE.RSOther): + topology_type, set_name = _update_rs_no_primary_from_member( + sds, set_name, server_description) + + elif topology_type == TOPOLOGY_TYPE.ReplicaSetWithPrimary: + if server_type in (SERVER_TYPE.Standalone, SERVER_TYPE.Mongos): + sds.pop(address) + topology_type = _check_has_primary(sds) + + elif server_type == SERVER_TYPE.RSPrimary: + (topology_type, + set_name, + max_set_version, + max_election_id) = _update_rs_from_primary(sds, + set_name, + server_description, + max_set_version, + max_election_id) + + elif server_type in ( + SERVER_TYPE.RSSecondary, + SERVER_TYPE.RSArbiter, + SERVER_TYPE.RSOther): + topology_type = _update_rs_with_primary_from_member( + sds, set_name, server_description) + + else: + # Server type is Unknown or RSGhost: did we just lose the primary? + topology_type = _check_has_primary(sds) + + # Return updated copy. + return TopologyDescription(topology_type, + sds, + set_name, + max_set_version, + max_election_id, + topology_description._topology_settings) + + +def _update_rs_from_primary( + sds, + replica_set_name, + server_description, + max_set_version, + max_election_id): + """Update topology description from a primary's ismaster response. + + Pass in a dict of ServerDescriptions, current replica set name, the + ServerDescription we are processing, and the TopologyDescription's + max_set_version and max_election_id if any. + + Returns (new topology type, new replica_set_name, new max_set_version, + new max_election_id). + """ + if replica_set_name is None: + replica_set_name = server_description.replica_set_name + + elif replica_set_name != server_description.replica_set_name: + # We found a primary but it doesn't have the replica_set_name + # provided by the user. + sds.pop(server_description.address) + return (_check_has_primary(sds), + replica_set_name, + max_set_version, + max_election_id) + + max_election_tuple = max_set_version, max_election_id + if None not in server_description.election_tuple: + if (None not in max_election_tuple and + max_election_tuple > server_description.election_tuple): + + # Stale primary, set to type Unknown. + address = server_description.address + sds[address] = ServerDescription(address) + return (_check_has_primary(sds), + replica_set_name, + max_set_version, + max_election_id) + + max_election_id = server_description.election_id + + if (server_description.set_version is not None and + (max_set_version is None or + server_description.set_version > max_set_version)): + + max_set_version = server_description.set_version + + # We've heard from the primary. Is it the same primary as before? + for server in sds.values(): + if (server.server_type is SERVER_TYPE.RSPrimary + and server.address != server_description.address): + + # Reset old primary's type to Unknown. + sds[server.address] = ServerDescription(server.address) + + # There can be only one prior primary. + break + + # Discover new hosts from this primary's response. + for new_address in server_description.all_hosts: + if new_address not in sds: + sds[new_address] = ServerDescription(new_address) + + # Remove hosts not in the response. + for addr in set(sds) - server_description.all_hosts: + sds.pop(addr) + + # If the host list differs from the seed list, we may not have a primary + # after all. + return (_check_has_primary(sds), + replica_set_name, + max_set_version, + max_election_id) + + +def _update_rs_with_primary_from_member( + sds, + replica_set_name, + server_description): + """RS with known primary. Process a response from a non-primary. + + Pass in a dict of ServerDescriptions, current replica set name, and the + ServerDescription we are processing. + + Returns new topology type. + """ + assert replica_set_name is not None + + if replica_set_name != server_description.replica_set_name: + sds.pop(server_description.address) + elif (server_description.me and + server_description.address != server_description.me): + sds.pop(server_description.address) + + # Had this member been the primary? + return _check_has_primary(sds) + + +def _update_rs_no_primary_from_member( + sds, + replica_set_name, + server_description): + """RS without known primary. Update from a non-primary's response. + + Pass in a dict of ServerDescriptions, current replica set name, and the + ServerDescription we are processing. + + Returns (new topology type, new replica_set_name). + """ + topology_type = TOPOLOGY_TYPE.ReplicaSetNoPrimary + if replica_set_name is None: + replica_set_name = server_description.replica_set_name + + elif replica_set_name != server_description.replica_set_name: + sds.pop(server_description.address) + return topology_type, replica_set_name + + # This isn't the primary's response, so don't remove any servers + # it doesn't report. Only add new servers. + for address in server_description.all_hosts: + if address not in sds: + sds[address] = ServerDescription(address) + + if (server_description.me and + server_description.address != server_description.me): + sds.pop(server_description.address) + + return topology_type, replica_set_name + + +def _check_has_primary(sds): + """Current topology type is ReplicaSetWithPrimary. Is primary still known? + + Pass in a dict of ServerDescriptions. + + Returns new topology type. + """ + for s in sds.values(): + if s.server_type == SERVER_TYPE.RSPrimary: + return TOPOLOGY_TYPE.ReplicaSetWithPrimary + else: + return TOPOLOGY_TYPE.ReplicaSetNoPrimary diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/uri_parser.py b/mongo_mac/lib/python3.6/site-packages/pymongo/uri_parser.py new file mode 100644 index 0000000..8ee5fbb --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/uri_parser.py @@ -0,0 +1,429 @@ +# Copyright 2011-present MongoDB, Inc. +# +# 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. + + +"""Tools to parse and validate a MongoDB URI.""" +import re +import warnings + +try: + from dns import resolver + _HAVE_DNSPYTHON = True +except ImportError: + _HAVE_DNSPYTHON = False + +from bson.py3compat import PY3, string_type + +if PY3: + from urllib.parse import unquote_plus +else: + from urllib import unquote_plus + +from pymongo.common import get_validated_options +from pymongo.errors import ConfigurationError, InvalidURI + + +SCHEME = 'mongodb://' +SCHEME_LEN = len(SCHEME) +SRV_SCHEME = 'mongodb+srv://' +SRV_SCHEME_LEN = len(SRV_SCHEME) +DEFAULT_PORT = 27017 + + +def parse_userinfo(userinfo): + """Validates the format of user information in a MongoDB URI. + Reserved characters like ':', '/', '+' and '@' must be escaped + following RFC 3986. + + Returns a 2-tuple containing the unescaped username followed + by the unescaped password. + + :Paramaters: + - `userinfo`: A string of the form <username>:<password> + + .. versionchanged:: 2.2 + Now uses `urllib.unquote_plus` so `+` characters must be escaped. + """ + if '@' in userinfo or userinfo.count(':') > 1: + if PY3: + quote_fn = "urllib.parse.quote_plus" + else: + quote_fn = "urllib.quote_plus" + raise InvalidURI("Username and password must be escaped according to " + "RFC 3986, use %s()." % quote_fn) + user, _, passwd = userinfo.partition(":") + # No password is expected with GSSAPI authentication. + if not user: + raise InvalidURI("The empty string is not valid username.") + return unquote_plus(user), unquote_plus(passwd) + + +def parse_ipv6_literal_host(entity, default_port): + """Validates an IPv6 literal host:port string. + + Returns a 2-tuple of IPv6 literal followed by port where + port is default_port if it wasn't specified in entity. + + :Parameters: + - `entity`: A string that represents an IPv6 literal enclosed + in braces (e.g. '[::1]' or '[::1]:27017'). + - `default_port`: The port number to use when one wasn't + specified in entity. + """ + if entity.find(']') == -1: + raise ValueError("an IPv6 address literal must be " + "enclosed in '[' and ']' according " + "to RFC 2732.") + i = entity.find(']:') + if i == -1: + return entity[1:-1], default_port + return entity[1: i], entity[i + 2:] + + +def parse_host(entity, default_port=DEFAULT_PORT): + """Validates a host string + + Returns a 2-tuple of host followed by port where port is default_port + if it wasn't specified in the string. + + :Parameters: + - `entity`: A host or host:port string where host could be a + hostname or IP address. + - `default_port`: The port number to use when one wasn't + specified in entity. + """ + host = entity + port = default_port + if entity[0] == '[': + host, port = parse_ipv6_literal_host(entity, default_port) + elif entity.endswith(".sock"): + return entity, default_port + elif entity.find(':') != -1: + if entity.count(':') > 1: + raise ValueError("Reserved characters such as ':' must be " + "escaped according RFC 2396. An IPv6 " + "address literal must be enclosed in '[' " + "and ']' according to RFC 2732.") + host, port = host.split(':', 1) + if isinstance(port, string_type): + if not port.isdigit() or int(port) > 65535 or int(port) <= 0: + raise ValueError("Port must be an integer between 0 and 65535: %s" + % (port,)) + port = int(port) + + # Normalize hostname to lowercase, since DNS is case-insensitive: + # http://tools.ietf.org/html/rfc4343 + # This prevents useless rediscovery if "foo.com" is in the seed list but + # "FOO.com" is in the ismaster response. + return host.lower(), port + + +def validate_options(opts, warn=False): + """Validates and normalizes options passed in a MongoDB URI. + + Returns a new dictionary of validated and normalized options. If warn is + False then errors will be thrown for invalid options, otherwise they will + be ignored and a warning will be issued. + + :Parameters: + - `opts`: A dict of MongoDB URI options. + - `warn` (optional): If ``True`` then warnigns will be logged and + invalid options will be ignored. Otherwise invalid options will + cause errors. + """ + return get_validated_options(opts, warn) + + +def _parse_options(opts, delim): + """Helper method for split_options which creates the options dict. + Also handles the creation of a list for the URI tag_sets/ + readpreferencetags portion.""" + options = {} + for opt in opts.split(delim): + key, val = opt.split("=") + if key.lower() == 'readpreferencetags': + options.setdefault('readpreferencetags', []).append(val) + else: + # str(option) to ensure that a unicode URI results in plain 'str' + # option names. 'normalized' is then suitable to be passed as + # kwargs in all Python versions. + if str(key) in options: + warnings.warn("Duplicate URI option %s" % (str(key),)) + options[str(key)] = unquote_plus(val) + + # Special case for deprecated options + if "wtimeout" in options: + if "wtimeoutMS" in options: + options.pop("wtimeout") + warnings.warn("Option wtimeout is deprecated, use 'wtimeoutMS'" + " instead") + + return options + + +def split_options(opts, validate=True, warn=False): + """Takes the options portion of a MongoDB URI, validates each option + and returns the options in a dictionary. + + :Parameters: + - `opt`: A string representing MongoDB URI options. + - `validate`: If ``True`` (the default), validate and normalize all + options. + """ + and_idx = opts.find("&") + semi_idx = opts.find(";") + try: + if and_idx >= 0 and semi_idx >= 0: + raise InvalidURI("Can not mix '&' and ';' for option separators.") + elif and_idx >= 0: + options = _parse_options(opts, "&") + elif semi_idx >= 0: + options = _parse_options(opts, ";") + elif opts.find("=") != -1: + options = _parse_options(opts, None) + else: + raise ValueError + except ValueError: + raise InvalidURI("MongoDB URI options are key=value pairs.") + + if validate: + return validate_options(options, warn) + return options + + +def split_hosts(hosts, default_port=DEFAULT_PORT): + """Takes a string of the form host1[:port],host2[:port]... and + splits it into (host, port) tuples. If [:port] isn't present the + default_port is used. + + Returns a set of 2-tuples containing the host name (or IP) followed by + port number. + + :Parameters: + - `hosts`: A string of the form host1[:port],host2[:port],... + - `default_port`: The port number to use when one wasn't specified + for a host. + """ + nodes = [] + for entity in hosts.split(','): + if not entity: + raise ConfigurationError("Empty host " + "(or extra comma in host list).") + port = default_port + # Unix socket entities don't have ports + if entity.endswith('.sock'): + port = None + nodes.append(parse_host(entity, port)) + return nodes + + +# Prohibited characters in database name. DB names also can't have ".", but for +# backward-compat we allow "db.collection" in URI. +_BAD_DB_CHARS = re.compile('[' + re.escape(r'/ "$') + ']') + + +if PY3: + # dnspython can return bytes or str from various parts + # of its API depending on version. We always want str. + def maybe_decode(text): + if isinstance(text, bytes): + return text.decode() + return text +else: + def maybe_decode(text): + return text + + +_ALLOWED_TXT_OPTS = frozenset( + ['authsource', 'authSource', 'replicaset', 'replicaSet']) + + +def _get_dns_srv_hosts(hostname): + try: + results = resolver.query('_mongodb._tcp.' + hostname, 'SRV') + except Exception as exc: + raise ConfigurationError(str(exc)) + return [(maybe_decode(res.target.to_text(omit_final_dot=True)), res.port) + for res in results] + + +def _get_dns_txt_options(hostname): + try: + results = resolver.query(hostname, 'TXT') + except (resolver.NoAnswer, resolver.NXDOMAIN): + # No TXT records + return None + except Exception as exc: + raise ConfigurationError(str(exc)) + if len(results) > 1: + raise ConfigurationError('Only one TXT record is supported') + return ( + b'&'.join([b''.join(res.strings) for res in results])).decode('utf-8') + + +def parse_uri(uri, default_port=DEFAULT_PORT, validate=True, warn=False): + """Parse and validate a MongoDB URI. + + Returns a dict of the form:: + + { + 'nodelist': <list of (host, port) tuples>, + 'username': <username> or None, + 'password': <password> or None, + 'database': <database name> or None, + 'collection': <collection name> or None, + 'options': <dict of MongoDB URI options> + } + + If the URI scheme is "mongodb+srv://" DNS SRV and TXT lookups will be done + to build nodelist and options. + + :Parameters: + - `uri`: The MongoDB URI to parse. + - `default_port`: The port number to use when one wasn't specified + for a host in the URI. + - `validate`: If ``True`` (the default), validate and normalize all + options. + - `warn` (optional): When validating, if ``True`` then will warn + the user then ignore any invalid options or values. If ``False``, + validation will error when options are unsupported or values are + invalid. + + .. versionchanged:: 3.6 + Added support for mongodb+srv:// URIs + + .. versionchanged:: 3.5 + Return the original value of the ``readPreference`` MongoDB URI option + instead of the validated read preference mode. + + .. versionchanged:: 3.1 + ``warn`` added so invalid options can be ignored. + """ + if uri.startswith(SCHEME): + is_srv = False + scheme_free = uri[SCHEME_LEN:] + elif uri.startswith(SRV_SCHEME): + if not _HAVE_DNSPYTHON: + raise ConfigurationError('The "dnspython" module must be ' + 'installed to use mongodb+srv:// URIs') + is_srv = True + scheme_free = uri[SRV_SCHEME_LEN:] + else: + raise InvalidURI("Invalid URI scheme: URI must " + "begin with '%s' or '%s'" % (SCHEME, SRV_SCHEME)) + + if not scheme_free: + raise InvalidURI("Must provide at least one hostname or IP.") + + user = None + passwd = None + dbase = None + collection = None + options = {} + + host_part, _, path_part = scheme_free.partition('/') + if not host_part: + host_part = path_part + path_part = "" + + if not path_part and '?' in host_part: + raise InvalidURI("A '/' is required between " + "the host list and any options.") + + if '@' in host_part: + userinfo, _, hosts = host_part.rpartition('@') + user, passwd = parse_userinfo(userinfo) + else: + hosts = host_part + + if '/' in hosts: + raise InvalidURI("Any '/' in a unix domain socket must be" + " percent-encoded: %s" % host_part) + + hosts = unquote_plus(hosts) + + if is_srv: + nodes = split_hosts(hosts, default_port=None) + if len(nodes) != 1: + raise InvalidURI( + "%s URIs must include one, " + "and only one, hostname" % (SRV_SCHEME,)) + fqdn, port = nodes[0] + if port is not None: + raise InvalidURI( + "%s URIs must not include a port number" % (SRV_SCHEME,)) + nodes = _get_dns_srv_hosts(fqdn) + + try: + plist = fqdn.split(".")[1:] + except Exception: + raise ConfigurationError("Invalid URI host") + slen = len(plist) + if slen < 2: + raise ConfigurationError("Invalid URI host") + for node in nodes: + try: + nlist = node[0].split(".")[1:][-slen:] + except Exception: + raise ConfigurationError("Invalid SRV host") + if plist != nlist: + raise ConfigurationError("Invalid SRV host") + + dns_options = _get_dns_txt_options(fqdn) + if dns_options: + options = split_options(dns_options, validate, warn) + if set(options) - _ALLOWED_TXT_OPTS: + raise ConfigurationError( + "Only authSource and replicaSet are supported from DNS") + options["ssl"] = True if validate else 'true' + else: + nodes = split_hosts(hosts, default_port=default_port) + + if path_part: + if path_part[0] == '?': + opts = unquote_plus(path_part[1:]) + else: + dbase, _, opts = map(unquote_plus, path_part.partition('?')) + if '.' in dbase: + dbase, collection = dbase.split('.', 1) + + if _BAD_DB_CHARS.search(dbase): + raise InvalidURI('Bad database name "%s"' % dbase) + + if opts: + options.update(split_options(opts, validate, warn)) + + if dbase is not None: + dbase = unquote_plus(dbase) + if collection is not None: + collection = unquote_plus(collection) + + return { + 'nodelist': nodes, + 'username': user, + 'password': passwd, + 'database': dbase, + 'collection': collection, + 'options': options + } + + +if __name__ == '__main__': + import pprint + import sys + try: + pprint.pprint(parse_uri(sys.argv[1])) + except InvalidURI as exc: + print(exc) + sys.exit(0) diff --git a/mongo_mac/lib/python3.6/site-packages/pymongo/write_concern.py b/mongo_mac/lib/python3.6/site-packages/pymongo/write_concern.py new file mode 100644 index 0000000..14ad63d --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/pymongo/write_concern.py @@ -0,0 +1,126 @@ +# Copyright 2014-present MongoDB, Inc. +# +# 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. + +"""Tools for working with write concerns.""" + +from bson.py3compat import integer_types, string_type +from pymongo.errors import ConfigurationError + + +class WriteConcern(object): + """WriteConcern + + :Parameters: + - `w`: (integer or string) Used with replication, write operations + will block until they have been replicated to the specified number + or tagged set of servers. `w=<integer>` always includes the replica + set primary (e.g. w=3 means write to the primary and wait until + replicated to **two** secondaries). **w=0 disables acknowledgement + of write operations and can not be used with other write concern + options.** + - `wtimeout`: (integer) Used in conjunction with `w`. Specify a value + in milliseconds to control how long to wait for write propagation + to complete. If replication does not complete in the given + timeframe, a timeout exception is raised. + - `j`: If ``True`` block until write operations have been committed + to the journal. Cannot be used in combination with `fsync`. Prior + to MongoDB 2.6 this option was ignored if the server was running + without journaling. Starting with MongoDB 2.6 write operations will + fail with an exception if this option is used when the server is + running without journaling. + - `fsync`: If ``True`` and the server is running without journaling, + blocks until the server has synced all data files to disk. If the + server is running with journaling, this acts the same as the `j` + option, blocking until write operations have been committed to the + journal. Cannot be used in combination with `j`. + """ + + __slots__ = ("__document", "__acknowledged", "__server_default") + + def __init__(self, w=None, wtimeout=None, j=None, fsync=None): + self.__document = {} + self.__acknowledged = True + + if wtimeout is not None: + if not isinstance(wtimeout, integer_types): + raise TypeError("wtimeout must be an integer") + if wtimeout < 0: + raise ValueError("wtimeout cannot be less than 0") + self.__document["wtimeout"] = wtimeout + + if j is not None: + if not isinstance(j, bool): + raise TypeError("j must be True or False") + self.__document["j"] = j + + if fsync is not None: + if not isinstance(fsync, bool): + raise TypeError("fsync must be True or False") + if j and fsync: + raise ConfigurationError("Can't set both j " + "and fsync at the same time") + self.__document["fsync"] = fsync + + if w == 0 and j is True: + raise ConfigurationError("Cannot set w to 0 and j to True") + + if w is not None: + if isinstance(w, integer_types): + if w < 0: + raise ValueError("w cannot be less than 0") + self.__acknowledged = w > 0 + elif not isinstance(w, string_type): + raise TypeError("w must be an integer or string") + self.__document["w"] = w + + self.__server_default = not self.__document + + @property + def is_server_default(self): + """Does this WriteConcern match the server default.""" + return self.__server_default + + @property + def document(self): + """The document representation of this write concern. + + .. note:: + :class:`WriteConcern` is immutable. Mutating the value of + :attr:`document` does not mutate this :class:`WriteConcern`. + """ + return self.__document.copy() + + @property + def acknowledged(self): + """If ``True`` write operations will wait for acknowledgement before + returning. + """ + return self.__acknowledged + + def __repr__(self): + return ("WriteConcern(%s)" % ( + ", ".join("%s=%s" % kvt for kvt in self.__document.items()),)) + + def __eq__(self, other): + if isinstance(other, WriteConcern): + return self.__document == other.document + return NotImplemented + + def __ne__(self, other): + if isinstance(other, WriteConcern): + return self.__document != other.document + return NotImplemented + + +DEFAULT_WRITE_CONCERN = WriteConcern() diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/INSTALLER b/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/LICENSE b/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/LICENSE new file mode 100644 index 0000000..6e0693b --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2016 Jason R Coombs <jaraco@jaraco.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/METADATA b/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/METADATA new file mode 100644 index 0000000..571a5cb --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/METADATA @@ -0,0 +1,77 @@ +Metadata-Version: 2.1 +Name: setuptools +Version: 41.0.1 +Summary: Easily download, build, install, upgrade, and uninstall Python packages +Home-page: https://github.com/pypa/setuptools +Author: Python Packaging Authority +Author-email: distutils-sig@python.org +License: UNKNOWN +Project-URL: Documentation, https://setuptools.readthedocs.io/ +Keywords: CPAN PyPI distutils eggs package management +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: System :: Archiving :: Packaging +Classifier: Topic :: System :: Systems Administration +Classifier: Topic :: Utilities +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* +Description-Content-Type: text/x-rst; charset=UTF-8 +Provides-Extra: certs +Requires-Dist: certifi (==2016.9.26) ; extra == 'certs' +Provides-Extra: ssl +Requires-Dist: wincertstore (==0.2) ; (sys_platform=='win32') and extra == 'ssl' + +.. image:: https://img.shields.io/pypi/v/setuptools.svg + :target: https://pypi.org/project/setuptools + +.. image:: https://img.shields.io/readthedocs/setuptools/latest.svg + :target: https://setuptools.readthedocs.io + +.. image:: https://img.shields.io/travis/pypa/setuptools/master.svg?label=Linux%20CI&logo=travis&logoColor=white + :target: https://travis-ci.org/pypa/setuptools + +.. image:: https://img.shields.io/appveyor/ci/pypa/setuptools/master.svg?label=Windows%20CI&logo=appveyor&logoColor=white + :target: https://ci.appveyor.com/project/pypa/setuptools/branch/master + +.. image:: https://img.shields.io/codecov/c/github/pypa/setuptools/master.svg?logo=codecov&logoColor=white + :target: https://codecov.io/gh/pypa/setuptools + +.. image:: https://tidelift.com/badges/github/pypa/setuptools?style=flat + :target: https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=readme + +.. image:: https://img.shields.io/pypi/pyversions/setuptools.svg + +See the `Installation Instructions +<https://packaging.python.org/installing/>`_ in the Python Packaging +User's Guide for instructions on installing, upgrading, and uninstalling +Setuptools. + +Questions and comments should be directed to the `distutils-sig +mailing list <http://mail.python.org/pipermail/distutils-sig/>`_. +Bug reports and especially tested patches may be +submitted directly to the `bug tracker +<https://github.com/pypa/setuptools/issues>`_. + +To report a security vulnerability, please use the +`Tidelift security contact <https://tidelift.com/security>`_. +Tidelift will coordinate the fix and disclosure. + + +Code of Conduct +--------------- + +Everyone interacting in the setuptools project's codebases, issue trackers, +chat rooms, and mailing lists is expected to follow the +`PyPA Code of Conduct <https://www.pypa.io/en/latest/code-of-conduct/>`_. + + diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/RECORD b/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/RECORD new file mode 100644 index 0000000..283aabf --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/RECORD @@ -0,0 +1,186 @@ +easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126 +pkg_resources/__init__.py,sha256=pp8b7Asoaheso-q8lIMS1tpQp88xjAkYgCIRX-JsPlE,107982 +pkg_resources/py31compat.py,sha256=-WQ0e4c3RG_acdhwC3gLiXhP_lg4G5q7XYkZkQg0gxU,558 +pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pkg_resources/_vendor/appdirs.py,sha256=MievUEuv3l_mQISH5SF0shDk_BNhHHzYiAPrT3ITN4I,24701 +pkg_resources/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055 +pkg_resources/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +pkg_resources/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720 +pkg_resources/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 +pkg_resources/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 +pkg_resources/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 +pkg_resources/_vendor/packaging/markers.py,sha256=uEcBBtGvzqltgnArqb9c4RrcInXezDLos14zbBHhWJo,8248 +pkg_resources/_vendor/packaging/requirements.py,sha256=SikL2UynbsT0qtY9ltqngndha_sfo0w6XGFhAhoSoaQ,4355 +pkg_resources/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 +pkg_resources/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 +pkg_resources/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 +pkg_resources/extern/__init__.py,sha256=cHiEfHuLmm6rs5Ve_ztBfMI7Lr31vss-D4wkqF5xzlI,2498 +setuptools/__init__.py,sha256=WBpCcn2lvdckotabeae1TTYonPOcgCIF3raD2zRWzBc,7283 +setuptools/_deprecation_warning.py,sha256=jU9-dtfv6cKmtQJOXN8nP1mm7gONw5kKEtiPtbwnZyI,218 +setuptools/archive_util.py,sha256=kw8Ib_lKjCcnPKNbS7h8HztRVK0d5RacU3r_KRdVnmM,6592 +setuptools/build_meta.py,sha256=ioZE7tGSWY6vy7KLune0Iq334ugXuO39imcKC8prjBY,9387 +setuptools/cli-32.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 +setuptools/cli-64.exe,sha256=KLABu5pyrnokJCv6skjXZ6GsXeyYHGcqOUT3oHI3Xpo,74752 +setuptools/cli.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 +setuptools/config.py,sha256=lz19l1AtoHctpp1_tbYZv176nrEj4Gpf7ykNIYTIkAQ,20425 +setuptools/dep_util.py,sha256=fgixvC1R7sH3r13ktyf7N0FALoqEXL1cBarmNpSEoWg,935 +setuptools/depends.py,sha256=hC8QIDcM3VDpRXvRVA6OfL9AaQfxvhxHcN_w6sAyNq8,5837 +setuptools/dist.py,sha256=qYPmmVlLPWCLHrILR0J74bqoYgTSZh5ocLeyRKqnVyU,49913 +setuptools/extension.py,sha256=uc6nHI-MxwmNCNPbUiBnybSyqhpJqjbhvOQ-emdvt_E,1729 +setuptools/glibc.py,sha256=X64VvGPL2AbURKwYRsWJOXXGAYOiF_v2qixeTkAULuU,3146 +setuptools/glob.py,sha256=o75cHrOxYsvn854thSxE0x9k8JrKDuhP_rRXlVB00Q4,5084 +setuptools/gui-32.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536 +setuptools/gui-64.exe,sha256=aYKMhX1IJLn4ULHgWX0sE0yREUt6B3TEHf_jOw6yNyE,75264 +setuptools/gui.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536 +setuptools/launch.py,sha256=sd7ejwhBocCDx_wG9rIs0OaZ8HtmmFU8ZC6IR_S0Lvg,787 +setuptools/lib2to3_ex.py,sha256=t5e12hbR2pi9V4ezWDTB4JM-AISUnGOkmcnYHek3xjg,2013 +setuptools/monkey.py,sha256=FGc9fffh7gAxMLFmJs2DW_OYWpBjkdbNS2n14UAK4NA,5264 +setuptools/msvc.py,sha256=uuRFaZzjJt5Fv3ZmyKUUuLtjx12_8G9RILigGec4irI,40838 +setuptools/namespaces.py,sha256=F0Nrbv8KCT2OrO7rwa03om4N4GZKAlnce-rr-cgDQa8,3199 +setuptools/package_index.py,sha256=F9LBC-hQ5fkjeEVflxif0mo_DzRMrepahdFTPenOtGM,40587 +setuptools/pep425tags.py,sha256=o_D_WVeWcXZiI2xjPSg7pouGOvaWRgGRxEDK9DzAXIA,10861 +setuptools/py27compat.py,sha256=3mwxRMDk5Q5O1rSXOERbQDXhFqwDJhhUitfMW_qpUCo,536 +setuptools/py31compat.py,sha256=h2rtZghOfwoGYd8sQ0-auaKiF3TcL3qX0bX3VessqcE,838 +setuptools/py33compat.py,sha256=OubjldHJH1KGE1CKt1kRU-Q55keftHT3ea1YoL0ZSco,1195 +setuptools/sandbox.py,sha256=9UbwfEL5QY436oMI1LtFWohhoZ-UzwHvGyZjUH_qhkw,14276 +setuptools/script (dev).tmpl,sha256=RUzQzCQUaXtwdLtYHWYbIQmOaES5Brqq1FvUA_tu-5I,218 +setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138 +setuptools/site-patch.py,sha256=OumkIHMuoSenRSW1382kKWI1VAwxNE86E5W8iDd34FY,2302 +setuptools/ssl_support.py,sha256=nLjPUBBw7RTTx6O4RJZ5eAMGgjJG8beiDbkFXDZpLuM,8493 +setuptools/unicode_utils.py,sha256=NOiZ_5hD72A6w-4wVj8awHFM3n51Kmw1Ic_vx15XFqw,996 +setuptools/version.py,sha256=og_cuZQb0QI6ukKZFfZWPlr1HgJBPPn2vO2m_bI9ZTE,144 +setuptools/wheel.py,sha256=94uqXsOaKt91d9hW5z6ZppZmNSs_nO66R4uiwhcr4V0,8094 +setuptools/windows_support.py,sha256=5GrfqSP2-dLGJoZTq2g6dCKkyQxxa2n5IQiXlJCoYEE,714 +setuptools/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +setuptools/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055 +setuptools/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +setuptools/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720 +setuptools/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 +setuptools/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 +setuptools/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 +setuptools/_vendor/packaging/markers.py,sha256=Gvpk9EY20yKaMTiKgQZ8yFEEpodqVgVYtfekoic1Yts,8239 +setuptools/_vendor/packaging/requirements.py,sha256=t44M2HVWtr8phIz2OhnILzuGT3rTATaovctV1dpnVIg,4343 +setuptools/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 +setuptools/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 +setuptools/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 +setuptools/command/__init__.py,sha256=NWzJ0A1BEengZpVeqUyWLNm2bk4P3F4iL5QUErHy7kA,594 +setuptools/command/alias.py,sha256=KjpE0sz_SDIHv3fpZcIQK-sCkJz-SrC6Gmug6b9Nkc8,2426 +setuptools/command/bdist_egg.py,sha256=be-IBpr1zhS9i6GjKANJgzkbH3ChImdWY7S-j0r2BK8,18167 +setuptools/command/bdist_rpm.py,sha256=B7l0TnzCGb-0nLlm6rS00jWLkojASwVmdhW2w5Qz_Ak,1508 +setuptools/command/bdist_wininst.py,sha256=_6dz3lpB1tY200LxKPLM7qgwTCceOMgaWFF-jW2-pm0,637 +setuptools/command/build_clib.py,sha256=bQ9aBr-5ZSO-9fGsGsDLz0mnnFteHUZnftVLkhvHDq0,4484 +setuptools/command/build_ext.py,sha256=81CTgsqjBjNl_HOgCJ1lQ5vv1NIM3RBpcoVGpqT4N1M,12897 +setuptools/command/build_py.py,sha256=yWyYaaS9F3o9JbIczn064A5g1C5_UiKRDxGaTqYbtLE,9596 +setuptools/command/develop.py,sha256=MQlnGS6uP19erK2JCNOyQYoYyquk3PADrqrrinqqLtA,8184 +setuptools/command/dist_info.py,sha256=5t6kOfrdgALT-P3ogss6PF9k-Leyesueycuk3dUyZnI,960 +setuptools/command/easy_install.py,sha256=telww7CuPsoTtvlpY-ktnZGT85cZ6xGCGZa0vHvFJ-Q,87273 +setuptools/command/egg_info.py,sha256=w73EdxYSOk2gsaAiHGL2dZrCldoPiuRr2eTfqcFvCds,25570 +setuptools/command/install.py,sha256=a0EZpL_A866KEdhicTGbuyD_TYl1sykfzdrri-zazT4,4683 +setuptools/command/install_egg_info.py,sha256=bMgeIeRiXzQ4DAGPV1328kcjwQjHjOWU4FngAWLV78Q,2203 +setuptools/command/install_lib.py,sha256=11mxf0Ch12NsuYwS8PHwXBRvyh671QAM4cTRh7epzG0,3840 +setuptools/command/install_scripts.py,sha256=UD0rEZ6861mTYhIdzcsqKnUl8PozocXWl9VBQ1VTWnc,2439 +setuptools/command/launcher manifest.xml,sha256=xlLbjWrB01tKC0-hlVkOKkiSPbzMml2eOPtJ_ucCnbE,628 +setuptools/command/py36compat.py,sha256=SzjZcOxF7zdFUT47Zv2n7AM3H8koDys_0OpS-n9gIfc,4986 +setuptools/command/register.py,sha256=LO3MvYKPE8dN1m-KkrBRHC68ZFoPvA_vI8Xgp7vv6zI,534 +setuptools/command/rotate.py,sha256=co5C1EkI7P0GGT6Tqz-T2SIj2LBJTZXYELpmao6d4KQ,2164 +setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658 +setuptools/command/sdist.py,sha256=gr5hFrDzUtGfp_0tu0sllzIyr3jMQegIkFmlDauQJxw,7388 +setuptools/command/setopt.py,sha256=NTWDyx-gjDF-txf4dO577s7LOzHVoKR0Mq33rFxaRr8,5085 +setuptools/command/test.py,sha256=oePJ49u17ENKtrM-rOrrLlRhtNnrzcSr0IW-gE9XVq0,9285 +setuptools/command/upload.py,sha256=GxtNkIl7SA0r8mACkbDcSCN1m2_WPppK9gZXJmQSiow,6811 +setuptools/command/upload_docs.py,sha256=oXiGplM_cUKLwE4CWWw98RzCufAu8tBhMC97GegFcms,7311 +setuptools/extern/__init__.py,sha256=TxeNKFMSfBMzBpBDiHx8Dh3RzsdVmvWaXhtZ03DZMs0,2499 +setuptools-41.0.1.dist-info/LICENSE,sha256=wyo6w5WvYyHv0ovnPQagDw22q4h9HCHU_sRhKNIFbVo,1078 +setuptools-41.0.1.dist-info/METADATA,sha256=_i0otxacylu95CLISnMjTjG7DZ2vYZOvwedcoJ06JNE,3303 +setuptools-41.0.1.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 +setuptools-41.0.1.dist-info/dependency_links.txt,sha256=HlkCFkoK5TbZ5EMLbLKYhLcY_E31kBWD8TqW2EgmatQ,239 +setuptools-41.0.1.dist-info/entry_points.txt,sha256=jBqCYDlVjl__sjYFGXo1JQGIMAYFJE-prYWUtnMZEew,2990 +setuptools-41.0.1.dist-info/top_level.txt,sha256=2HUXVVwA4Pff1xgTFr3GsTXXKaPaO6vlG6oNJ_4u4Tg,38 +setuptools-41.0.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +setuptools-41.0.1.dist-info/RECORD,, +../../../bin/easy_install,sha256=-iY1KflyA7ZZEgm0LLHcDiFOYSxuZPtVAAQIHiR6P08,279 +../../../bin/easy_install-3.6,sha256=-iY1KflyA7ZZEgm0LLHcDiFOYSxuZPtVAAQIHiR6P08,279 +setuptools-41.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +__pycache__/easy_install.cpython-36.pyc,, +setuptools/_vendor/packaging/__pycache__/_structures.cpython-36.pyc,, +setuptools/_vendor/packaging/__pycache__/version.cpython-36.pyc,, +setuptools/_vendor/packaging/__pycache__/requirements.cpython-36.pyc,, +setuptools/_vendor/packaging/__pycache__/markers.cpython-36.pyc,, +setuptools/_vendor/packaging/__pycache__/_compat.cpython-36.pyc,, +setuptools/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc,, +setuptools/_vendor/packaging/__pycache__/__about__.cpython-36.pyc,, +setuptools/_vendor/packaging/__pycache__/utils.cpython-36.pyc,, +setuptools/_vendor/packaging/__pycache__/__init__.cpython-36.pyc,, +setuptools/_vendor/__pycache__/six.cpython-36.pyc,, +setuptools/_vendor/__pycache__/__init__.cpython-36.pyc,, +setuptools/_vendor/__pycache__/pyparsing.cpython-36.pyc,, +setuptools/__pycache__/package_index.cpython-36.pyc,, +setuptools/__pycache__/py31compat.cpython-36.pyc,, +setuptools/__pycache__/sandbox.cpython-36.pyc,, +setuptools/__pycache__/windows_support.cpython-36.pyc,, +setuptools/__pycache__/wheel.cpython-36.pyc,, +setuptools/__pycache__/version.cpython-36.pyc,, +setuptools/__pycache__/site-patch.cpython-36.pyc,, +setuptools/__pycache__/launch.cpython-36.pyc,, +setuptools/__pycache__/unicode_utils.cpython-36.pyc,, +setuptools/__pycache__/config.cpython-36.pyc,, +setuptools/__pycache__/glibc.cpython-36.pyc,, +setuptools/__pycache__/ssl_support.cpython-36.pyc,, +setuptools/__pycache__/depends.cpython-36.pyc,, +setuptools/__pycache__/glob.cpython-36.pyc,, +setuptools/__pycache__/msvc.cpython-36.pyc,, +setuptools/__pycache__/_deprecation_warning.cpython-36.pyc,, +setuptools/__pycache__/py27compat.cpython-36.pyc,, +setuptools/__pycache__/pep425tags.cpython-36.pyc,, +setuptools/__pycache__/py33compat.cpython-36.pyc,, +setuptools/__pycache__/lib2to3_ex.cpython-36.pyc,, +setuptools/__pycache__/monkey.cpython-36.pyc,, +setuptools/__pycache__/dist.cpython-36.pyc,, +setuptools/__pycache__/build_meta.cpython-36.pyc,, +setuptools/__pycache__/namespaces.cpython-36.pyc,, +setuptools/__pycache__/dep_util.cpython-36.pyc,, +setuptools/__pycache__/__init__.cpython-36.pyc,, +setuptools/__pycache__/extension.cpython-36.pyc,, +setuptools/__pycache__/archive_util.cpython-36.pyc,, +setuptools/command/__pycache__/alias.cpython-36.pyc,, +setuptools/command/__pycache__/register.cpython-36.pyc,, +setuptools/command/__pycache__/install_lib.cpython-36.pyc,, +setuptools/command/__pycache__/setopt.cpython-36.pyc,, +setuptools/command/__pycache__/bdist_egg.cpython-36.pyc,, +setuptools/command/__pycache__/bdist_rpm.cpython-36.pyc,, +setuptools/command/__pycache__/dist_info.cpython-36.pyc,, +setuptools/command/__pycache__/develop.cpython-36.pyc,, +setuptools/command/__pycache__/build_py.cpython-36.pyc,, +setuptools/command/__pycache__/build_clib.cpython-36.pyc,, +setuptools/command/__pycache__/upload.cpython-36.pyc,, +setuptools/command/__pycache__/sdist.cpython-36.pyc,, +setuptools/command/__pycache__/install.cpython-36.pyc,, +setuptools/command/__pycache__/egg_info.cpython-36.pyc,, +setuptools/command/__pycache__/py36compat.cpython-36.pyc,, +setuptools/command/__pycache__/easy_install.cpython-36.pyc,, +setuptools/command/__pycache__/build_ext.cpython-36.pyc,, +setuptools/command/__pycache__/rotate.cpython-36.pyc,, +setuptools/command/__pycache__/upload_docs.cpython-36.pyc,, +setuptools/command/__pycache__/saveopts.cpython-36.pyc,, +setuptools/command/__pycache__/__init__.cpython-36.pyc,, +setuptools/command/__pycache__/test.cpython-36.pyc,, +setuptools/command/__pycache__/bdist_wininst.cpython-36.pyc,, +setuptools/command/__pycache__/install_scripts.cpython-36.pyc,, +setuptools/command/__pycache__/install_egg_info.cpython-36.pyc,, +setuptools/extern/__pycache__/__init__.cpython-36.pyc,, +pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-36.pyc,, +pkg_resources/_vendor/packaging/__pycache__/version.cpython-36.pyc,, +pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-36.pyc,, +pkg_resources/_vendor/packaging/__pycache__/markers.cpython-36.pyc,, +pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-36.pyc,, +pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc,, +pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-36.pyc,, +pkg_resources/_vendor/packaging/__pycache__/utils.cpython-36.pyc,, +pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-36.pyc,, +pkg_resources/_vendor/__pycache__/appdirs.cpython-36.pyc,, +pkg_resources/_vendor/__pycache__/six.cpython-36.pyc,, +pkg_resources/_vendor/__pycache__/__init__.cpython-36.pyc,, +pkg_resources/_vendor/__pycache__/pyparsing.cpython-36.pyc,, +pkg_resources/__pycache__/py31compat.cpython-36.pyc,, +pkg_resources/__pycache__/__init__.cpython-36.pyc,, +pkg_resources/extern/__pycache__/__init__.cpython-36.pyc,, diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/WHEEL b/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/WHEEL new file mode 100644 index 0000000..c8240f0 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/dependency_links.txt b/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/dependency_links.txt new file mode 100644 index 0000000..e87d021 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/dependency_links.txt @@ -0,0 +1,2 @@ +https://files.pythonhosted.org/packages/source/c/certifi/certifi-2016.9.26.tar.gz#md5=baa81e951a29958563689d868ef1064d +https://files.pythonhosted.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/entry_points.txt b/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/entry_points.txt new file mode 100644 index 0000000..4159fd0 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/entry_points.txt @@ -0,0 +1,65 @@ +[console_scripts] +easy_install = setuptools.command.easy_install:main +easy_install-3.6 = setuptools.command.easy_install:main + +[distutils.commands] +alias = setuptools.command.alias:alias +bdist_egg = setuptools.command.bdist_egg:bdist_egg +bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm +bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst +build_clib = setuptools.command.build_clib:build_clib +build_ext = setuptools.command.build_ext:build_ext +build_py = setuptools.command.build_py:build_py +develop = setuptools.command.develop:develop +dist_info = setuptools.command.dist_info:dist_info +easy_install = setuptools.command.easy_install:easy_install +egg_info = setuptools.command.egg_info:egg_info +install = setuptools.command.install:install +install_egg_info = setuptools.command.install_egg_info:install_egg_info +install_lib = setuptools.command.install_lib:install_lib +install_scripts = setuptools.command.install_scripts:install_scripts +register = setuptools.command.register:register +rotate = setuptools.command.rotate:rotate +saveopts = setuptools.command.saveopts:saveopts +sdist = setuptools.command.sdist:sdist +setopt = setuptools.command.setopt:setopt +test = setuptools.command.test:test +upload = setuptools.command.upload:upload +upload_docs = setuptools.command.upload_docs:upload_docs + +[distutils.setup_keywords] +convert_2to3_doctests = setuptools.dist:assert_string_list +dependency_links = setuptools.dist:assert_string_list +eager_resources = setuptools.dist:assert_string_list +entry_points = setuptools.dist:check_entry_points +exclude_package_data = setuptools.dist:check_package_data +extras_require = setuptools.dist:check_extras +include_package_data = setuptools.dist:assert_bool +install_requires = setuptools.dist:check_requirements +namespace_packages = setuptools.dist:check_nsp +package_data = setuptools.dist:check_package_data +packages = setuptools.dist:check_packages +python_requires = setuptools.dist:check_specifier +setup_requires = setuptools.dist:check_requirements +test_loader = setuptools.dist:check_importable +test_runner = setuptools.dist:check_importable +test_suite = setuptools.dist:check_test_suite +tests_require = setuptools.dist:check_requirements +use_2to3 = setuptools.dist:assert_bool +use_2to3_exclude_fixers = setuptools.dist:assert_string_list +use_2to3_fixers = setuptools.dist:assert_string_list +zip_safe = setuptools.dist:assert_bool + +[egg_info.writers] +PKG-INFO = setuptools.command.egg_info:write_pkg_info +dependency_links.txt = setuptools.command.egg_info:overwrite_arg +depends.txt = setuptools.command.egg_info:warn_depends_obsolete +eager_resources.txt = setuptools.command.egg_info:overwrite_arg +entry_points.txt = setuptools.command.egg_info:write_entries +namespace_packages.txt = setuptools.command.egg_info:overwrite_arg +requires.txt = setuptools.command.egg_info:write_requirements +top_level.txt = setuptools.command.egg_info:write_toplevel_names + +[setuptools.installation] +eggsecutable = setuptools.command.easy_install:bootstrap + diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/top_level.txt b/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/top_level.txt new file mode 100644 index 0000000..4577c6a --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/top_level.txt @@ -0,0 +1,3 @@ +easy_install +pkg_resources +setuptools diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/zip-safe b/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools-41.0.1.dist-info/zip-safe @@ -0,0 +1 @@ + diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__init__.py b/mongo_mac/lib/python3.6/site-packages/setuptools/__init__.py new file mode 100644 index 0000000..a71b2bb --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/__init__.py @@ -0,0 +1,228 @@ +"""Extensions to the 'distutils' for large or complex distributions""" + +import os +import sys +import functools +import distutils.core +import distutils.filelist +import re +from distutils.errors import DistutilsOptionError +from distutils.util import convert_path +from fnmatch import fnmatchcase + +from ._deprecation_warning import SetuptoolsDeprecationWarning + +from setuptools.extern.six import PY3, string_types +from setuptools.extern.six.moves import filter, map + +import setuptools.version +from setuptools.extension import Extension +from setuptools.dist import Distribution, Feature +from setuptools.depends import Require +from . import monkey + +__metaclass__ = type + + +__all__ = [ + 'setup', 'Distribution', 'Feature', 'Command', 'Extension', 'Require', + 'SetuptoolsDeprecationWarning', + 'find_packages' +] + +if PY3: + __all__.append('find_namespace_packages') + +__version__ = setuptools.version.__version__ + +bootstrap_install_from = None + +# If we run 2to3 on .py files, should we also convert docstrings? +# Default: yes; assume that we can detect doctests reliably +run_2to3_on_doctests = True +# Standard package names for fixer packages +lib2to3_fixer_packages = ['lib2to3.fixes'] + + +class PackageFinder: + """ + Generate a list of all Python packages found within a directory + """ + + @classmethod + def find(cls, where='.', exclude=(), include=('*',)): + """Return a list all Python packages found within directory 'where' + + 'where' is the root directory which will be searched for packages. It + should be supplied as a "cross-platform" (i.e. URL-style) path; it will + be converted to the appropriate local path syntax. + + 'exclude' is a sequence of package names to exclude; '*' can be used + as a wildcard in the names, such that 'foo.*' will exclude all + subpackages of 'foo' (but not 'foo' itself). + + 'include' is a sequence of package names to include. If it's + specified, only the named packages will be included. If it's not + specified, all found packages will be included. 'include' can contain + shell style wildcard patterns just like 'exclude'. + """ + + return list(cls._find_packages_iter( + convert_path(where), + cls._build_filter('ez_setup', '*__pycache__', *exclude), + cls._build_filter(*include))) + + @classmethod + def _find_packages_iter(cls, where, exclude, include): + """ + All the packages found in 'where' that pass the 'include' filter, but + not the 'exclude' filter. + """ + for root, dirs, files in os.walk(where, followlinks=True): + # Copy dirs to iterate over it, then empty dirs. + all_dirs = dirs[:] + dirs[:] = [] + + for dir in all_dirs: + full_path = os.path.join(root, dir) + rel_path = os.path.relpath(full_path, where) + package = rel_path.replace(os.path.sep, '.') + + # Skip directory trees that are not valid packages + if ('.' in dir or not cls._looks_like_package(full_path)): + continue + + # Should this package be included? + if include(package) and not exclude(package): + yield package + + # Keep searching subdirectories, as there may be more packages + # down there, even if the parent was excluded. + dirs.append(dir) + + @staticmethod + def _looks_like_package(path): + """Does a directory look like a package?""" + return os.path.isfile(os.path.join(path, '__init__.py')) + + @staticmethod + def _build_filter(*patterns): + """ + Given a list of patterns, return a callable that will be true only if + the input matches at least one of the patterns. + """ + return lambda name: any(fnmatchcase(name, pat=pat) for pat in patterns) + + +class PEP420PackageFinder(PackageFinder): + @staticmethod + def _looks_like_package(path): + return True + + +find_packages = PackageFinder.find + +if PY3: + find_namespace_packages = PEP420PackageFinder.find + + +def _install_setup_requires(attrs): + # Note: do not use `setuptools.Distribution` directly, as + # our PEP 517 backend patch `distutils.core.Distribution`. + dist = distutils.core.Distribution(dict( + (k, v) for k, v in attrs.items() + if k in ('dependency_links', 'setup_requires') + )) + # Honor setup.cfg's options. + dist.parse_config_files(ignore_option_errors=True) + if dist.setup_requires: + dist.fetch_build_eggs(dist.setup_requires) + + +def setup(**attrs): + # Make sure we have any requirements needed to interpret 'attrs'. + _install_setup_requires(attrs) + return distutils.core.setup(**attrs) + +setup.__doc__ = distutils.core.setup.__doc__ + + +_Command = monkey.get_unpatched(distutils.core.Command) + + +class Command(_Command): + __doc__ = _Command.__doc__ + + command_consumes_arguments = False + + def __init__(self, dist, **kw): + """ + Construct the command for dist, updating + vars(self) with any keyword parameters. + """ + _Command.__init__(self, dist) + vars(self).update(kw) + + def _ensure_stringlike(self, option, what, default=None): + val = getattr(self, option) + if val is None: + setattr(self, option, default) + return default + elif not isinstance(val, string_types): + raise DistutilsOptionError("'%s' must be a %s (got `%s`)" + % (option, what, val)) + return val + + def ensure_string_list(self, option): + r"""Ensure that 'option' is a list of strings. If 'option' is + currently a string, we split it either on /,\s*/ or /\s+/, so + "foo bar baz", "foo,bar,baz", and "foo, bar baz" all become + ["foo", "bar", "baz"]. + """ + val = getattr(self, option) + if val is None: + return + elif isinstance(val, string_types): + setattr(self, option, re.split(r',\s*|\s+', val)) + else: + if isinstance(val, list): + ok = all(isinstance(v, string_types) for v in val) + else: + ok = False + if not ok: + raise DistutilsOptionError( + "'%s' must be a list of strings (got %r)" + % (option, val)) + + def reinitialize_command(self, command, reinit_subcommands=0, **kw): + cmd = _Command.reinitialize_command(self, command, reinit_subcommands) + vars(cmd).update(kw) + return cmd + + +def _find_all_simple(path): + """ + Find all files under 'path' + """ + results = ( + os.path.join(base, file) + for base, dirs, files in os.walk(path, followlinks=True) + for file in files + ) + return filter(os.path.isfile, results) + + +def findall(dir=os.curdir): + """ + Find all files under 'dir' and return the list of full filenames. + Unless dir is '.', return full filenames with dir prepended. + """ + files = _find_all_simple(dir) + if dir == os.curdir: + make_rel = functools.partial(os.path.relpath, start=dir) + files = map(make_rel, files) + return list(files) + + +# Apply monkey patches +monkey.patch_all() diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a55ad6fd9fcac68fec638867a215b7da5322a84 GIT binary patch literal 7709 zcmb7J%X1vZd7szL&Mp?<5(Gi<A!!5>S}p}HD3Owwn4xKtqT;dxGZJMbW2(l3>0V$K zvop)?Sv<BDsY*bXb%+!nT(0uPm6NMd<%9o$98)>ul3S|gno6pC$seFoeqYb-EC?b_ zvRmEL-P6ynzwh@w=Jx!2{XhQxpP$Jqn)dJ7v7dwT10?ySu4zp3G^R5n);(Q44bM<d z(=*l6@+#_SPo7n;in<v){hC+PX{;63`*Yr$Dp%r0f8Lu%*=E&vp?}6ZquQOg*+1)@ z?Js(Zs$PrF^_RS*{(0}bsvGgLcL8(N<JbBZy^E@CF22;i>|O3(@vf+PBYwUAhW7@_ zHk*&%?7N<;Yy2&5g)Oi%tjW%@MRtxYvGZGwca@(N|H-fRuCe7K9lb8}R(o%IZ!^Pd zu?yaH_S%;2wLjL_MRw_h#x5Nh-VM|)vn!}w;Wv&<?;U=lx8~jCXMe7XHU19D9rikV z<Avs}vp3lSp0{|V_ipc2Pvf_Ijk~?~RQ>jm?%ly$E<204&hk5$>o$9ftzg9aT<?9* z)!9{c?S<}rh%tAMG@QryRBNw}9(=T)@kB;xBHb)?vu*CSSR}Jy7R9pVc2nWTf!N|M z3SrtG#C+eS_afRv7mWHnUGhd-&zBxehy8FsZ$1(t6=-jSX|l^j<`05w8}+$v(hst5 zI}9ZMJ(xj5+m%mwHXLMW8p}s~Ab1$i44(%giIT0hk(*Ec@^;>!Rg*10I~Z_@M!Oru z85g<P4+fZ{R-Od!8nl_|9`ovB9%Mto(X09ie?E*<(e9_o4nN2%k`@;YY(>l?%c~F5 zem_W<n4_iz%4}+%??ws3F~Xf-i_83iswP37OSJLw#naJz9BsarrMElXXrIdvW6Pg~ z(gP&<r^vVl{?~~2J(F9^=xS`fYch*fUg)^d3fjQYFEo^GUS$resj`D|oz1CojWuwO z3;Fz$Vq1@~MJ`6)tGoDp%o8qxjJtswgC1_$b%Qu|pB!Y{Y2r=~f=eDI%-xH!?I=N4 z2J(biDh|{fx!%e38zJqRe)J?_JVcUjBg?e0*3&a%j2)w7GIMPF+W4AU&9V8lc4Qvu z*r65FOilX)loqsx+Rp#FmvSd=Yj2wi-m0rD(a|OiZUnXk&x$n7W*c|+wxe(xC&FPj zxhr`f!fnnJH&0L9aoz7_<#cj89mY&`9u5X^gwBD)K377KN_le-2N^`6zv5nxI=th4 z_Q?-!%IqNKZBQ}W{+1hMYPE7ctU6(P%rud!U@#ErKtyyQaT*4(8tck~Bn$RC$BxGL z!+6Meiw+lH_s@qs2_b>q>6N*P>1f_b*KfJ48!a~s5<0<9a#n6codSelVIY```z30r z;cKoOf=JnRkh!gHnszXQqS$0kVwG|lIozBQj`l(QTkds0fSZ8uMK#JKkGt*TCyA2( z^GPOM=~}uVXG_l39`G>g;!4)sG>H$&6R;^cWO>t*N!V-_+TUq25$_dzU!H5qF2^Qm zl?Nc&;zqL|N@mk-bIhXnfOb%j82kWG0-E-QkhnP70iaGVv{Mev9X|3E?tIg@;roMw zFaU@8e%lZiAXMTtWNj<ANKW!|{!75)M_52Wnt(|D<`4_xJs}|mm|-mQiV~K*I$1Wa zPEPR;ns71dn{*vqxC=I1-wniiH;sW9ay{Hx&*FExoBO-$j{MMnKioXndG~gAwAT-B z;kT8nKV2V0gPTzzGf?m5ojxBixi8n%F%)(mFZzCzM49h*1_!xC`@e&wC7A)*qOIF{ zLmw?ZIgVKX%Y>CULugz<3X$Y*k?sE`1I~<<z3`RsNc-X!&&)&XuySaRD-5XfQ{$p` zSl!a5wR_tBU|dDN?L!A64WN-Vc8-k0nyOjj8W77ktdHxxifXZ$h58&ruN_<71%6e> zwIjWuiNAV&cWjR5j&$+Mu|ZF?{c=3_BWTfarRQK)UDux9{akzA{9I!u(5^Bnz>|>b zJKzx#x{}Wdwu2~6F-(czAdm%=&3LZ3)ioDlRx%EWn^MwKo^p#`GuC>lbZi>O>0TTq zJ90yu2l?8y+(>0^?FI2pZV_nZRxgc`yefFCswe>FLY|wF55RMAn(j!S7<j7LavKoF z6V`4Bn0K0Zow7G5dlOl15eVlNKpQNGU2*9-U=&|9n8@>5cZj-L&B3xosX8Hy;>{v^ zi{`w9?E6TPWI?kp84bN*)b$1Yo92>kn2Wk?jox~hhfa}{kZcV4(Ua8ILnOJ3j2NnC zsN5XGs5~;1sxn5ak5W$1JJUZzj6#@$=|z5fG<S^0+m^V7DFvy-+>RujU$jtZ>#FVK z>E6MsEhK3m)67@S@hbI664Z~*VIozLB+1FoG?;fVr(ZZ=J#+MTC9`}S?ebFFD)mud z)0!)$iWq7r4mM+6=z%E&W?~3^Ltq<q%h`zSqGSNfSN0oG2mr?eGAt6Mo(eWE)|fHm zD;IE%HeOu7Z0ld@k6`Dh3otjzAw(U5f!j2MIAW}Qv3RIw+Ls!jK>NxdA$$%43MV(f z_$HVO#;Blsh8bvdZi)A)sOJ_by%~FbQ@ghX>u7%<?hBfm7P7R_gA?p@99}#3l-8E_ zQ3(2*ET97EacY@PMtca718m{LVqFJ2QVL<xB#60lXF7#i94*@D=KpJHbrMYZ#~Auj znWh()k;O;_ciE%Me_(DR7hOiXo;$uzRPz12?)&|e4Pz=deE<0{h$nBVzR%JS&2wQ4 z$m(<0l1!}7s&qeOrNej+C+)=MYBvStU8<@~ZF33LbtJ{bj%gW&zPQ}D(x?b}Q!+ft zis2vNsnB3*H*@7JDm&OxxNGI-o_zG=&U?3BI&aBMBsr8G(nQ1}1>bBuol=mb_t;L= zCg}*fG(btJF>0N%Lgy5;+-O(CJ(}-ND7#PDcPLXNaj7)R)I#4y+Ym`D<miIx<<@EO z61*OuG6Am%1)#00Bdw62BmEG1vPW9c`U;u}Wn0`sUZoQ0DyET+nn@X<2~933tssMx zU3z95>W47vnYm*NJjX_NDsALCT6vRk(gv_i51=NXY4QbS3izUMvE&A<86vfKM45}M zZHf=@$n~9E-#vN$yLj_cBy}^EX6vIHupyMOQJ6~Q#HYv|w4S#VZ6>eyaRWA4XCt zWZTJWr9+!rAv!2mj}%py<rNrHeVH!~0wK8%3$Gh(kvYYs+O^m0a`>tfGmCF+k>go` zL_^160{ECNc3fn1iTQ>9VatC_2dg8~Oh;d~8nA%G25Kdf>+}lg`$!XT90L$_ErX8g znO)q;*E;B~Z$Q=1Nbxac<VK1nGDz_csO*-RVk&y|HIgE#W;lAeAR1><MKCgxs-ERp z@JTDoU?w66Hfyj7vk^V0GI*hAaoD`_Ky|OiENp5)oW%r>L*i2U(Lu_?kcB|pItC{m z890zZ2ZKEZbxSc8j5kKTQq4R>PyzZUEbJV_9LN<{t{c&N%^eOH04CWg2f&Dx*Olu5 zD?HnF0lzN%`n?nm53Ut}2K<#XeFOpm=_WotVP0XV<`zwq+iHH^Hgk*S6n}=@=f=+7 zNy0us`>&A-!d76;HYZbdrZaAo)-0(oN)KrO$u)V+%Ko&*7Snbdv63nJjLjnx5(^s= zRI)Pj$dLCl+y#l>*y@_gpxoc+W1_jSF}l)PMU19Tjt2a`z+IK@^(`2PKUtMOX}2qR zb&CUxGm%#zn5s~Zq!KCklY(q<K{p1V`V^1cE(8ZgB7DNU%6K;z##wIe2Jwm0=Zijq zMu@2RMNEdQ#NS{FN$jTSb=`q|Z{cadS{q#|3G>RJl4A&dY$QdY0SYCBj4{+ZD6~wR z0xB7qab$=OGMH>*J+pvw=mFCWbW1)^?`^z)npFw^UT9;ZK*d8dL0sh!F$o!G4zmkD zE9j|susZs$kJOn8Q>axCW8#EQ!zaaYW#L~Q>rygfI23{>87!v&o*~7n*4#brO2ia0 ziV|>eD9jLqU)I;2$s6kwS6hE3-&uz{o|dz$z`u4k1A#PJS#znnhAI+ONgh;_>z18V zU}uv<TzEOlkEs(4$I#+2TKVFb9E=>=!WgT+qGlv+K&e`2f+pEpAT@+{Vr`N701g@A zb97UDgfaoUcubjFW(tA`*Z&bo={49`H>d3I5;s7F$m|qge>`fP;PMl9QLy}~Xt!(P zGg`Ual=u;<xgj`0d_;e7k?JNa-h%Bd#rEPaXwZ*U*L3H^=JUl@H~Bksoj4`L=)~sB za7>mA3uOcU8N<IiSP;&KCNlaFCJ^T<(05Uo;v_g4-YsE(LQ2HYfC?n_3jTkHp81mC z1YA)NM<dc)Mac5c@k)GxY%0{%$(ww!=<g$xGij3IDNSUCeRks5ViPa^2}zPnYRc&v zU76n7X$#ZFbal9P{iNAL+ZEqN=3SbsOo~<x5jgb`TgEfVq#!^Q&nOEhqa7UEl}lB{ zPNZpmg;W@gx@}m7<J9ZU`InfuMBBH~RXIl!+A6C^VFK8ioIkT?5fX#8mC>q_9g3kU zc~W+Oi{L0Ewnc7hOT8}_qD3f4N^8g<E!Pm1fZaqugW$swE>U@zfE$Dtl>9W|uS_J! z6xT4Sa1fQVSSjoyYZJk7(V=%_A5#DY?xag~m6dY!uV^alC2->CYT^Ep(=8*4)t@3y zFqFhqi~@hCwO47<8f8Q&K~WkAGnFYcAfW){iG}m#$z}cpy$epM*!rR=BGgMF5w8=E zKcr3s5`^r^MpdTGjv+c3?f_;^rDu~H{*`fPWL4-p+zRf<!BZ!FH~QN@a653-TM8H_ zo-MheQ=p)z1BFSrihC9S_*nuIPm+gEQPx(cRr<s)_byBd>W0q}%G_ne1aR~!uuVk< z*rD?(YUVcZADt=EksyYS?-@Db8-k>?pzn3+N_L<EBiO^Ys7#maIsE{!7Q{tP(z{BL zF<k1up;uu;RvduNB9chZ*8U?UUBwPec_0P(e)&Ra_I8xjOZH;EIBO(|5Q)SW^rAU? zQ5en&Bacr)pM;9AV|DTgN4eSFk`G5<`pw4QD?Zw&FDBmkS!}Sw@u5j19U1Klid-nQ z;axtpL#Lna!T?uXNwo47k9EVhB>G&H*Jo|s(yXl3Q6IF_=Ns?Lu~&4&*>|3oW-WXf zslN8)nm9uwvFJ;aHxE}B)|2vf;r7D+CHe9N$$MU%?gp`-NzwPc<xNDwuv9Q8y@9Ss z``(fmCO&-_^3#O8=#0xuddriqMUbj}E~ddYseEAN1Qy=)A`$HzWy<<*Qi-g8Zyr{j zKTLp6^pQhZ;zB{LV#^)sM_l67R1ezyF$Qz#HNgo&5{1WqUq?+68Ut8?D$_s0ZwSCO xjHcd1dqZ!kx&>Fp&}|c1&~OaPvJBf?c-*vY13_NXnRhA;bHQxB=QI}P{~NsG$@%~Q literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9ab86649cfdc6b8e129d129565a6344dfca8c6d GIT binary patch literal 560 zcmZWm%}N6?5Kez+OR?a=qla7zwrgp{i%1c{TQ4mLMaZU`Y#W+Q)}7t{dDI6HZ$63d zuvhUVJUQJhZNY(W_%bu!WHRYC8ug#|ucwp{@{QPA8Cf3zXXqY?AfoVwkmR*AE{Nig zG)o?4_EtdFN5CmMNw9{Di=r?t<+bVgP{v6ZTdUz-hLQAmtgLzDkx^#4`KVL0I}Vb1 zngdYZMs%4csW{XFRff7Q?0dOxJ(G@R3U*Q?#>S|M)ItjCM>aso|4Uu>f^s7$2MUQd zqYAQ43k7PTC7rCXh0hZmx3l=5Sx#$=86HT+(mG>-6^Y*R6ULqsu6LO#W5RljeUhkx ztH|8%ixc8BJeJOaM~-hbP6v)RcVgY~C#!|%!8N<`ChK{p>u;8UcZoJN&d3Q>*ir^! zu63&y$c=y%IEVKiQ+Bi{wp(61Tu0ll*#e5_YL)CfXcp7zZu?o_Fl^4MSew>v@<-lg Ha*U8a(Ym7L literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/archive_util.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/archive_util.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bfad0c870063e9c5d1c4fddfe97d6d5bb04055b6 GIT binary patch literal 5148 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/build_meta.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/build_meta.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c94b34609b3f0f2a7a235f08a0dbb64849065f89 GIT binary patch literal 8301 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 SqlId9rL}US4Dd1jbN(0Tt7>up literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/config.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/config.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9bc174eca0e12dea3240f93c9fbb4c37f0ce1c01 GIT binary patch literal 17724 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 VF2l!vuy|zVM~xpfK0Wus{{fo>W+?yw literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/dep_util.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/dep_util.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b27cbd82bc977d9b5cd684457f761f1c2107999b GIT binary patch literal 867 zcmY*X&2AGh5Vm)dQqrbE5r=Z~EnO+iQre0OLWrL$2S8McK#{X{HYQ$svAs<jZ7+le z;f8n;-eIqZ1FrxVX4k2d%*wOl`T0J3#;4tG=l8dtAHIhO{X!cOfc*@XJp{!N!xCk9 zgfU_P3%{aKz*=un)cyle6ya)5@dY>I)aW8l>e^b`>-7TuR)TV<L@Nv$ukbuHhYmBa zzTgzy1hB%Z=PvL$EBq3De00-tVTsDt1E{F=Dlo$`_|)>g6`ZCFVdrD8`#iirWl)CG z0L~UH|6NcyCll>vgqpO-xN?>VMRIDWlw1yo<JJk45-}y5CNpAnVG>T7YY<^cbE^&k zaWkrjfcium!)>k=s|y_fb2lV!xGRjZgaWuQL{Etn7P5~#qV=7z1CP}d*@!G=-0(Fi zoNUeKxjgcK&;%Ggmxc(W^NcDd65C(_Q-7oPM^S&+_?PGXE$Tj@ijlrYwSAHm){zPK zh&1Cwa+SJS)UHCXs?K{V3;xO&ZK}4RD&?l0YPCc2oGTW!M+aN*wz{*1uI{SwI#ipt zUMzkfvj-4=b(|Y<Nga<bsfnjrGHz^~%ws1{rjx5nc4i-s&y&gZ{N!}HTx7{ZkW|I* z;#}m%LRkmHJ3h<!lG!U8Tj+f5w3b^Y<N3I7LJsrm>b~z!J(z{C+>c_Xev>^=Xy+c@ z4O_T{d+;6LUSPW5eI12WkHHLU6g#}dYr4=RG?&>>`%qNvKFKsIB!7xwXX}pbxBmlG CRRH_| literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/depends.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/depends.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..864d859c57fe474801130d347437667779905800 GIT binary patch literal 5293 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/dist.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/dist.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54fb1c8a5424d822304baf438b04c5473b68aac7 GIT binary patch literal 42193 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 -+_1LUie{Ze|YM~3aA4< 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 bm@kZCU%<Wb!cZwa_TfbD-+|E&CvN|Llf+dY literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/extension.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/extension.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..503e4b50f84c661ba84936f21f679cbea3d8bd8e GIT binary patch literal 1987 zcmaJ?Pmdcl6t_K-WHP%+m$pJcD`Du0617cQT2u~zDiw-^&?3=2zzAtH89T`&^AFpz zn?%`DdWDaGxbiVL@f|E~h(o^uC*GT6vt6mek)NOKH}>zn_j}I6PRIY}w?BXUqe;l$ z<dx=v{sg*Sfe=K{lmwfR2DF~Dz^O-fJ2vW(rOm7rv?vjda8oa92W`+BqWOXZzVw4V z*_O_9f7)5op!*dOE#bW&!js*#6LetS7Cy{<*@5{LL7$V}-b+A0j(XHOSyaBHFaf<Y zmL{z7GBWW*iWp6>;qD&vr_l9BAOt-li|dB0h+tzXoS)g00wDJ}afx9wU)`nf5hXv6 zoP7^K;lk$fzR#h3Crzbteyl3VlM#QqFq0zZag_5REM#S&j1>LabotI^xBo?=O=Xf) z_lH%IicrptZSPdT?Tu8CrC@dZtmjxi3^xabp=tnH+x~JM%hDu8-lM@@TwjSM>F-3f z!QkI=P^#o4GIDSdsllj7g;aVF&ju!aFdEKJ#3TJU{5T#iW)B{YmZw>KAKEw{91qH* zyqDzKL}_~OQ6`r{&-FlqkEJP!^pXmwWv&54zg*b;a1x!!aD!zZ<Jtv5T$eI-Kwa9U zO{y^FyCmQ?gZ>1%<{%_N&IC+Q;0O~AaKRO>Xut@}fRMM)@$H?<$2*mqNo07XrRKN$ z@ohdzQc#nemuVDBUW{P5T+Fu{u>)6O!$=~3zlE+p1hI0bKm@_oY(+w9*wk5(6<x8B zvvPiAEB6<q1OXh*k?od?Fio-qavMfv@~r1trz}d<fpZ{VJ8ag2+~tW0!(PL>TBalG z=20eXOBa=jrM7OQ#@e#kX`Q)^@Zl770OA&OjUb8BrOT_kWBcc)#z<vsXoS6{^bshA ztcmimHdbUx%d3K&(G{JtHPqaUsYBuBOf=4zai*?mOq-&)Vr%EjF)ib*!1HN)&DInm z(XQ*Owfw8*@P_i6$ZlQWr-_+x3^AAI>CxO2{L;ReNN&JaX?EwNQ9iDsvAp=K&yOdG z=9!EqQJ(0G0}YE)&3Bej1?8nSr&nc}E_R2NO5Tf${6u2C?XDhH29dz#NGc$T+~C|I z+mt1`bY#iWiSOK5y8XB;m#iNz8|cwt&#zf)y>ke*0f?ls?NOD-bxqh-87Y%Qsbxx9 zM^{7ZV(ltqx4H(R=c+egfMxJF@Hb(=s#iDB1WWcJ@%Co8^&<oT;TCFWiV(l<fvv{+ zBF!dqsZX!d1G@a+6=wX;$49*;5)ug*hWM;xg{V^0_rvg~DoVFItuPct46hAxP`!)d z0%NV!3`H0mx`w|6;!&4*O@(WhN*oFL1iHqvE|)l#l5KsH3{|8S%g?^9wBczolRV-| zj;l0MeCO9)j;X{q((p)wMY{P6>RcNci6e+Hha1#;DBeeL3&rbjAHv2b&^0E=qYCG} z19bxi^)?9G6}tyIE+D7v-P|7R)V@>-sA#XfvT{!U;Ks$1*~g+#d0!{<epZ}FUGpMn zW<@@e3x!2nQ!Mc77qna`Ikzs}TL)8JK?8*NI$x~!=_ZGtW1RJyAUwMLv3<7hcvoDI H2XFlc6zC8U literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/glibc.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/glibc.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e6ccd6fbe2ec25975507cc6a6fa0d3d99dfd0d9 GIT binary patch literal 1557 zcmZ8h-EJH;6t+FHv(w2>e+U%<1eQppj7YLA4MIhwfJ!5TqE*#YDq4z0v$l74cIOY< zlVn$utK|)N0d9E`-odws3toXMj=hOU;*pQ7WBZ%q?>onjH#VZbfB*CC59<j1g|0LL z^KYQ5@4;}yagGW+z}U`7P6ot{-oSICKk&K7{a?|b!#g~HG2mSu!r0}vcm!j}$uWx8 z{sA-;V{<zlsw!`^NV1}?r0z4jV4DYh4f=EF>LnPBrkLX;K1cJYMN@K)-=K2KN7|c3 zat9;(aeRz^v^)J4C!H2A(K*pUOLTWh)KN>O@OwZYtqsCkJb5K_BTGfcc{XJ9L`aoY zB~@Bx<#?A?lJ=`o&}>A@O4CMxceQoDZ#t=BSr*?i0n_tZDC0l>?&!#Djmst(3!PZR z<O0!beyag<2={y;WhG6>5;jR?Qk$+6%APk-2JlL!B@@Pj2u#2QtGI|gbGMci6G|mz zS_oCAOvnHTF>4p_32grZ$=l%jH}BOlJ4v<Zouslis&WpO>akf*=Z{9ivlD)xzDPc2 z!};vd<I&=@U=N{<%iil=oz;6Tf;`_lD8z!RGu2Z-P_3&fzczJr?bma-?bU1AIDn$a zDz*g%bt6o0gg3pw3voaq91(dJ{LG4Ln-AU2oya!BRwB1(NzT32Q`?$MJx*G5A8CI{ zKw$3}=}zlS1MV*&8CpCe)!~Jw<2+>60da%=VteQ7mrsjyTFGZWJ=}Zp^QZCKedo%` z|6Pl(UYyl}X~AzK!D*%^^fSsT$jefcT2TkJU)a;TbX@5#=>v6WI?fG)^~YU9q_95C zCMG;hWeJ2pZrGXGeASdXE5w_X+jv>2O=m2trjC8N3D-B9QvA|nQt)I2y8*CS(G-b; zH@I*rugo2L;2ky*Y?fTpVH*~dg+twS?Bf6=@bNt?KLQW41#O$9-O}%<w<{XiYH6XM zXQ8}jD@o%PsD~;7(qqy;j92P8oY<2ez#;jeHTGXO1ABLpo`}TKm+EYoi&cmRuv3L# z5QG&%Sn^|-GwZMoL$?854+^zV*e)pl7&4$mBPd@RVBA^!_FB%Vt|%8;NFYg2JrUQX zj3Nr{veZ)w8J!DSjV|h3(H%(Q-OK8a>FFe66962gO|C7rC~7^w-0i@!lCo5-{*_nN ztf}cJ&2qKxR{I8lthO?MF$&jlCdMxJ;nCZ;rq)g3!po96f|Dz*0>>4RpMVEmoG3{~ z4Ln>TNu*^<S{<dWIC<Y1TVhTmN3J_{<tO%;kS=$^r$xn^Ts-r@<q~F{grG|3h3|)V H!uS3I1z47| literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/glob.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/glob.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f3e680133395b7298f8f4991d80ccd7d87a7543 GIT binary patch literal 3764 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/launch.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/launch.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b14fd7d25dd08a7a3367eea8e7829da6e5d1dec GIT binary patch literal 866 zcmYjQ&2AGh5cc0D+ilAQA=;a-L28z&ATAX`;)<#YIHf@=XYDj@cfBjy2~Cuo0!Q9~ zD^J2Z_=-666*w{8Akner+p%ZX{yy*Q+2LXK`}@!FV~Wr(^uP$jZ@}FUK%x<nSdt2l zaQ7r5BB^9w(1<D~lUrh+DY``%N%8>=daJAKotT?)#{Eq3%cY++hP%@0)^mvBV%gNS zFp^i=C@!X6*~}?FZ++8Lj%&v!P2-)nqHUGr3oW>=+s67~b`ONmMHw+#4?F>X3+^m{ z2O1vV5Q&e`26?&$QjzR8y1~13NxzcgT@8)#Ir7XWGV#4F-H<g|qb<JaZ_$RX=}jto zvcDx8=J(bN_DZ29@!2|A<1GQf6a??BE;A1He!dg;PpSsdOE(nudU197i3`v*<=XR^ zkX`viDZ{l{G`Aqp2tT)?s+PkpcaK3zNQ<Ht+7!jbfX2yGSE?vtWJDdKeo@G#gn%`z zGAlN=W3wV-6PUVF<zPP?6vbq&E3b`%Dhhl8i-ZD`y7Zxct-SEwhSUQKqgTrI<H5`- zAw%D)wi2ZZefV50oNZG`4timKr?6uY_97S8#=0c3C_-<S9_^dP*2QiTSlLMR1KFpr z#h*HFtzHPP@`bSZw5g=BE-!C$U!6`TcMJK#y((UoljZH{*>v@}E}w&4oBU(m>h=W0 zc(|&Q7qwbRcjxl|t@ALfx*i<1%Ruei9KyNo2mmDvXP9&&B}e1{?}j~woP{3&4H6sM n%07yaMd(to%{uxIAZ{4a^SY7qO1)+<bMXb1q&TJNlNA32qDJu6 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..728b7b866871a25f6e9f7f7e6664a233e4529f80 GIT binary patch literal 2445 zcmbVNTaVjB6!!QQ$D6&hUFd3|V3n#;q&A@!1VRW^YT1eh0xByNS%BquCaJx?WM?MZ zY?MBwukaHPuly4J!$>?K9{3A=;+%<-%~owej5TLw>@zdxeCM3ccQ!ZuzkdDw`#&0n z@u#uYY?$AJF1`anjnJTknmH-V&>}dua=UOsN6+otEgE5?@Ip_ooxB+~9~#u9jpqh! zu*Td9eOP<63F{`aU~N+8TchnyPyPF2A*&*tG8%l9PSWzWtnLJ2JQ`J8e(L+d%^;>! zEZ+o!iU&zmo-i)cav0DmkxWS8`~KmRR0Ksu$2kjloC+p_xD385@Sra^hkaEUd~+(F zz;L_c{|$~AZK9g1TVY}4)v#@<?MG}7C$i#j#bH(D>hh4uXpl}A7tw%MMKp?&qj<=A z37)cSCQR-@7uP^ABP0NviNHNKLW^3|hS8=DbzyX90|4;U-h))gu}pLE(wzyOh7Chu zLH`=M*aabtjLgV@%*<cRpACTAfRjkCZE{po4nt?#wz37w2g)kMP}wmb3S}NW{mtMl zP<nCP9r5%emaKac^X{O^DY({6j=D0xHRw-H=w0z~^ik43J-T&gFnwAiA3__J-NWuE z9o<YzA>%y1dADFwDkh>Um>iEJAa!n<r+tiO#3r55scHhYk+$t3dZOJU)2pxZzq3+b zA%X5;e~A140}^&x4yv}rJ<#V(6g~<BU?DbPrZ(`Rf(Zffd<$MIExYzc%jymP+ct-? z{&@JW#%a*B>fV}ZZw5`P_u8)VqNt1u7DdXBqD5uEycI>q<2YY@;adpC4hoFQ8a5gw z1c<vJE<hJJ@rY-6mVTGOa@8;{_n?dGAXd5Gq$ahV6UctZd!7B76d?OOEPswkaFF0$ zY?$c|^!v~S2Qf1;$aPANntTVdd`83`j?&C5JUO#xWKJ#{b3#zpnL{<e=<3nrec8x7 zUdkrC^XKH5HM6pf8Jq`?{Sy#b*^;ena|Y+m&AN`9-r=-yfJ8J5UXTFDz<J73$->Pg z)kIa9pSHJDi$dk{v=7Bwm7zBlEW&KpMaZ|odSz!-TB<A2ieaLtKTdPHU=kf0q4w85 zvq_SVDXXbQ`Db+%?(%V|FM#`_r7b!RYC|(qeV)f_?t-ANE>_-hciYzGpqxRPGZA{r zlN8}=!PjvQz=tc)1*V>1wTP{sT>?1(Gne?}qB*^|x}>wbBO$l}8ip5xssq}G2?mt= z7{VdUBV+QOB$@fZ_+j@M!Ec!*bx1Lw$9s=;P&1brkN`hU0?=?W_chuFk5@$4;Al2~ z7ex5>l7to*)x0f~%O;YQlw-bebTHgrMzBU7_!Nmlk<m-QgqL0s#}23ptRn+}L2z1R z7y1^NUO5Bk75i3LVG*pb>cK*S_mm8cxuvlIoHP#CXC$)#30NaaldCfVi0nTzXC}P0 zk6eBO$IO}O@5eW4T+Cj$bw0g-AsX;si>2fX1TL=-IIqY*0CO~^%H^!6PFT%b;dZT9 zr?d$Dvs8Q;wVeol1ncSj37jgBW()udq4MFG?ytjjenYQK4%#ligw`PabEIn?px8(8 z4vI5&KVvY=L(GPn!Tbx}f_mB;su5u^0WEG}IqM&B2c@Pa{yuC{&DEF14|b<csm`*} jIL2*}NqCDc%2(N;yw4Ua{5d9;cHK77^&Qi*b~gS2$23|R literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/monkey.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/monkey.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a858869c0d564ccea119456ead2bd13f552fd13 GIT binary patch literal 4713 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 K)vJ1EJm<eC%JSX- literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/msvc.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/msvc.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6300d83fcd5734c3a2b81e1696bff8e39e7d5b4 GIT binary patch literal 34540 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/namespaces.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/namespaces.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2687214c9c8ed7d83e574b231604fcba9f93aa92 GIT binary patch literal 3690 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 a6?e4%i<+pLgqcYXeOQKXFFC$*ZRbDLjJRh2 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/package_index.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/package_index.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13b937b56869e31b9f734ad36f5b528dee0cd612 GIT binary patch literal 32843 zcmd6Qd5|2}d0$V@J-a)5;U)<-0fN{eu?r9Y4}pvOAV7jk2mr4kpxN2!-rbp<WAVBd z*d5MNGMAPpS(GK&mR+`@Qf!xF`BYp<%JCIhb{rqE<0Gy(U1i6v$ga?3E3y*X31VCM z{k}Kda{#nt=btPvZ(hHC{rVl>{eADvp`oG7AAk1WUHg{L7{-4!y8dFwpTNice$y~) zBX8Id+pI?N5&1UrrhG^9QTdMLWAYu($K^YbPsn#NpOo)ZJ|*Ajd>Y@;YNj@jABeEc zSaq;Alpm6Oyqc{I=Z9+}`H|XaezZ20ACq#kI-Va#-9&X$ZF7EeZA*SjZEJpOZCid@ zZF_!uZAX4b?VkKSwR`jT*6z#SSKFE2S-U@ff6dBUwFmMKNE^xOcx_jHm*i8`-L(hv z4@y2=-BWug|B&P})xEWe{DkBOs=3<3`G+MxSbe0nFTYRnL)FRJRDLRAIQ#PloM`1y zJG&9dAC%lM(nA|&{;*t)p!_k(jq38s<M}7-vC5MhM*cnaxV_2VY;ReJ<&W4~^H15^ z^3%?A<){;>9J5V(`!}204QJfm@wS;iZr@|y`=*gUVc%zO#`j5kr+q)ZPuWk~mc8lC zNdB~a-hRN|h1?nYg1y^*5V^Cq>1?;n`KZ0e-h%6M_A~ZF_Fm+kwkPZyo<A>rdsz1^ zf5AC#KVt8D(?GAEdD^fi?Ws2ndkUj@7FYZ21GqZiJi8IiU&QsJ_BgJ`ogKJ-PTD!R z5vk1NpSKU$htc*W`!V}*e81Oz)_%f%5^ue1zsEj;k}G)nDSH}EPowRtxH@Vd!__fo zwDJO4d(j!Lyi|F4K4KrYPvE&%?34B>JePMaJ5OyyoLA7lSM1aF8I-+hpS927`<iWD zF>)81yDzO>x?mOSn3l3~N}jb`EG-om9LsLps#hCDyIfy*hcG^qi}>+ds<`YT6Lrh0 zxtO0=QPpaB&L3FxyyZfvT6XH5KUiwi=gSMrMddomkJgIIxgme(^!c-=pMCy?tA#Tc zu3Ys8&y-zHmFHHxa-;4KoVqY`^71SCR<_<ywPLm0bPCHwZ_yvP^85>zPoLE{2hP@S zmQ|x(<BP`T%XPb8ceUjDX}37<6zavA;}1&qrlVYWhu0{~m#dE48o2D-Six|mnZYw> zUp#y9`Ahl@sk2W%Ejf&Gz;&wycV&6Gp*#+{+E~C>mVHOZtL|B)8VV(8PZjHKwdgsx z7+!F^La|ycEILISFGo>orS7<;;xcc?Us`mWYIFPhoP~v>6R%F5oXi&|n+GP}Q<!?> zf$NXt9&GMdRL=Z0_u-@Xyt;SS_2Uz-zHjfYV-{{UH>QggZy()-!d<&jwCfmh)5uKk zFCM#Azve!2Z32}hjvw*LUe!6e>$x+JS&Kz?ahKf8>8D?P-|_2@TswZGSmFX4br&1A z3N`z&hl;i3r|j~A<9g^DI#ryUzy8{xgX?$=Zp$lj%`tTQktyBl>#rT$x1KxFyno6o zs;PyhCEs(+gOahPn&oBW7MlLxB@I^>>bA4$56h}G+`@cA6#zv3xPVJxj^%}0<$Ag9 zdj95e-E-8k!i4Jjvas(A0~(vtuH&sNdyPib-TzuAKUFBSSG-VIw=S)Di;eoEhSL47 zEw2@7#Y#i1zY|3hIWwOMO8iWxiBg2%jz4}6;By)u_aKtBjAv9LEui}qBW8H!QbvKm z@t+5h-ZJJRTX64<$SX$Od>IS?2xiVSADwA<R?&Ll^2L3Yvx@Nnqb!2rKC7WD)qzCI zU3N-GtUW3hQ)76YAD2n-GcOjaD~<r0+KO^OQH)hTXQ+p8dE48+tjae5efw_~)&BWL zm0-8Ow6x!=J~}_Qdec7aK2dnAG`F_&=%M-Mty<{-{ub){ukK$iFHdr&0j`sWYfjU4 zSKa-cndr{8$wC1r=d4aGulbwxigoqBP*e+t(IGd3#E6)YOeBj`P2eh=)Hp6U`!cDY zN2X;|j16NwVh>-7uAA%8^;j!X0pHw+s2`AA6uBo`<a;Be@av`>Uys%6xM$i4dvwE8 zbGSQZkIUVt)ZEln^Nh5TK`XDzz0K`=gJ@+!S{bsppp_rM-L3Yvu2zJj;C-msGF#DB zY(9!5-O)UH8L+47*2G-Vb@nZ<wIMFY^_-Y#)SZ1yau$HwT5h;*d9LbMQ_iYmk^0Ou zW6U=*Q-JeB2bq6|GY0C)>t<S)PcE;$GlJrGl1wOCG_$-jS*+QQAC{-GEKG-G&7sbH zKD`OIbJ3ZZnetzK?Q35ve}&2aM)J<zgqL4s?$3f7>HwaQ%UsltR~xrLzf(@#c5jtI zh%<l_<w-sl_hTH2dK3@%F;0V@04`x7{Ma%Gp#Y{%_M(c~iR36g?t@5-XeyF1GXRgl zNCF@JOY~gDA|bq_Q9pr?z{@H!M8S$lBwUZQBG(ccX4d2DiS?x1!#Y(US#3n@<aX9d zwW4-($y6`5Qg)2reYH}$mYry&mJ({YmBP~rz@K@|Tu-ehTd7uZp1d+Wb33yC9TJ7+ zu-jNsB?s%f;7rvW&rb#1@*PNi#_h=NcQB`4d*|<v<l>5pr*<O&Cs0+5)XA0ljg^My z_;Gi+TJ~~jKT0}Cl=oae;g%M`o$&1_J*i}c8QjFIgC@Fu{Kkr-*8J4GDlU+XsmJ&d z(u2;l`y*g7z}R`PK22v|z<rlcWnj)nB3tB>LaLrYS&5zJA19oj5<aet!~>dcL@*&h z(A6CtXdMtDvJpLFT+aYGVlRRQ-q`Vy(Tb{B&#XjSK-%?qE3Rf&AM|3V9j`#h-N1r* znA*2vJ<nZ!$*_r7vF6!V%1+g`&}*WSo@B@+9Z|t*%vB(yxR$qA^sHKWVbQbZ93a{X z1Q?VEnN{yWk3l3e;2b5#cIqW(CYO{E`kT5LPqk4hiU2Z5rho48$)}$?J9E{K*NR?g zQQePL{P==utSqY(TTG}^EJ|SoigppmAX9#UWie@X2HCzPQ1_v179W=s-7p6uV}SIS zd}5JpW+}>I{P7LM^wapbUqS-P1eyn`wWS4WXlH~jVFFPaBSp01tq9=tNl&n$6=|6p z(FHIjsgXd9)pm_lFN&p#tYc9su?@q0-vStuEMc?~M_Iy4+R3ekoq9VKKA*<(KjfwO z9H?@P*wu>J=29A^X)Gt{Vcg5K5*vvt#_C~j01LVgxPsobl6dy>?6Wt>{D7f*F3(9X zuNXHz|B}I8<OZ5YzTqV&m9ecx-C~B+r<s}pq)^0|QInW4($$59+mT6RZY@?d7{vTk zXPK8(gW#j(!(^Lmt7qHKt~x>hb3=;EUXk+nL-VRpD+Dd5dr+1iD!YYJqXy}egk4=_ zWg?a$!4*;`u%m>iXU@KS_3X@*3(wD7fdJ{$b18KN)%;X23U!H>@mmxN^C=MX0`I8D zr4nf=P`Bnsoz**t>P1wk<Ks>tF+flOT;>P>EQNnDa9$H>%*^6W7A0n6Bu1h;Ms(-1 zA-WUoNuvbzwjtvQd~8IB$`zn55qE<q8VOJ|WNY65u7(R&6tRa(2cpOxD2i9U*>Kf4 zUcG`OXM(1+<#d^vK7{JU;GpKW;z^f7FiZ#>1$>uCzxYSQ;!2e8ao<1^AQnJ6I%udV zkLVSB(`Y5^m>nmup22_t#8Y-0z&+zZ%m4}jrR>C3W5WcfKM7Vtss@D~D3k!ACHWj` z$aO2J+rhMf8MWee^6jKh$Wx$nXfu~;{@&A0-BFO)tYQ`Pybf5p=~$t>D`d&F8uM1M zhYU7Eg2-en{6VaAj#%Y+Yc>GSS*z^g0Zxj$=6X&oobP?sT4Tk6n7;z@T7tMIEzHg? zFD(?5qY14$)vI|;<Ys4yZe@~K0HFib5V8z}SCn`Skl?Z_&45Berga|B7neELfe0Ny zmdnZC!O1tSkF7_@fo&|rhAGp6X~d+M&GhoxHT&AsHT%ICfPtwTMT*Mo)B!)T+y@D_ z)6)x>#MNbW>_^$WephoMoWyRWVQQL_RCSL{g%7Ex@YIZ^5>YS<5nre)3PDh>^3@4- z5?_9_SYPwwQ1TWW^)d=HZHQGG<p7@rb~U_`Uv`>ML@G7M<e@MTnTY)5Q}}3pyd@K{ z%$T_iX!;<~HpESWaTK2tYZBW%O3P-;tdODu;FePA*y`0brkVgp4WeUU%K*NONCebc zX8EC)jQYOShg$&e>$@mr^Ddcm%UnvTGpHT!s(l8as#oRwMKEA%rCx@_VL4S%n%#XC zm@9=7!b3wr<CwB8<5q3XQ2^;`SkZDoW-Zro>Qghh1Plj|mZC-5RvZ*qZR4in`U3!2 zV8J{V2zq+~)V1yvp_mj3cqCQEts*F`A6;_Rp!%S#e2QrS?fA)dm;A_5-wgZ1y3+-A zf%SiibGQYG5lcYgOhNuhMFv40Nib6prEupC&}BbeO%&e(hJOfJ9#j$Y%@igNWD$TH zZE8Gt3C0l%=(kcAts1HwwFFL3kyxY$VYw@%MJ>K~iw^3zD^<}5g9?I0je2!W&)ga% zA~%?RRI0gCQiT8^e*umWp4==F&v*-X){1-#M2s{WmKzxw5Ge)~4btV(Eq+svWM}oX z5hnd44Lr+^`fawwh7Gg1vptJ9sfD^7L~2(><E)r7)e64UO(ukNluLoMJJi$0zsGG& ztrMGK>K3k=6Votb9J~JTHCH*+JB=T(Z^-T3u@EsREb+s6aDNHO>P?ariYx%|ML`jB z!+^{R0mh4ZF)v<$5K~ER7!?>+LE)iduE%W%GD`{foDJ}YI5oJs&r72f$ggN+=ep@- zDg%|lmf;Nn<+2pL_@p2d<klO5FBz-n?G);sAUaltMe<F6C#096>UFd=0z^w}Kyq%G zxPJH6UI)S@v0Rzv*>g~`0U6b!yA~TYXBpPGU1Fh=qCnHwWmU`dB^Nxynq`$)(0IZM z;SIJ1_jY7oJ{3H#j$nd>)ZHGM_7;zwN4wS~Jav17muK3xK0XN2tJYY%$%IN<Zq$!n zK6{aTxo#6o{e(!xu3BUjE&}k{Q&44K(_0p$P}9xW`O9a|b*Vo|s5m5=erD0D!AwzV zfN(s|=VNS}>P}IW79p&kl0uG4cz_@EiVJ=e6OfM~as4O+kbZO@7keNCCGyj1L8j;T z(T-rR5gUPgv;(rwNMx5NpFn*OTJ>Sn2yqE{gV1~eA9n(YW59ZE&~gu}y@(00+Cxl$ z1vL&WF^TVlox-xE{p@K_Eofq=7oF0QqneilO;1|&6_7(xG~BbG*72q$0Jei3J5*-c ztbe{(qB5g&HLhg)IgRn`8UOfA4tp9O!J{^%J|xvB8=P|>Di^IeFuf&85mZ++&vwKZ zs7VNG&S+!>X>gtDydRfG`e!yakM{nOZ<8*>n&Z7=o#OqFa<Xf8>)z?Gdoo2bY+5GC zImDiFj`W`r4M<HHT?Q|<=8G`2cDj2tpe^5mm-Kft1;Jb%{Xbn@-P+gHpiU`@O8n#Z z-MYKd=`I<Xa%cv|($N?KtfN@2yI7oq03@RcR(FEK5>YJ|HsY?#!Sn~iF;)g53gsuq z0y(FM?{o&(UXQ5a0R2?(RzDR~?H_bPSBYQ<dUfK>&3!}GHJ}6gse<S}g@T_c6lx87 zrRpFLj(cOJSfyZ&t7M^IH%f(qdK*1ZA7k<fCLQrba-{3(BS^l2k4q^#6^)sxL@FVr zB@~2zoZ=JsxTlZ=C<PaYm}!7W8nF^iQll2!6{$9IrR|iR29jm$j6Hzw0ecY0HslYS z#|#IU_Uy#*OVgZk8Qd{<vG`~U$-#q%`E}??`8xR6<Ggz8(St3RvU5lI41`ChgN}Xd zRT#Qq?gpFb0SiL=Y4-bGB%tF)0g4ffPv8N_N1+58g_ziR!DQopI_!g=WR|XxXx+Kx z$9M%(TKjc5y}If<(W?3$CY`zEv~rnX0{04qVXkTdMTS_)nw!pdh7D7<t`xFFDnOiS z>GCmT#L^|*wZ(GUGTj|sbOV|<tgbQ0ie!PX3%Cb@(s`J0Dv1r_V_L9z43Gq(z5>4x zd<t!)Z%s&A&gz9Si<&ZOfrSX8(X1ocq5kSPdL*#nC!sr&N~<?f<fnz3*yWN3mr}G; zb%pvX8dik(-!VI)lY^CP;_Oi3F`^?N<+LR-?VY8dayUy|)No;G3!?>E3l8vB(kg+) zG}U+G4jf#|phFHWh2DG=WqrL7EV(~KzDRSVdx`F#i+6eP20LIb(Zq-sNA-)-i_WTc z#0Y>un7RwW6Xb+@wvG6G1HXgN5j?{8k8$9D--@xtpyWciMfV^ga0wrTypfu<`ZyAJ z^4x{~!ILoTVF%c@0pmh*tb6zY;Tcq)#BKF$Oun7TED}FSBMNj?^-oyzX%-EXs?afE zU|Ve1>a#5V28a-qsB{1dw0tCDsrcYPDw>Ka-Yek~{z*r1<xb;?fD{RLe^y9N1pNJ? zowhUZqsHy$Y!Dpe684NeWM`2}+Qaq;2vN!&wa4(CrdL`B6g<;Hpq{4}0W}Bh?e-3o z4B3}NX`n|sozKD}y%VLw_Wibn?-B7r8~IW3K^yro_?{m^`MCXFd#^o#b~f3U?VSBE za+|fcIlsl8%x|@)?ER>>%|2j1itp|A75kul2(@<DhwaBua*zGE{RF=6wV$-#gYWz7 zBlc7H-f2(UNAZ0>e7slfWA^bkLC*3I*eC3hDBWeBvQOiCw|&Mwi|+^RbN18t-UEO6 z1$;mBA()EtdjTphC{o4dQzv^Zw2<SRRWLVLW8w3xyVfmd4weJ>6h*QL#8)k&ZlmMa zJ+goQ^4fBF3g-0vZW$cW+3!alp1E40vxtA>F3eL@bO}Hr=|dB1#Xn=V5+4Keqbf|3 z0-Qn^&Y&0_w*s>Y(K6GRq;W}M@Pr0nR?=R^8vqFe5riWiGJaubfpxR37&!fKWu&26 z(PidFp>ii%N%cYG$A~GYHD1qnn<|?tTbLKJ5uH&_qHnh&t=v{Mgq*;%7!&=pOpCZW z2RSWu$L59W56(L<HV0QjftyVxOwdGqKU-R0LP=Xu71c6v0%A$ymg^_s+Gd+-Gj8Pv zf%nCmkeaA6=d&Ucmx_fsSjcgmX)M$5M1O#v(0QTIev*zn_<eoK=)3_#r4WG6p;14+ z*l;~JpYCc1I(2z|tpFFfqIJhNmu}^gE3P9Yz5Gn(VUifS12v7<802s&;0b=4Lb#D; z&F1EACvnK%&V@XA08f(}3WNJ18YEAy7|`1`wM^LZHc=3UMu)OiWST}ytgL&O^p!aV zqrmhHU65Cr^{MyaE==jDcbRu_m4Ge?9S<-Sbrsu1%J(Gko)6;b6!K|60pLcr7`E^k zc{j}9)AA;iXKcO;ZFSv&`x18s&?fG|V{Fn0BZi#+81_F2kI5ifN#J{^lC_g|YQwAy zZx~C-k4F@2ij|QKNUhRi)PyZFuA$T$YbCw$4fEp|5Atyhqr6s!?eu!8jxw~k)rLd# z<B{bvENdkz+u$4<Ku`EyX?gW=Z+m424fxP)C)U$w=bp;Ft%P@9D_z-X4{AMlJ%f?l z-$Gjv<KvMV^Y8#gDi+EfVC(AVyj>XC5HK=oXP2TZ!M)uWd6Ms9?{mY=>9aH~h%J;< z!79>-85)=ag0W9j;97AF{vKFXR2fzsSXE}OHnZo%{X=~Z-gCE^xs1pQDo@ByhpMf^ zU=7+c_qeFF$F(LWtt(W6+bHK+Xxpm8S06Z(9)R2iHMPlr7AkL(-rBO`8_gsncKBf* z1p`}Tkc;Oh$_ucaIwJS@F>1BtZwGYd9#lUBX!SD~RpAOEV4geckH7~}a$H0{w2j<; ztV#zL{X`N^Q)n#taod?&Sx`TWGL7_Q-i=Y|@KZ!i(hjX7C);5reiU&h+8-M)RU5FQ zK~XN+ex?kQEj+hyf~nWp9vPq?m)Y>s=dWJ9B!LAG!VqO4{zX60R?I)Z>MbU_nS2wI zH<*aVJ`fCqT{*;Jp%h891L02jL&1Hae7ONlO-`XAwHm#C7%0Z>`Y{hg-;c~|kJ>l0 zv46#6hP5$2^?uWy`W4(cMT$c2i2<(%U21SE!{0$6kS?}Ca}#v^nCSW}W!VVo;7(*4 zzfGC|2h9;PVUD4UZqRM`Sdr$o9y$~Z1Op8z5vdS4l29UwM;%eyy%#Xfco2>EbhgoD zEi^~jLZ@sg5vl`!>IAOfix5oPA+$j|vf;RfiPoem8s61&FBx#5k!sPe`cb?i6VNGd z0IoKpG6Vyzrb!fHV>8VmMxKaolz4HqnHEH0K9^P3(P?qJ_z8(h!79KiSoh;)7m;9G zqas|@@H!_6pD0p4#V3Rj(ZQmAmdQ^u5xztag}t0S!#C&aegc*as8;$FF&Zw_ud{L= zYha@*T*xiR&_9ahljRtR>@f9WHSfFYas&v}vnEkAB5N{-47}EDD&M#lY7Ha=@Ojt- z;m9;G&oLKaB^7Xk3N3@UXGiG6QPcEB+i-fqVt3gCMHDKHxSl#^ImK(C=$z%ab|BDx zRdud5XENF=b80Q{m4MJp0LX<^L-QveeTwFAi;@onpSiL(RbAVEa8X^T)nCyf5-<ox zkK9xymsbB8;}C??X0;#XB~e)8q^ML|c}a_Hd-^qDh|k031Ehj{0EvLzQ{Tsmee?e_ zDEns4{|GV$kYEd#atxjbVaVe>GY<p+bqW<Jc7q?8?}NzDZCIiAAM=B-8CuDqW6+zn z9@t;OMMKWX`HRkkW+N^gn-gEr0c7ASn$W%?E)LkxHf_|kxkxmtn)BKaJ8}arLu2qD z(E~h5f<aA6K>T;nlE`2vC^CNz2?!uUCf52Vql8=E!O0+c(}S9gG^cu|fO1v=@6gu8 zjxjv+D&<ms0+S8xwu52nclchS3gkfCk*GC4$#@z>NBToOjkXmp1RshmR0lyKzCc0z z3SZpUaX;JBg!@U3fkLwZsR~ps*1YHM8AXUde1dYTET|@G!GdZr`CISR3uzmk2+^{X zv?0V`yf)rzTsB@Nk%EyN;!ISXp;+9C!32-^fz@LWx7*;M36%&I$)F6veC#vk#}GeI zAUR7GhJb8Y3LqeUvuvL$JR@Ga+^`=b8|<25p-V!I{s1G;BuV()`*|r&J6a0F`K|_; zdzOh%t+u2~z)-)BB%fBrTU=qdrsDFIPjTu=4)Z!vQ1a@%e4-Db{s?8C=KNE`HX@r$ z%NztcrQq7zMB~JccVCHcA?UB>LJ%d~-$T;zI)PuDC-<P~1`~K>J+@}GqHXtI#EZkj z0r^!+XPi3tD7GP1F^O2kOFCBZ6_mV;52JO6SbBNDQ+{*xWrloksnPN?@NuU({kWf6 zPa`Y}vMdnqCt7Jp+CR}ss2`-C8`Ll{Z*DQ3fQD4hyd`oi-;11te_-(xI2UDDF_*J- zP*<4D?KBoNg8*bL5NQLdmbBWQZwXDNCKS>L(g)(^I46eI7{CZ$g<+_-Jd>im5OWMz zm)fETb~$_^Am}9ZU;*kaGEh6V9YQsp26MIJ5(@^Wk1i+SvJ)H>24hx+HjFaF^_BtE zBFhCpim7IFn7D3IS^*RgRnzF5HiQ8fjH>|MncQ$kQ0n5G9F!*KCzumhJ;~fK6Vhe% zBS<7h6)uA!9EO@1jG`3e;x}1?I18`H61*hP%zEradwDBH3i0D1T#A&m%iJammtkPd zi5|ENWF8UTI%JNG$e@~0#DF$4yMY!*_qdaL+;E9FT1rM&@DUtfWGsS~VB-b+M7I!) z<1@`2(?KNj9(OkkvS?-3u{|zBjP<NNfaf)`M}+^uTN$bKA)B9?t`=)^cJbJ6b7XkJ zXzu$)#t}TG{v{sax_kiNTGs8X#y7Dn6nNExy!<eeXPA)T`J;6>KEjA&EuRZ12CMW_ zmtMJap@8^nc*j=ea+!_<tVG29Q#L~pSN%68@36rn%*7(yKgO#Vqx)pc!Gdxv)vqD> z5e}GLGNOaSBVbh)m{o?$3W1ifeK7<BA@B!$d@$Nabb1yyWalQ^!bhk-p-z^qON?bO z^QB8bM@HH~t|6O+^QvJ16eQAQ!p(_ygzgZ!-08pJoIE8CaIp(<au}u34jZ<ou&gPW zF-S;(ne`N2-nY`~&r$ZDIA)^1fzg?f=FXm_zGErEk#SV~JdKZg1PMomPXu`Xa4VuL z<Y6EH2QtZlp!kabPcnuam32rQP_{J(YCe7igAl*IV24EMz(KUE1Kc6+F)~K9Nw2ts z$+B)OLi)-f=IL{Ix7O+?uBo46@?|7}L*V;ZKrrqf{r^DO?{oCzT#VhMDg(nwzsV$+ z$)2GTqEF-Fk{@y~_+VKp=2qAb5YeQE$v`heFToCSq^k}hp6*)bGU^B+jToyBiAALS z{5%MxaHcGTHNFd1-~o#r2L2>^0l}8z)+*z`N<G}QA(T%2Jnz++Fu2YigH{fU6)afr zc;G(_j6y!!)8-F!1)*!-K`&266dxV}%a)xj?w@cXvuN0eY(aD!KN)j}*@q-OkA$3= zb4lt(aB?pr;TUO&!M9kOFdzFEd{L1&GDHx-y&{2{Q!Qu}s3n>q*hUnyvJ;#UaS06B zp$4LPBhhRV(93Q(uGk|a9F<C25{?rDjF1NZHD0Y}h-w%-?<<Jf5Q8ktdUFh(2@Lpu z#rrTnN|Zn9P-X$rr4eOATRZ%GGFd`cZsXoxc4mkAwAPr%BF$b^K)<8J>EK^5Edpj2 zQGf}MDFN|^a3IDsObMb-&qEP|2MSvz+Wsfx5E6{~Fv_AVUC9t+C{l1MMLRHfGIXN` zE>?+j>-9i|b(%Y0Y&(!?1j1CxL+%RV;a~!SRp<$n_4$~go9UZR-D!HVKrmrUtsS3% z8RHWeoz{In#@rW~P|<+#rcR0|TQtOpqYm@lIVKX>s68sQ8c7U*dLN&Pdh`8(ZGJ{- z6zDYkJFbRElCc;NUWY1WK>SRzxwVJ<b)LC9@)MI*XIc~*&uP@8$<aLwBPr$^M$W^K zaA<6R!BkA7$U&+)0gx3xA;2|3U<aV$4zGaH)ViW@0ob-R3zp~320;e28E7ZKtukmM zOlob&h2dK!T5C6sJJXC)H$8%wk00YqiN1S?IT7aXWA4jH`~(A&>UMzhF~07u$eu-1 z81!8ryfCON_?pIcU^(Mo5hoi3OYGH%dY|bLW<v703*F!hsBIo1V~NVV3e3Q81L*lM zn@^BISnMENAh7Mj%dQ6<%mIy)6VBAa6pWDUsc5WjZU#6jlhCoMaOeT=?<H#Lf8o}B z99#k!18N?SbW;yVv|ks(14lx_C0I)NR0x%^9V5a>ptG5XEL@L@nFElZuizvE0Rzs` zAP#OQW@mE3=uC6>X$F+m_j+9xSz+@O+BH6@=Ap0>hYEp!{-Lf4)`T|d*2*q+HB~WJ z$H^<}=%410!YltLFUbab=vs`f!n@iv{t{Jpb9OYxgd`M=(cBkl-rqAvce0j{)+f<K zxcKCqv?qD6ZMYRIKahj8U6B(?Xg#e<Lc<wvCbqpmvw}tjlu<LNnS{-s2*hnpF<1su zLhy)abBrZ~KZ@-}+V(u*2wHBY)LhJ>I~TcW0a8WX-Vb6HSjVkd?g$g~n}snI<^sfn zbp;?=68?&5_ZD^Zu!X<&GqigHL5tSx?B&jGv{?lI%4Q4MrdG5V+tm(80(W6n?`aFE zE<irq-lpG1#AZ-Qy9H2DM&IubM8htwEnDBhmL|$m&Xnkb?UypvMh8RRy^Fai%epYn zxMZ*e#?`>!9=0Yy)Pabqqj!j%=-6C&VWqL+V%(y~u&a~p&SCV3IJ2ZD=ziS^n-kBb z-p<J<Cs7j)i`m%%A6Y~!^a7%+y&T*X7G~^bxmd+b*;9u;piVnzn)6>=@fwUFLSQn& zJxj2-GB~JMZPXXsvW@5<j3iiKQV>k%RA==t;PwIvFTDHAa39TG*Df5-*ISi+=my1E z@yWMAN>4HuSz@#r^I>a6$i47q5<Fx}OnZxOSL{e}9u}~0SgfeS$pf&3*^_g_zrGO) zP%$pHdlMxG2xtdfH5A-80&N-&#FM-hHl~pQ(};-IMMiSl8fd!b5MZ;f4Mkn^4h;uW zxH2cmqkCo%8iO8d&lDG{7wom3!^k#y*Na6}CbU5YYbdQB%yqy@70cY-g5Wp!zO=Yu zHA<xw)U;Ow^MW2>$~sfjQO3oxH3P%`FM?9Z{!!tj{t%+M^iFQkE9txGQeffssTTw~ zyKHH{#X1vAeiaG!S<^+`v(XydnudP0hxZej;HWdah>M)w*&5Za$x!{8BwgNyj4?)m zCI&|h-7{GTIASV`^f`iq0hCCQ`Ip9rTrY}``-e#0lFd?}onTUB<HKNH@GfRPWPB*{ zA@f7g55?x=q@r)q*BMpkQ9D95hHs(cU~ID0i9UYVwq_B%%dJkcES1<@l%pi2-oO(G z1I4{&&_?G;sqwwCr{sI@*0S9HBJLo3^sT7+NjtIpQ#N&|XvC=RKsl^p^oyc5Nr+rY zaE<ia;0dx(f1udHV4oMs9uU%lTkcBPqqAQa?)*v>bOMskf;HPkU}rmYqo>%atw2y~ zQ~%!GAicaGa3Xd<57=49{yNt!sx_hTfL$WNEU0w}VE~YUX07=us3^z>K#YWhuG?_u zeK#p=i-THBLP#^KP9O>%HrQOCS+_+8P}^G&6G(MKoU3;5JkWIP;4xR@dEcakWU6;M z&{YB8eIeb@oz_^~Gw*vz^#d9xgkAbWU$!ILZEneKo5kYI4wf%85ch_lR))%v>T{X+ zg4x*s#%0${o7hUEDQ^dz4LjAn{^$q2=AeTCztsb-H^S$7`pxC&8{_OOH!SNh1az{O z(?}=vKB2xvm8}YQ*{TUAKBPT;BkZ>*DKrm>Xbxtqbptrq$?%lW$rtL_zNFW7)`pWG z(J1gbg>Mbp5|C<F;0{>*KE3Y=W=Ys#C`J(K;0?D{WapBeYjG0MFf}_Hwnh=7=+S<q zyQDq(b_d*>BUi*B!zI(2;!G%5(;`4gaU36sPlEZ_0KFJ|3$onm8=xXk6u7VKx+g9y zs1GndKl7FWYV%CXe2W`!wt)iBHXz<!8)YqX8diG7=q)80v)u6G#g-z=vu|P7nn<2} z0;*Xh@fN(qlqXweA=#EFP3&`sK&*#pnwI`{d{XnFD@*0&We%Zx;s84B{bHCmx`&0U zK-U!+T>K;)nfMsB?}Sub?_(Sd0JpPAlG?CVd&x);7mK+48`!~EzbVECc>5V=gwr%i zxR>cHvGyG&U3SsoW&qh_tx`~dyKEF2Xmf!K#6pG+%UE;-{(riPQ*aoY*jzqB=OuhC z@ZL@K2>W+3vW{t+%1QIcOe2((wXukJb*rJ4WX^(Z5*m61iQ2FLqr&!L&sM!a@`0cr zR_12*6o#!)Qe5y6nLx&TCbgbJg-#oGL<ywY<1>~6@md+o0c>W%b7|0#N%1osN~=aW zOT$R=10sdA&1AIpC{CHoAk->W(d~>dCy&VtivcK!vgbLu2k?loiFU@Axn(;wCva+$ z7G}xmyi7PPvA7q#L$kVbvcq^j@^0eHX?)yWNQfWQoh0Ico_EGWrPWSEBas8r%wQG| zv2y_jB&~x`_7CEGXU<-_eD?Iot7p$V1$v<6>)F{m``Jx{>y2CBJBVZ`QeHgQP$9*b zgE<iq6WCAL-V0pDK7MdQ5trM0B1vmO*y<wVTR83p{Ew_e$XnP_4;ulzkV*w;1(~p$ z*av;l+EDkMur;l<bqE)OnYpeS+;oJ73V}$ChhQME@(@;|gKZG!DEoa6K|=h=DPkJD zm}7V1RcH(hyqB`Ne}nb{e<f*@dRWH=P=kiA5=S$@8E5b$fsM%Wz6E1Fj_5pCq2<U1 zpL@2noq0VWd6CmvQ8<@BBG-t+(-InY4)BPqbpW%-ZIGngk9dQKijinDN>$LSv%ym~ z_GH<p^Q{Nr+e}x6A$!H?3dDXb{XHr*$7J6x%ID#^qS=eIR6Dw<uVXx4@y6{mAU7VE zEbA$hAR-RNOPWarIuQ<-MG;xA;9KHd7;bt!%WZ_PD#85z3G)Vw0vc5#>IGE8+7<ET zM{K<)vOGl9+nH(F*a&;aewfQc{*y4^6?wR4X+rtFL+LsXYEK&gfEMAD3+0Ju)x_pX zoUH?O)sNh2UJzkLN+fQ<LVzy9V=2+CENf@@1l6vid(^(b>mzxdts^^3+@r7VQP<(> z{ov^$ZAD$GH?+BMyDrt99{YesocS`;#XX8Xq&4hgau;D0ZwrWgE$MS$P-yROhBT}7 zbLe`)_2D>xH>!jPJ;;K4RC8JP1Mj2wYGDTs8VoE1kS?*ohcXJR1bgo=4D1EbnV&Bs z!nt9=xIwWyRO9uWz~+ZtaGu4@$=KlyC)iYOlX?!5tet)LGbd`;%glASC5^;>63Q&c zC4pA?`#bYKg{7`Rq?&Sy?i#4O*z?s^EFL)JBG01&vuG@@9aMkJc5qY|LrrM)6+puB z@|+PKBfxl}z#B;$wBBhUOkjqWzs^KD6SZN0;VaaCW?3(7Pzl`lL4w{v++^@SBYC%g zVIYVL8#1z@)X^b{GVtY*h!tg65pCDmC;)ZK-2t_1Scut=vQ7Nad`IC!hzU1*kX3Yo z>(-;qFEfHf%x3h|Nk{{uR1g#)!~-Y$JmVqU8)P8Lu-!^Vqw*WPhU*4fK%)qsg^wR9 zV`@FckOl<$ei9})?C^tNmG*`}HilbiT6&>Cl0=YIC0aNeW+NUkyiptkKvI%l&#Yn} zHA2K8e60_(2Gk#b#ErKG#Ko4WY-;Cl&;Y_E_|CqTZhZEVapSWH%rGjODb69V7Rq54 z$-&_PEr!t|?x3=TDs20hsq{=Ud!}<>8+{zxG>`{;1VxlO@LypPb!0*_8$`CkPPgDK zHiIpUlNaUMH*d}9Z9H4Ggz_mq`B^6ahKX1jNO#n~W%5f*BpB@{nfpE@{-9kg$d*DE z2fC^4EW(L!s}i5%M}hl(MsE^XY&4bxa@8;J;kTLGi=HYBQhQl)gIaDm#arS#G2uG- zJ6?SO2~O02;ImX;srlv{f*JWj_{EUA>T9g@Q6{}0jGb@6{1m*#?+}(L*}}mpa7teR zPq5k~frtr_Fj>NAQ3^fu$IyVW3C8zrfOGK0?L9Ev-FkQ+MS?HDM<ANBCu}0p-uTz% z&*2~yx7Xy8bJZo8!M&V~-a)9{DEn*n9UnB^=NIZsZ-`SAz3AYV9()u}lmF0st;Tf7 z{1szuP#84uiQzg3Ad>CV^E~qG0}-en5u=GS7b{6Is{ke|*a9sf^?+IlsV7T>S_0F? zh?n6>G&nu0?bCb7cm-p&(aP)5mk~BzPoaH8*i?ql`uDb52mV6vYuBm&NxMcCHU6w! zV;|o1tH2b#DT>f|zH1Ecq9Ya8cYj;`(`X4H?n@b9(Ua|#rdkY-$3~8JTccrHFwdZ^ z(RXR<lC(AEjaLRaGic+3?G_)F7UzQ&!+DUty-RDsk#VWOC3ZVvm9RMS$E78#i0H5h z84(=@86HW}*DE;CR}lyfQS9{Z2be8vHQEN4gwf3P0BsOoem8-k85a`L+#V1cZOv>e zK_oEEr%)rXAz0XgT!aw-5#ca=(wH-4U4?L~Pqpft-$W$bhljx@520&*MyoLFiJz7J zkS7<wXcyIwqk@jbAsG9a3w812!UUpYlU?2ymywX7Uh?FpQ12`aus-(97F`@ZIdrOM zUy%-8ME@k(-0_DbFn+b<EX(;&P(`t8+k^Tf8W@oiM<pOy8d{+rxp`Ly6e;9wV&&t= zkUR1Oo<Z<Oa>J~-3(<gCd=SV1TC-DP14nRpjcM*QxjTk|JAG!*U|~ue6aQ!q#WHF< zW;79i0XzzBC#p~}b$In5aLO3C*#YpO2nBBh8bGv0AQtM}7{iGm5SuBM!}H5Cqh@f* zlhHnB4~Hhm9#IKG2e*pYsU_3pxqC27qHYt=og^P5g}~hm?tWD6g5Rm{!rfHoE}p@b z5%ptjj0m0?f*IsD^q~ky5hTd|+gV28NwCB)IICbbo*M~T6M8v1(=?~1{K(Yp$TdGw z$Y;50S=+f0kyYrN4JAiIAp+}Wy%|ID2sTQTy=Dx_BhBdI!XsL=c?z?4RUiK}s!s~T zhA0Sz*fl}vrb|j&;H5xmmt`FdcN^N#csFZVT+kugpU0#AApF7y=}HhOZ#P>z&V+&3 z{%C<4V{6Me@UlIaz|ww(bqILc9&(tu3rs|U>*ELzN{su6;18k(0>p$<?LZVNeBWjk z`>%Km8BOlo^}rawzSx)W?Q|K0RxZ+@5ZuT=uqa&kPBgqZa~00&U%{=vFO=)cxPOGb zV}syVy}Q07go&@^tN2G~=jSv&f=v3gG?XDalk^#I4K)(c3)mi&P*b=MDG-Vw+^m2i zK&L=VY)1VHG|{`AM@%ztDd#X_I_&6C)bX>O8Q>P6z~?OUFBAR+)aoazC(*`Hj!QIU z%q=h+$EWlV*E`lXL}rQw;V`SX05U^2UXQJwXz{$fCutR--$G>>?Tdk9w+D{x!C{9K z1S#yYKJ;9P%t9Umhd7yqIC)1MEf6#ItF5KNnQu+YiLpFSb`popT9a1p_+{rN_75S9 z@0$I{k><`9c-)fgn77VfeePo5#cv<J2LlyV5A}W~vrOJ(@<k@1<@_ykM>*4?f^>^I zU*Ij7S<y5OvQi&VpF-IgPVW}frQwejsX?(v@%%_$_XTzIE@B8!46EgA3qaAbM*D;f zn=IKh2$&r70qX#?ejH00=k93EF-|ZfiTo0MHUP6Pd9X}?#DV+b5K1{BZ#^lI(s5XI zztl>gKF$b2{WSbZ86Aks=Q>w-Q<{LQ;{*_Z47&&N8K@2!JcktZf2Nf|y@7VU!Sx|~ zur=5kq7Z>ljg&pq%4|ihH9(Tjy(v^nTIu=3dRBUvY2mPKm>8ho*jd~KQUF>YY}q)g zhSz~*gNTwFnQ892^5RTreuB0u#~;&>WjhEcVeo<77u>Avo20HsZbwcu&HejjBdkR4 z-i{n;-it67*xN*}MVv3LxH|?`RU22$!S1`wy=QPf%mQ9J7ijgN&p-?jcpREH9@~o7 z>A)`N>TL7|N-0BR{ZyMZyCMhp125p+FKKQq=hEotY0~h%tu#0lL$qXe*3W<lt<>eT zPObeAhM{YVhXEnOp(vo0kvRPKwyT|>*!$!`gwaOuIX)J-q5cEEW0YaAuMpdS{FuDP zT)w5x2<roP;>i_)JInQPoiWG`+aeY|r0CqQmKDu}C)-e#cvmWpsS2q$iBkyu%eWx) zLxBb@xEAjmrV76TXbc4g9-|7ch1lxkns@;*0qQa!4iI{o^u@+09s<d+_A#vROwgK3 zC3+rky$-t6K1el%gH#{UrY8xK$3PLkj#S`CE1ZeW%E+OqvMjQA5ZvUVy*`r1US*PI z9O4FF5r7o-8CeMREL%Ot_Rll<Dl5SoakG!M_*)A%ORipfoQHR_5F8p&<^qt_83+>{ zfuljDJ-WqgKG;jv@BVm5a(Z|ei94nj8kbCGRHj$LM`^@-o8*9@MTkijT}C4;4@;po zf;~^#5Q$T54VcImr5@bcBwm!*#26V3YZ0k4Gkpk4F8u<grg@*nHpnZMI2yEPvV&ut z8<Ugp+d2~W4dfd>%@{@^Dh*{QxQ{g_PZI@0eC<2}!TBTxtzP1C{2X(_4=&*HPS*M& zEA=76F_gW=wV>)_0Px4)ix>m&lk!6q?~icrP=565|NB+ASFgh2!d(|(OIY5SP)>RF z1)fd9HP8fc2kK2umTuWxgq3Bk#w4R%K^gy_=l?k7|6Bgv`F}UV$KpardGNf*k5A)U z7E=5IU19faLkMI?vUmxy{koCyKZ}~*!=9PQK$z@xOvpa!e{=^3sb9APtn`_#4vh8? z26~zQ(eI}g`*q*XO8@j--%n2Xxrq8_Y$>LG0AK25tR?02bHRU{4~WRqbLY;%Q*;ic zxIUMg=s&XMJNWFUnNYshn}Mmbs4p@3BPPGbgc~&^P*b}yZ}U=Ycn~`b30hT*&D1B- ziC>CVT`?vri#ZX+cQZ#7T2YtLn*}IeD@uVPL*n-xptYAv?ZaY(w2(|F!m19?7D~hU zfo`Uw-Af1@2_oJ}Vn7G~hA-L6<X$BB@e;$mhz$M8(Avi{hcY9Xp;RU{l6oYS$fQ%l z*);OQIOr;q+Kn2|;BF54`yNb1GrLpw;nbNV?rwpuKZ<%IJcXwDz(W(eCm=$%R$skl z<EW{Vljm^MRO{7ix2BFvBKOqs65cC+1Y>?q<0FCJpzmUvgQ-V07|<0uBQ{*%iMSDV zpepjT-D3|o4qoY_p8k;D&|jb*(p&o>0t*=ujS}h_UL3xhoxt6;WQ<JvAYd|)NO26e z#mjg`4(`(`fV5e5LZ8e6&ap-K4*U%50Fq<Jj$yBJaN6I5G%z&<Un>6g2FJflP3>RS zyEEhnugL>bk4_zI|D?p;-bapmjU_l<j-HestB{Miqo;Nqd-vz{8EoIsyE=`3BMnQ( zaH?iTPb_{aWKQN2&NRe0+<9R08<^1_4^cHOd&|PP=c04&`4N$$YtJVZ9xKqbS30OX z&dOs*80t1}QlfY>6&y=CQ^F1TW19o`+>ei(7EQ{_V`TAdz6A{i=3MOEWH>kv{$eQ& zF`;__Bq6E}WBL729PiNHgXooO4!FNR3LjN(5h{xn&co~S1Nc3PLc1=YbOmKNu|_|u z0hP$-4;QqJEvWjl=yUsrB&gYe$D7R)y;V8}%D!jc^@hB!-3c{^@c{pe`iuS2WPs&A z!?$Z3$)=inzrptg&9g~qUKi+hNaNV3EtbS!lt0~h&)|R}EQIht>n7LjG(O^C<C<wX zT^z>PM1%F~I>e2~wuvcEem;uYe=b_QfhGk^Pj=3w4dNBxx|9er{VOTf!Kp)&ho%l8 z`T*PeBn%2C=i?|7d7NrX*9mXX&$=Qn;3%cN)Y3<h=*R=2J)DOVAUbSBY_}7811)gR zp_73MxHs3vPy6MWYN__v;@nFwJYIVGT(fk@zFDfh_vl_7x_A*$(R8&gwj<FIQ>c%# zMg+fADxzhph=9afv@%m7f)^N0Qf#(IP?-#YJz{9Jbj3Pqg`GLF*LuX-8}{enM-PPc z@iPDuj~>X;;e5wn!nWE2kkc#WNk5X&cBNEDi%}=AjyP&VX2VbLO!UVO`{}vI59=cJ z%eb$2C>eyc=kS$JaIgh8pONpmHAGG2hjeATAeT7%SeomP4S?-Y-;kmHDq)N<8OESk zORyDPl?iDq3jRn?PT=zoJ@hnl8d@*OU$NReB7;B4&>B(oLDIFB4?9sA=R?1MC90NX zM<i{ZHsS{u&~D)`6w%Sw4*L@uBP<sMs7pw7JOyYGj))K5;irO^1cK5MhNh}a`g91& zE`Q9q(0C1J-FT<-;bBuD{-FhmEiz3at&$P*++Tc0_}!6K!&icwh*hBX&2pS0eDQ?> ze|M<;`qUk-ml{2<=VYA5NA|G5K!sOt;J_%60GiwPOazmVbC2wq2<Ji0b;d6N;rp(= z!TFwm<wD`l*%_`orRJWQklPGP`y_65o!ZwC0c)J!M(-rcphb|X;Km=ab=n%_RM1!| zrdV3y>w-Vj&@guZna)vsJT)XAbz<7Jh@<J^uq`A|hVujL6uy)C<N!az^8v605I;5+ zP8-|g`kux|&ITgYBwMtj3)<}w{-^;gcT|}rNI+7!{^5L}%iol1I2K{QyNLCcEs0oh zp3j_W?h%kB*j~i%qiL%6`hLWZESFU&yr)8_&@OJb%pD3s7j8#hZzkLIv89l|9#X<@ z$k6D36V6?gK<EA8%f(xIaF^tl)U@m^dh<El7iSkFkJV+wgb)zaZ?W_jkhC!YKT4wy z3vh9ie*2K`&KeOLzKYq>lmRXQY=nh2jcuOcq~3`Wgci;&XIbo09T^3OBp{fAPGAbE zo{4LQVqgaElw8Q#L~^l^5l7~>^#~ha*epF%Fmi{{P=I1GF>vjlM{O}KBVR-wC#b*{ z4eN9dpbG?whZ8*&WRs|<gI(h)(NYHz3R4e`8IyJChzy<RD4a%$NGN%Ot6cO!M=fLv zJSvNi7T6FvL!8g=2&&@e%RslorXd>#Vt~*Fk#@%K(uKd}Y6xwLZi&Hd&{>DORPNC! z2`{Jd>GF=yDWgTamMMD`Ikzy-v5bTaSM-?RY6BJ}ED^jToaPSH0*b;37u*d9>>8@^ za4|%I2{?6N>NVU+aMp?Uw9+sP7a<Xyk@QYoIEVnIWDpPI+0_TxNp=sOk1a5W!PNsR zyhx>Lkf8xQd0oeaHa{BT9JVAdc9P-nh~~w<D%nqkXkuVcTP7&NIUOuIEZT_r<*plU zIOy7#g|HY9m0$y%w8=Hld`_I*A|!QM>W;RI;<P}_P@G3zx#B78v2k&haYh`P>zh7* zm?6jlQ~E_ioJy{(5#JPnb7M!>MD|skfd#aWSQEj)9TmLB%3G5@DJ~G>H@bOaXZe<K z<1Yw=LbfBRfx&btsaP5=6#X{rku1~^-02cZu{dyqw0|v#t`IR9GpghO#Z*8aoK3J= z(y4LI!%_U=>`1R?#0QNaO!sv!$;0`{<s^Cv$LBL*3IUn}Ai>7Gxjx7^5jaK$+vhZ- z)i2sf9L*1ZG@Kv|2F>t58oEH>02z|rWm`jNBa1wa^b}{va0^FzBH$AdU5FVOY~SHq z^_{dgrd>g;VU&%u(unMMygky9$~gL+SRY*<TOVKFw7z+LOKTJXsf-|byfp@wjn0k2 z^gZ6%)Y{zI(%X~PNMXD+0*o7M9)2DH4pxyng>h8$K|rP)!MP7dwBxW&TJ}V&ru;{U z(7Wx_8BBX~yxyoI)Cp&Bmat!4c}J|hdwE=;w~Vtod8X>j?T1fxJxAG@-jQ~shBYD1 zlr|5_H4~?bE?V-3_)J5Un-aI!%s^yQlP3|$=z+|=ffuU{B%rr%@@rF<cq=~ag8&Uh z>aOr(uZDV>3E@Y>-0Qp{Tv5z>Vx6HNs?Ia{Jns5QZaU)bfDAWeYkdNSe)OV%9mP1Z z>lA9?bX9&yBnW<Xj@;4iGxtkz5$JcG6~D@aGPR#Xvxow9)%*EM=>b7m{RI>DK;ai| zaeke9&^H$k^4HkB#e;diqgcZ?`li+n=Hon;<zOHBs!2S#l_>ip+M&~3er^diYJ_sY zZ=hW^2p^L?T{dvqz<&uByqSpZfcu8-9BHLTngK#;bhD5lRb-$Rev~T$nh3cVdpsg_ zlc$Rc8ILxf2|ZX^-Fo$iNQU<H6LdP^3ea+WZw{v7V_F3YE9~6|gG^VQDRIic8VCUf zGXUEWd2Lk9aPFSxJmH+mYPtVV9$EHtoCuP2p3NvF;h^xK2-ZSFSfxdYHi&<V=(QE9 z6p|+FbSSSD+<As0Tw==<M2v{~1lkJQ9YfI|KGN<E+-YMh@EZ8a>1xv^l=H9>I@gn0 z{A0YPnwD~*K8&)g;8&MX`lnJOBQ^dM;pwT>w@@;`Yp|v{M2Av<#8FqICO8f?jctCW z`V43ij%P$nXqJ?$l7(tch85GH<Cl#3rgpms6z7pzb_5ZjJY;LwMsymk6K{)I=EfYJ zO0EyJhER$Pf_M|0%GekPT4;}gF=p3?>lu3t0D&CJa5{AvG|L-B6e=Qa)<-d_aYUXP zt!!(!HPRa0;15uZH=nqS9Sv47-0k8m?$g!)?jz@><-qaFy-vXfTgozo?q)`I@lVmN z=Ob#UdCzokn$v4k?bdf4)89PK3DknoD$P^VtbS~oSbeM=Yw#KtbbWfi4m_CNuW!vY z?6qUBF%sRyJ-NayKC5gjD<~1sA6pYx<DFk--hBSqcfK9>Zf7q6W98Ho*`0Gcjq?~m z^AMrX8~4#n(?BP!qCGyUc<>*f`%}z+CzJ1D!RCG%Csg7D?}xHD&VO~;8THT67acG3 zJIwtqlLaOc7x4?sMerm}2$bDsDvA<6bwzg8UwFO~MVlMbSa60<oMm#3HTmO^#ab6l zdmnFo8~Y;8W%=PWk}OTdVw^hl8+<aML-71$jr%q6qbgrOX?}nes0=!2wHM>~!?wm% zqS`*xG;nww=@rA*c=8Z`PL3f&q-r=Z5@FpCP)xlyNS+iYg7_8aO;8q^$X!>|9}$TK z4M(PK7MF^MDyBs>&)j#h?7uKMi%UN(Kc>VV`IR3T%G1`^{?%Xn0xC4-y3Aqzo;%8? z@C(&b^6OH10fj3i*l?1`E+jajw)^ML<VPOmm%Zed`{cLj^lrByK9Oa@&=Gwi+bDA+ zIf|N${^`HX$oXk*%8{Rk7B7}R5?)W~o!=7t;wR_pva3_h^UiPX>OVsGpU@^ciI?uX zcj!?29<BcQk*??D7X;-O3SoW5NyT|MJ>VQE2FLt-Kl}L{yBN8kKER9r&V+6Qed@|d z=3YX=p8&z;)IuRYT)6W5>1WSgEnL0u+*$m3cRpU=QN8NBxmGW*{#(pVFt?M*GfeJd zLMMv+5}*DtM8(TnOkQL1VJ078@+l^Cy{NA+xz6_Jl+Y)yk-CeuN>mWF!b_1T1Puk> z$al4<L3SYE*9FWS9+H~Y+fnEw(!T^qXMX=bGURPw+S73j@a+^VTyIcMU>`#&inGgQ zFT=KIDxKPv8pvcb4`fn6hh3Sm)KE4yIG)`;^1#UZjo_a-7)`}fgBf^+vZG@UjqFb) HQ4;&V7xfy* literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/pep425tags.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/pep425tags.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ac5a6962f137545f8dcf7d3087395bad94ece4a GIT binary patch literal 7355 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/py27compat.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/py27compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..964c0d2b72980797f91285d6bfa98c6c11bd69ae GIT binary patch literal 823 zcma)4&5qMB5Vn&x$%d{LI3aQIwG!K~-Cgy9Dx^Ko1FR}-FGNU@8@sJr=Lg#@P1W1- zAY6G8-XT}Sfmh(fIIYCOiIHafH~!}P#=bl~4S#(3_Tia>(0BB}V2xgb>j?ygV#F|W zB#tqRu5>atb}?ct*8Ys*7I&9z)nndqg_qtvV*bi0hV~@(xvxe%$UPRY6UaYd&K>H8 zyMB06WF<9XDx@$Kxm%ZIp$wT7ii|6>D00&84G7H{;Z#Y%RrnLwpxZ94T`jh$C27r$ z)^EUd2w{(wXpiqPl)<}ENWk8R4bK6Kj3$%uJFYdI^A|*MvsSPzC0TIFxY8t}CS8bp zPAHi-cUHXWH4sqNpL3HycGs!>>;O``knj~L59<E<7?nzFsNvCus%Tb73mK)W$jFP? zbh}|!dXQYF(`t2bIoo~8(wAWKJeowMD9=T%4S=6tWqil<R!17>m8K}<U(>Sc57MS{ zy|Sv$j+Bz40IOd&ooT56=Kt3v+tUz`jv!q}wcxI5+hCO)f^TOQ^eOnE2(H_2MZVsq z7`Ck0(R%Y37G#g?Gu$=^Pz7)Q0jz^pl4eszhtDBfgCo^}&<$%pNm!94Ngb4u8u%Ak z{NzthdVFiR%9Rz{u&Ukh`+n`|N*kWVXVUUYpj!#msSxmIjEWzr%qY$iO=tW8kw&AH e2W+x}ttB72u+mm&%L$y08~7d$+8yk<kMVB+Qp*+q literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/py31compat.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/py31compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1bbd77888f629c1ac68d9731563198c82bd1cda2 GIT binary patch literal 1221 zcmZ`&OK;RL5Vjp}HeD#HDh^0+$O*9$bZHCXf>0%10;Gb}ibsTGxv_Ui*Ll?TwwqON zaOO8~gkQpc$Q5zmFK}WeyDe`=9*^zuJihs|xxC!_`r-5I2LT~p$S>mz=vy$|GY}(^ z5KR+SuPCCZ338rrN?wp+gA?5u_v~Xz@Pk`s!X#|hAPF846)66WDE^iu{1qwKOR(4> z{mwV=O8T@}-PL(jT50QhnboN;ZM~i1-N|5}Y{7I_KxmRsMG~fH5-6sEcO>D8s}8Ik z6{;?*p^Cu&lErtkkG*&?o@-mjF3T&UV}BAdRwpszv@E=y`Z$+`9BI3D`tU_&Ozh#Y zFJq;R_BxhBukDev>T0|<@$nH_NaM;l8x^J1@zb4H77C+fM%q(P+S<~(xGd&=va<LY zC8dxq4on+bL7u>L7eFX-Oa$?CpAE?|eNS<x2$V>-`$5ACnd>IPiiVldO*bDa-1J$) zoi@WJ97Ccb_lejDoP9qSR5m-5UJnkX9SlpOv~`1YJn&|HxHmmiH{308Gu^Al>zl*b zQJ!9hF)9YTgDR`8Wrg$7m}@t3JyUM#22T4)<;&9irdIXldRpd{^lMe!L_%am=7l(q zC2<ghhIDrE@5Zm4Se~MRsNlQ{(}f_8$^N2tY7wSBwRqeXHy2B=ZI*=4&`&D_Lg)}w zLT8u$8FFEmwwZw)u1Nki<_0MBswew^`##X_Eo*6io)aGc?Jv)1zaTbtinYCA+q-?< zgznA6XQl~l?yc5s!cF(-&V3|8pSPJeT|G^GUFjqO<xrZ*T=Q0@`p>ceN<Bp=FG5<b z2ZB&WSLwO`13I_g?su^dNERWQo)CGdCI<DhLL5w_S=@AmP-QBFMc)=tuq!B#JHH6T zxc$MFL2-B)bvTQ76tt%h3>*Pbz&~$mTZV|*%hX8cz&k?RS~h1M;ot9DMC@5S{zs@L Xx;@YL4syYr1Hl;&7+ZnLBO0+EfyXW& literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/py33compat.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/py33compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd4b3172fe9c7ae9dfb3696414fa843e40dfa272 GIT binary patch literal 1432 zcmZuxUys{F5Z^y`;`p3vubgNL2w6qy5s6-?uBb0n)q_SY5<L(c{bM0nj(3wfactl2 z-f@YX7p{*yBOZA|LhwEK4*QCD$XDP6W*klw=tes`9?wi>e)C)Jb-VuWKm7XD&kiBK zk(X8g`aRhCI}m~hnv-aK(ug+CEMoJZ(Rjq4km8C%q%-x^9ZK*gXvCk9f<473mb<f7 z)B-CJJa5mu$fHDdB44t}hH!*?#-iW>5iQYvK|~v#x^hzz;mPh9k1l}DMMrv*i)UoA z1(q#AzaTw-1+|fb9<^L&r*LdMH?ush5~ZcG?x)qh8ZZ2^N=qTbM2%B)KVJ-#d$9Fe zASA)2A||L{FG$1%7Y>|I82nAkUiffsBxZ@za#kfK#b8``;{FJ>_CeINCNXpgVH68< zFsjF_qh&r)E%5k>C=ZT5j{23#P7)*gCyDBh%3MgL`{}fA@|&aK>4~_dZ^s{`!};{) z-e~dlEPWr=xac4DtE{?_71|_ue&g0mE`&bSeJ#y#Wy&)Dms-vD_SPluR&(pcaaLp| zj$gxan;z)m%71#>J$Fhec;UiwfgS|m)4zZ)WCG)@$%IbW8Cz1r|JLb}3AW_0ozrh> zUb87tKLRBDDp|U<Yn+KYb=9|M5&SZ_if{qas0nwQTqZT>%NE#Lx5<(>5v?gx-<$Tt z6CKFXu3L2*2tv2X(mA?b1j1|lIr^JU?bfX`_891Qbo~j?2T8KH`z({W2zTBstM`Bf zy`8X1G8K+W70M)i9+s6<iOI?$%!;t#N;#a!)Py_uuw&^^Arz}dAZjbfPgWeXjDUKu z`V&^qw{D_TGH<4A+i3}85z_Kp7M6=l+wQ~t$AftP^9Nr(8XO$jVDR*CaBzQcA59AL z+HO`DIhHCm^Ga%kp!Yo0##inTD5x!$<;e2NC>zLABMTu#3_V#^R+fVjb@H+pH}MV4 z)}n(MaQX&v$FIYa4nYupkp|464)d7@JES0~PXp?32lQ8Rqe*elb1`3$%w!x}KaOXm zIL=WI;`rz|$=7cbUJ3O!3MA1>0xME3h)b|FHtJE2Hx}!iGtzp;h16+M$=)TkjS*WQ z>_%GVIm`zprmcfl-fnz6t4d`CN|h?w`sXg}B1o!e(2d^wpM4iT8@sde1hB?wS_g5D zy3md^Nt!2GV|Un#fZLVJW+Lk%+hcGsMyYEU=s!Gs^vP$<cSpU0g}$O)>)lzSbQg)F Y-v9wU1I!En-=sbZa2PD$o7V#V7d)$P9RL6T literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/sandbox.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/sandbox.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb20e84053a20aa79b602d2ae2eec82834e8f4a5 GIT binary patch literal 15735 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%0ALNkIOhj7hz_`dZK_44MFr$qHuIJ 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 b3RhdQJF}zNy%X2RV1_#O<V%e2O*sDxi|D&+ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/site-patch.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/site-patch.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0823077f09b8a9dcfa650b70632ccb2a5b202b53 GIT binary patch literal 1518 zcmY*Z&2QT_6elTJmSx#V94AYL9dZ~D_>j0=G6X1sU_(2syJP_xAgPx?Q$*U4ElV=V zI3J)cb9dP(yY0B^_9qlO4%oji@Vf2L>yAAXdz8_lqroTg@%P^Qy$^V&(eVEH`H!<V zE<%5y_ZETkXRyUbASj~v1?nM&DH##I#?TC5^bMlcGt{voK$L3*WE=Kl*kTbpP)t#R ziuo58Sm7ZVT9nLiK@_2A<ceK|hBmdp>mx;c#2*b%K~i6lVFl2RLCUH^)Q-{2Dl9;| zvZlZTMc<QkRM>!Whn}nhvU2lM*-y~<uZ5!=RT&X6RSx+4VKP<L&{D=*RaGHwjsK>q zL!VYa<0`k*yj1S6VKf*Wp~>`iqh#MKYN}?C${FApIkO6{s2BbTN>^<p7e*fc7eg&D zx}H8qDLF;TGkNhhlj&U>EWxAlR9*Qq8>17br1FM~rh2DkloRklf!B9fF3~D=Um%m= z6EwrXtWjoOqZl%8QmjzWx>;2OGHe!(TsHY&bdM*eCtzixVM{gl5CN2IE1TkV@N!0q zg<_GSVhQTnx=H5V&o98fZS3KFxoE4lS{#vk%zsx)hP^pKm0Q4J3Emnb=N^kc-@W~< zTEmrj^t27<RkZ{+f)OCRJ%|OIegaM{6AfkuI<*fHW~F}k%1ny(j-DSs{rd3e^W&$w zavi5TpXlX0l$Sv~&ND6<527%-WZD+7WOpAw&aM)gZpw{*oYD<>$u>9(lZ{RDy16mV z=vBfZY&^p<lWW6%2D_Zz0aWL_U0{h6RF$H2;L;~Ql8FtB@GE22!P*^%BW5^sh$h<) zv<<$;zaZ|x^Xo}B=kYX@tUC>Px1S}HanX%NU70-WU))UTuGkAcjV^9S4|n=^*W>5` ztU=m6?&fj66{kXmNwT#&W_MKFh^}DrDwkQ7{Qn3Mw}3%(xt-s>_V$xl$S51<2OX1% zNy|ZZ9|plimdWk?B#XjC9Khi%OxJ^e4F(X6amgK%)(6@Ww?dOl=qgL6G0#$M4Vct! zo`kZW@v*LmJc*^Qn$!i$brqgNDY>?dMq3F>b(O|E4aZEoLC}vA76iI(S`o}kuj@$` zzPnh^LtX!>Y~&Z5XIxjJBooj~8b^{hfS2|{N=@^?FRvPf6XrQfsdnb<J1e{iYQA8E z$-HOfan!2{Ne!!BWqfN)YsS=lJ2TobG#KaRFH1W@!jO#ls<~7s6A{<-QJP(+L7A#{ zpo=*a2Gbr%X|Fbq9E4DulwFq~jdM-Xyqtl#sF$wiJurhKz6F7>3qK#PVTbs{$1Us= z4>vKv9_V4i%_aoSYoIk)f(dDZ)*&u@efR>NG|3{i0qKK%+q_`k@<GqHAO^31IPA<X frV*wgLGT_oGpW2J=<d%Ob5K$=li+^oVh8^RNnMa} literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/ssl_support.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/ssl_support.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..719a0cf7f46d75a05ca18beb81eb08b79b778a5f GIT binary patch literal 6799 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/unicode_utils.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/unicode_utils.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72719ce5811959496e85ace6b517dbb460f993c3 GIT binary patch literal 1181 zcmZ8hPjAyO6t|r;ZL@BIZ6L$}<uHMY*uu0Sc0dS;m195}u&x4CS?qLaQzzI?|EWEd z55kpC!gt6OIPeuX@tl-x;K=XU&(De9@Aq>K*4OQyU%q|#VIcG!U26o!FQCgKFceW7 zqfY5@2g97iWN35@jHp4)&!}V43bnvjXqDE$TNIz5X8jlJMqU%=hKwcw)-!0@uR(ta zUA_mS&>Sh;CrcvkD5GyuJV#4%f~Grj)UQyo#0zv4UqE)>Dx;@}Z<|O}2ex>F;l&u8 zAx_$m0iQR#j^VvJo>ejx?jAL3xgE)fOXc%`30+}cS8SrXYMQcqE#py;P)2>_=XIWl zp&v&xmRpqRaBeYP_{O_3uO&nxpfWS{)x}pNbV0wBn~G@UE9Q=T;f6^}nUHQUa8<k? zo=-;fP(JNG3C^d3{ey5e9tMx0^|<@iO`~+TI9nX=9uC=z%87I(Q(3B#B>rc(I%qdj zQ7re;X<pYy9Hxn6HI3*d7=#<}5Nw0pfXBjO9io>Mm@sKTFDPik;2H%tG<X{BB}(s7 zyufozaYz<qvNtEk=;Qr`F|{=@b7KiC1N;`i@0IY6AD*F458KdBK_!}m*_rJ?YjK$g z=BNu_fniQB8Zqu@@SI3GCCKzqk?OtnTF&?amU-f^Ny-Ans8iq{@t!kI#6T8_D`vfB zRe*p|!Ku)tf!?Mvztv+ZjA903#fE?Pi>gl8T+w)3uv?O83LBO>Rw%oWoZErVX#{#; zGB+SlP+S@fUB0n;cegzJHpEKotp+wp1J{UMFtCBe7OVwYak^=LDgPaq6lkJ3UZIHr z&3h%9`WCg}_5qG$=Bi9^XT|;%91&NE<2zx-0~ICQj~$VKG&u8`L})==*4io*T-Hi* zODX|y3N4raOS6@jY79X54`5m9*C3+h1jXEjF(6(6CpN%zZeHnh5AG8ayktTvt|-0O ga_t+sdQo6ldp1mH7PII2pCC2-HNdT5)*7{~KXHX3&Hw-a literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/version.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/version.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a9a5a20e3144f278473939a476fe58c115de376 GIT binary patch literal 340 zcmYjLy-ve082p?B^-o0^d4&$ety*9~h=r8}Bp^bv(%7xixVB|GY0{M!;1O7P65hcp zV&D~+a8L!@r#sznr|)LNVgKXh?eQ4^-aUUY@b1#noO+=^5r+htn86y+;0djRB)kK0 z6akBhzMddxkA_M303x{e`5PETpS}y%u5Xwvm6ehk*C|CI<W`Ih+)x!OqM4DU&X{rW zidjN)V|BhLZ7zlDR7{)J3<%j<LR{~v&X{Tgub_MW!H;|itaM(bmf<SZcquvcWt<h* z^67F>S9EU9$Vs+nis@{*+itRn$4cN^ta3HZg|R8;<N1c|sHqM9oBZGIR~)Oxb<a1F TmYiK6Kf!dpbb|oJ=n#Dact&QJ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/wheel.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/wheel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab73b9edc5f9af428d0c72bba974a6721d44ce19 GIT binary patch literal 7017 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 SDCL;{SvLM){))EcuKgc_hzs}t literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/windows_support.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/__pycache__/windows_support.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c983689537674462e4682c983e97baf1c9c2db3 GIT binary patch literal 1023 zcmZWoPjAyO6t|N!%ewJz0>laBNDpi1IzXUlVq=>&sp`;HR4GEr(%9Y7I&rYwcCES# z-Hk87l~01iN5~a%*jM1hbE?6BC;7c!oadjPe}1mtx>f%1`Rn^{214J_4Ko41h9RGT zBZy#z{CUJaCI&Gtk#A6gSfq4`X4p3gK1LP$3bIi%!a9KI2+ZgW4EYG0LOnbKw!SIu z&smPq6v0ZXnJ={Cl<<*^Ag?gJQZocFqy>)XOx*l}Dn@RF;#B5#f25<(<rePe(91+T z3>Ec;q42t#5h|n?^*zOE-Ol-ttjia{v#2xf*XrHLD2bkeou*#P%i?S`PNfPNTU}4+ zgvfL0NvZ~!;+*{jNApSpImj|DR5cst&ISvU4hc6GbhR+h<neVHPuaM-!FUuhxd~vN z2#0Vo7OE~6Np8!rR5YpJ-0BX}=+A+K4OIE^O{$XKK~E#Rj2$eN0R5I+>!j5vByRvv zAomPoq;SvZnLX<Q11k0G!Y_1<DGr<hF9IqP;{s-;Xll%i3v+79efYODLmx3Q^)*dC zm0hr7s$6wO-Lsewn!2G<BJK<nbvb;v-IxIqE{O$=6c^)axmdL)c;cQZmA&#j&^hY! zAr)Q5N7aZY-iHB|D(0#5YA>I!t<~yvZ@%m#3)R_)n+&9KJJeP5TvZFc$(=}zGb*c~ zP64iT%QP#?c{vE;L|;u1<n}x%x3z|h<xZc9l(PDozXHeDgIc$)%a?86x#sfi#@qIB z>&P$dv=5JVat9i%*u=NC4-Xspf`D>ici(Bp>8=o5RIJ?6rTX{&<INxJ9W-`>tyb&k zVEbKbH`qVe+1YL8rl9KIyIurQX`nUK7c1|ALyHbB;}u*sETfDqEFQvK#S#t#aa%i` dTFl;HD;`DBKF&tM$$-&K{hW%{aj;`L_AdY%4M_k1 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_deprecation_warning.py b/mongo_mac/lib/python3.6/site-packages/setuptools/_deprecation_warning.py new file mode 100644 index 0000000..086b64d --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/_deprecation_warning.py @@ -0,0 +1,7 @@ +class SetuptoolsDeprecationWarning(Warning): + """ + Base class for warning deprecations in ``setuptools`` + + This class is not derived from ``DeprecationWarning``, and as such is + visible by default. + """ diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/__init__.py b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07cd6c300e03ea5b57307fd0b2d1f3d15c3eb06c GIT binary patch literal 202 zcmXr!<>h+1;CKuJ5IhDEFu(|8H~?`m3y?@*2xib^^jpbL1QJFNzsmIsiZaU*OH%dA z5{vZH@^eyBi;DG=v-L}I4AYV-%2G^<&ErjzlPa?fjnk^ibCV5#AU#h%M86=jKsPh5 zxFj(rN7p1bwJN2!qFBE;wWPG5BtJg~g&AL#nwOGaq#qxjnU`4-AFo$Xd5gm)H$SB` NC)Ez*pkg3q008&-Iwt@C literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58d18929d699c741e25dcfe62981ae8a9f9f7304 GIT binary patch literal 203211 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≺*Sfn&HYh5Uy%mT|qjGLJg$R)pCBn?qRmW^5# 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/six.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/six.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60febbe762c5d5f843286feaae35aa413896ffa9 GIT binary patch literal 24499 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 RB$i6xn>b0(O}IB<|6jNi0AK(B literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__about__.py b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__about__.py new file mode 100644 index 0000000..95d330e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__about__.py @@ -0,0 +1,21 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "16.8" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD or Apache License, Version 2.0" +__copyright__ = "Copyright 2014-2016 %s" % __author__ diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__init__.py b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__init__.py new file mode 100644 index 0000000..5ee6220 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__init__.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +from .__about__ import ( + __author__, __copyright__, __email__, __license__, __summary__, __title__, + __uri__, __version__ +) + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0aa99306fed0d0ed47179dcd613ddbb5e71d20c7 GIT binary patch literal 738 zcmY+BOK%e~5XX13X_IW4wm{Xhsl*`?jg!7W2%$oIM5s~`hZT~w+3_Y;z4pqF(Cm>< z!j(_Lm2<9$17Cp?<3^}p%RkLne~;&JJQ$=uzkK`ny%j}2qJLHw?Q=Z#3IP$sGOFS% zu3A~EO0p!5paluEVFNay16}CNx>+02Yy<k)CTwLL7-U`8&U&zurLddz;Q{aMN7)uU zypD#Ceqq#Tn5=g4snyau&O}vf<5pb|3t@#;tL@qd<yh%e;ey{|%n2tsW2-)6)>l<- zmgsaC^G2+17u<xm=%kG0-p#c^8(;D&7jmtUqTtGgFayR4T`!H8&0Ubyd2y4^gqk%6 z7us;*oshx_Zb_*Pxmsd4Mb;v2o5yqKYWsrHnQ(JI9TmEw^|H?CeVF#-Z1lVtUTT#~ zAlJ^9r6ailB2*|7d@f0$l`~@Moi?`Fg*)lFy_1fFZVujDUlRQNHAbCt@^+p4Q}SV5 zDLERAoBfNwRgk0c<m3=>MxNMr!$D|6>76%NuE7yUCJAUGLf>+UJuw^MYBQh{5GHSW z0ck)#U<>gzGP}VJ`2CsUbQZbebdeicY6+MREpDijlX7~yfD`+SofgyO&E&XjK2^mS z*G$p(v=;TDP}bq!hbI+pz}{MFx%0KtTK;FU1y`WWeM2dxJk=hDHL91Z?#oJpm;6;I T$L=Bak~B_}c8t4)J23tOc&p+x literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c040eb792e1f7ffd985d47143e5592d8d01e9cfd GIT binary patch literal 576 zcmY+A&2H2%5XYTlck{Jrg~UU!hhnN0aY2YD;6hIp(#RVpskL?-`6G0D<4t<yNqC1` zD-L}HPK>(}Dwh1yj5YJ0zvrrHs^1U4z9lIkkL1NEF#e3!-5>-Ji6S~-iB4InGnOSp zq#{!*y=H5@VH=&ZTo<g+B`bBsDqXW$Z`l^>R$?tSA{T`yMJ4K?V2#**CA;PcmB}t! z&iURM6?_L$PsaMC5OS7InsGUstQ<Y`VQf9-Pf6@3mI{Cee`_qj(g3t(I$Am0dQ3}z zPIIX+tO1m4yU}&0#09OnJ)VlZ^eVpR0Kv*r!Q9z66~NXw$5s*Bh$dna5!YhNh#c`{ zcNV?$!3T?C7MDnD7O_G^FMMwT+B!AImKO@o`p=X84T*NRLi0a~eHE)C{`{c0hMD`0 z&fL=8D1k<4d!Sxj_WQe8T)PkOzTF=WmskD$ciq0jGmP|xPI9`Cqw}bFajm<1;qDxD xoez^YM*SDU+>OFmI`Q_v2RRNDK#mg4znzXt@lhKQRQD-<%*9o_PTy>*<S*$?p$z~4 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16206a41a3a6dbee7cf6e9a954e9d75ad4dd8c95 GIT binary patch literal 1023 zcmah{&1w`u5bmGZ-O0My91H<}4(mnOLw1abcnLvJ@D>C`a0oQL(>=*#=g;n*O?HVO zB#=CYSD(ap=&N|hD|oWHSJwm&7F11Db<bB{RrU7jYWK&NZwChyq3`I15b$4s>i1v- z5;#W%j&VU^QqY)Umm_%)2QoNr33Lw$Iw5g;83hn^WJkS{VT$9GvMsyrD_Wv`f#N%Y zyhX##HDIG5wQGE=tGqFiWkp>nV?&WmGo4kX?bj+R4NIFcF%a)xJ7U+s7A4sI4dQ|p zXa`h32J;$SqD!0-fd#n;1-ZiK^b;}Y7@rYAQ<S0e0LlmRs5=08sU$aYzz1Wl<siwq z)`OGG96_d#hWo_G-%J2}DXy#&eIJZOF%~E$Hw(v9P+#VeLt}rjcJnIXx!xNsQ%T^V z5OQCqcR_Uz%oRSvSLlqMJ1D&W6=++U<k|)$FQo07qf9eLTw5%L#I_cG;GmV8$j{Fa zjBpAaMpLe$w9184I!Y#y$+yz+=~V3K=j>TBo=vv4)A>n}JOMc@qjyoA)tgzV4bSt< zokGrqKGl(yrm0O;<+ofmm8GauRP$uQ53}+xVo6oh+>Gj(?J!o#6UH98rriDzo)7;! zlhN<L_Mzhtd}x<3+hwe%M3Xze$Job)=Zh1y2DrZCAyIB}YV}V-^}(|%%V|G=(DMkf za)Y*OM!I*$)r|RV!yE%MtEI;r(gl*obl3ka;_>^pJ6d-|{8~F3RBb>s>^b&nV;TkQ zl^cX|k4U*&mg<?dy(#Plo;l0Pw6gTgho{bL!=X{O2L>j~95ZdZe$hVT(LJjh#&ZgH W7sJ|fCA3SelaTgtKL~J0+VmI8QVI(I literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f171ea6a86d1e2ba185b2d3a778f3f6a66d204b GIT binary patch literal 2880 zcmcImPmj|&5Vw;yO}pLQE-e2ZdQW;M6p1DL6-Xeo2*lI7^unGhBr6-c-LPp=Y`3r# zx9)+D!Ie+KcgPiS;45%q#@#@>N?r;NT-oDfZ2xA)Gr#86`g-fryARLb)(QDY7FrGF zyU^7W7&zfHCPUhzL#t;E?Ve4^KZIM{J|^52wVB<ki~5Z8>hQM4>+rU2-a5j8w+?rn z5wGzXP9mP2Z3g=)jmKKBXgErx&RiZ%A{C`cwlR`XqFH~Ogc_bh+>tj6CcDtp9t?u? zC?`FOQ*IrTp3QAu0}0sN0a@n_?t*l9lea)N_!@76bon~p0NLc5yaTeuxA+;5Yy2!& zxShHGCjBUh^ifCw1RF~1kD)6J3a7Br>PiS0c~3l=)s%?)(t$@ad^z^PiAkV^KMADY zPh&2m^20-4$2a=>uP6Mry36i_`$va2ZuO_HhT(N+gT&wSN6}~}N|X-bc<1&|Ou2fk zd?oaFq|-EBnzD&Vcq;u-5FQ4DC>i)nX*mw{SPFG*bd<S_NimX)HPLX49ih{$+`VhL zcF9j078yU=FwsQQH)KX<=r8ShR#rO*)InCmV?8Pxu;#nh(uGF^#WjrK0Y#v5ZD`Da zB`Ax6`_vrlSq3Dlr}{w1(^w8;v1V*@0cmr=J=Faej$DVMickb&XUb4Ow}f&kgl`~( zFX+t5L)d~e#|utEku_m!94N)uiKAr(h?k6=D=`3d#RhD^4oz|c+T_Fp*+DP2V5mS% zz_p7dsHj^)ExN?L#Y-&nZ2;GFxda7uzX%2F{i_TGeL?%Np<MDspTv!3ovs)JI+}<) z$x3RV!B`>&jQtHq<t5O`_dwklW!GzCu_VC|(6bg}!<3I>oVOW!IS%5vMq=?wEGCK9 zDKXh4=At}{!!{0>8S(-S-zaE4!-_O4g_WvsmutE9^3Ui)P<?AylDp7<Bg@M3aDI8n zPY8C}+{vRhPozT1F%k06Uc)JLdg=5v{S4K~7Mv*8U?{$1b0t?RP*>!-$}%xm?=OH| zC~$Elx~qo51iM)Ug#}}x4GU5JH|MQHI3}s@Q~>`Tt}~@{uL61{!dv>+Dk3~nu=gvV zR${$sD5QmlRZy!@pCO5oLO|kqv;cFlAUAWyllXTcFX8Y94*#3nkVmdSFC#b9cfAJk xYk!PiM)1{x2`e#UC4S6hPP+d>gxa`hc&Ug*Gxx!qpC95Lg~YmTcm8yse+4--2%!J~ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31a450b93124acb4503787ddc0e006c63318d7b4 GIT binary patch literal 8900 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6e3b6635cacd4d185fb27b20411d8729993e5de GIT binary patch literal 3893 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 KSZPg|MeDx@iRhdF literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62fd052b2f157acdbf41e5a0370df7bc58d4ecb2 GIT binary patch literal 19842 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8e233a9378c59704ea17fa6e316713f44e76768 GIT binary patch literal 507 zcmY*VJ8l~>5GA=QSy227oJ$CS#MrXo#xM+|cVkzZ1O!D=0wsPHBzG+fh8y`HX;S1Q zxdU4xMXsPKq$+8E_xL!R;e5tNNBzG)|9t-i0eA;HhLXNZ@E3_V;7|b#E2vS0bWs&B z`;aQDQk3%!FV?W?@{)JnKy|>;0~mDwr93bw;t8F2tC}E))U|aX_PA`Nm)6AN+DQ}0 zv@tBC`~9l>ZAeBxKC{%!*78{-d`<ADi2|5I4qw0;&Cwd9GU$E-hpEaLVboY78C7y6 zh!ZohjD>F|v7_vha03`iL$&w~TtEG@dBv%AOM}2Ib$DtO7tUk0z(Ji)C(D*!`fGB< zCeMrW@pSd1*_UK9gCB7%>!CD0P^E^KTCBKVdhA7L>R_$flcW`fTZe1P7IY@f3^ze4 zKdPVO$GvuQXNP&lymf$F)`MQ`leC-AI6;WZFD~!Gm5Cy9A|5cSYpI0mW_Qln&bC7z Wa%k^HTiz&fn-hJG{e*f&zxWRrO^UGq literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff057ebf5c8e0442c2a6d45271ae2ca89fd89b02 GIT binary patch literal 10617 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 SrhUNv$}}d|?N5q^J@)?+zkX=| literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/_compat.py b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/_compat.py new file mode 100644 index 0000000..210bb80 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/_compat.py @@ -0,0 +1,30 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import sys + + +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +# flake8: noqa + +if PY3: + string_types = str, +else: + string_types = basestring, + + +def with_metaclass(meta, *bases): + """ + Create a base class with a metaclass. + """ + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/_structures.py b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/_structures.py new file mode 100644 index 0000000..ccc2786 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/_structures.py @@ -0,0 +1,68 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + + +class Infinity(object): + + def __repr__(self): + return "Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return False + + def __le__(self, other): + return False + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return True + + def __ge__(self, other): + return True + + def __neg__(self): + return NegativeInfinity + +Infinity = Infinity() + + +class NegativeInfinity(object): + + def __repr__(self): + return "-Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return True + + def __le__(self, other): + return True + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return False + + def __ge__(self, other): + return False + + def __neg__(self): + return Infinity + +NegativeInfinity = NegativeInfinity() diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/markers.py b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/markers.py new file mode 100644 index 0000000..031332a --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/markers.py @@ -0,0 +1,301 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import operator +import os +import platform +import sys + +from setuptools.extern.pyparsing import ParseException, ParseResults, stringStart, stringEnd +from setuptools.extern.pyparsing import ZeroOrMore, Group, Forward, QuotedString +from setuptools.extern.pyparsing import Literal as L # noqa + +from ._compat import string_types +from .specifiers import Specifier, InvalidSpecifier + + +__all__ = [ + "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName", + "Marker", "default_environment", +] + + +class InvalidMarker(ValueError): + """ + An invalid marker was found, users should refer to PEP 508. + """ + + +class UndefinedComparison(ValueError): + """ + An invalid operation was attempted on a value that doesn't support it. + """ + + +class UndefinedEnvironmentName(ValueError): + """ + A name was attempted to be used that does not exist inside of the + environment. + """ + + +class Node(object): + + def __init__(self, value): + self.value = value + + def __str__(self): + return str(self.value) + + def __repr__(self): + return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) + + def serialize(self): + raise NotImplementedError + + +class Variable(Node): + + def serialize(self): + return str(self) + + +class Value(Node): + + def serialize(self): + return '"{0}"'.format(self) + + +class Op(Node): + + def serialize(self): + return str(self) + + +VARIABLE = ( + L("implementation_version") | + L("platform_python_implementation") | + L("implementation_name") | + L("python_full_version") | + L("platform_release") | + L("platform_version") | + L("platform_machine") | + L("platform_system") | + L("python_version") | + L("sys_platform") | + L("os_name") | + L("os.name") | # PEP-345 + L("sys.platform") | # PEP-345 + L("platform.version") | # PEP-345 + L("platform.machine") | # PEP-345 + L("platform.python_implementation") | # PEP-345 + L("python_implementation") | # undocumented setuptools legacy + L("extra") +) +ALIASES = { + 'os.name': 'os_name', + 'sys.platform': 'sys_platform', + 'platform.version': 'platform_version', + 'platform.machine': 'platform_machine', + 'platform.python_implementation': 'platform_python_implementation', + 'python_implementation': 'platform_python_implementation' +} +VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) + +VERSION_CMP = ( + L("===") | + L("==") | + L(">=") | + L("<=") | + L("!=") | + L("~=") | + L(">") | + L("<") +) + +MARKER_OP = VERSION_CMP | L("not in") | L("in") +MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) + +MARKER_VALUE = QuotedString("'") | QuotedString('"') +MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) + +BOOLOP = L("and") | L("or") + +MARKER_VAR = VARIABLE | MARKER_VALUE + +MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) +MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) + +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() + +MARKER_EXPR = Forward() +MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) +MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) + +MARKER = stringStart + MARKER_EXPR + stringEnd + + +def _coerce_parse_result(results): + if isinstance(results, ParseResults): + return [_coerce_parse_result(i) for i in results] + else: + return results + + +def _format_marker(marker, first=True): + assert isinstance(marker, (list, tuple, string_types)) + + # Sometimes we have a structure like [[...]] which is a single item list + # where the single item is itself it's own list. In that case we want skip + # the rest of this function so that we don't get extraneous () on the + # outside. + if (isinstance(marker, list) and len(marker) == 1 and + isinstance(marker[0], (list, tuple))): + return _format_marker(marker[0]) + + if isinstance(marker, list): + inner = (_format_marker(m, first=False) for m in marker) + if first: + return " ".join(inner) + else: + return "(" + " ".join(inner) + ")" + elif isinstance(marker, tuple): + return " ".join([m.serialize() for m in marker]) + else: + return marker + + +_operators = { + "in": lambda lhs, rhs: lhs in rhs, + "not in": lambda lhs, rhs: lhs not in rhs, + "<": operator.lt, + "<=": operator.le, + "==": operator.eq, + "!=": operator.ne, + ">=": operator.ge, + ">": operator.gt, +} + + +def _eval_op(lhs, op, rhs): + try: + spec = Specifier("".join([op.serialize(), rhs])) + except InvalidSpecifier: + pass + else: + return spec.contains(lhs) + + oper = _operators.get(op.serialize()) + if oper is None: + raise UndefinedComparison( + "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) + ) + + return oper(lhs, rhs) + + +_undefined = object() + + +def _get_env(environment, name): + value = environment.get(name, _undefined) + + if value is _undefined: + raise UndefinedEnvironmentName( + "{0!r} does not exist in evaluation environment.".format(name) + ) + + return value + + +def _evaluate_markers(markers, environment): + groups = [[]] + + for marker in markers: + assert isinstance(marker, (list, tuple, string_types)) + + if isinstance(marker, list): + groups[-1].append(_evaluate_markers(marker, environment)) + elif isinstance(marker, tuple): + lhs, op, rhs = marker + + if isinstance(lhs, Variable): + lhs_value = _get_env(environment, lhs.value) + rhs_value = rhs.value + else: + lhs_value = lhs.value + rhs_value = _get_env(environment, rhs.value) + + groups[-1].append(_eval_op(lhs_value, op, rhs_value)) + else: + assert marker in ["and", "or"] + if marker == "or": + groups.append([]) + + return any(all(item) for item in groups) + + +def format_full_version(info): + version = '{0.major}.{0.minor}.{0.micro}'.format(info) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + +def default_environment(): + if hasattr(sys, 'implementation'): + iver = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + iver = '0' + implementation_name = '' + + return { + "implementation_name": implementation_name, + "implementation_version": iver, + "os_name": os.name, + "platform_machine": platform.machine(), + "platform_release": platform.release(), + "platform_system": platform.system(), + "platform_version": platform.version(), + "python_full_version": platform.python_version(), + "platform_python_implementation": platform.python_implementation(), + "python_version": platform.python_version()[:3], + "sys_platform": sys.platform, + } + + +class Marker(object): + + def __init__(self, marker): + try: + self._markers = _coerce_parse_result(MARKER.parseString(marker)) + except ParseException as e: + err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( + marker, marker[e.loc:e.loc + 8]) + raise InvalidMarker(err_str) + + def __str__(self): + return _format_marker(self._markers) + + def __repr__(self): + return "<Marker({0!r})>".format(str(self)) + + def evaluate(self, environment=None): + """Evaluate a marker. + + Return the boolean from evaluating the given marker against the + environment. environment is an optional argument to override all or + part of the determined environment. + + The environment is determined from the current Python process. + """ + current_environment = default_environment() + if environment is not None: + current_environment.update(environment) + + return _evaluate_markers(self._markers, current_environment) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/requirements.py b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/requirements.py new file mode 100644 index 0000000..5b49341 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/requirements.py @@ -0,0 +1,127 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import string +import re + +from setuptools.extern.pyparsing import stringStart, stringEnd, originalTextFor, ParseException +from setuptools.extern.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine +from setuptools.extern.pyparsing import Literal as L # noqa +from setuptools.extern.six.moves.urllib import parse as urlparse + +from .markers import MARKER_EXPR, Marker +from .specifiers import LegacySpecifier, Specifier, SpecifierSet + + +class InvalidRequirement(ValueError): + """ + An invalid requirement was found, users should refer to PEP 508. + """ + + +ALPHANUM = Word(string.ascii_letters + string.digits) + +LBRACKET = L("[").suppress() +RBRACKET = L("]").suppress() +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() +COMMA = L(",").suppress() +SEMICOLON = L(";").suppress() +AT = L("@").suppress() + +PUNCTUATION = Word("-_.") +IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) +IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) + +NAME = IDENTIFIER("name") +EXTRA = IDENTIFIER + +URI = Regex(r'[^ ]+')("url") +URL = (AT + URI) + +EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) +EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") + +VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) +VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) + +VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY +VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), + joinString=",", adjacent=False)("_raw_spec") +_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) +_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '') + +VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") +VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) + +MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") +MARKER_EXPR.setParseAction( + lambda s, l, t: Marker(s[t._original_start:t._original_end]) +) +MARKER_SEPERATOR = SEMICOLON +MARKER = MARKER_SEPERATOR + MARKER_EXPR + +VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) +URL_AND_MARKER = URL + Optional(MARKER) + +NAMED_REQUIREMENT = \ + NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) + +REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd + + +class Requirement(object): + """Parse a requirement. + + Parse a given requirement string into its parts, such as name, specifier, + URL, and extras. Raises InvalidRequirement on a badly-formed requirement + string. + """ + + # TODO: Can we test whether something is contained within a requirement? + # If so how do we do that? Do we need to test against the _name_ of + # the thing as well as the version? What about the markers? + # TODO: Can we normalize the name and extra name? + + def __init__(self, requirement_string): + try: + req = REQUIREMENT.parseString(requirement_string) + except ParseException as e: + raise InvalidRequirement( + "Invalid requirement, parse error at \"{0!r}\"".format( + requirement_string[e.loc:e.loc + 8])) + + self.name = req.name + if req.url: + parsed_url = urlparse.urlparse(req.url) + if not (parsed_url.scheme and parsed_url.netloc) or ( + not parsed_url.scheme and not parsed_url.netloc): + raise InvalidRequirement("Invalid URL given") + self.url = req.url + else: + self.url = None + self.extras = set(req.extras.asList() if req.extras else []) + self.specifier = SpecifierSet(req.specifier) + self.marker = req.marker if req.marker else None + + def __str__(self): + parts = [self.name] + + if self.extras: + parts.append("[{0}]".format(",".join(sorted(self.extras)))) + + if self.specifier: + parts.append(str(self.specifier)) + + if self.url: + parts.append("@ {0}".format(self.url)) + + if self.marker: + parts.append("; {0}".format(self.marker)) + + return "".join(parts) + + def __repr__(self): + return "<Requirement({0!r})>".format(str(self)) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/specifiers.py b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/specifiers.py new file mode 100644 index 0000000..7f5a76c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/specifiers.py @@ -0,0 +1,774 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import abc +import functools +import itertools +import re + +from ._compat import string_types, with_metaclass +from .version import Version, LegacyVersion, parse + + +class InvalidSpecifier(ValueError): + """ + An invalid specifier was found, users should refer to PEP 440. + """ + + +class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): + + @abc.abstractmethod + def __str__(self): + """ + Returns the str representation of this Specifier like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self): + """ + Returns a hash value for this Specifier like object. + """ + + @abc.abstractmethod + def __eq__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are equal. + """ + + @abc.abstractmethod + def __ne__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are not equal. + """ + + @abc.abstractproperty + def prereleases(self): + """ + Returns whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @prereleases.setter + def prereleases(self, value): + """ + Sets whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @abc.abstractmethod + def contains(self, item, prereleases=None): + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter(self, iterable, prereleases=None): + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class _IndividualSpecifier(BaseSpecifier): + + _operators = {} + + def __init__(self, spec="", prereleases=None): + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) + + self._spec = ( + match.group("operator").strip(), + match.group("version").strip(), + ) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<{0}({1!r}{2})>".format( + self.__class__.__name__, + str(self), + pre, + ) + + def __str__(self): + return "{0}{1}".format(*self._spec) + + def __hash__(self): + return hash(self._spec) + + def __eq__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec == other._spec + + def __ne__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec != other._spec + + def _get_operator(self, op): + return getattr(self, "_compare_{0}".format(self._operators[op])) + + def _coerce_version(self, version): + if not isinstance(version, (LegacyVersion, Version)): + version = parse(version) + return version + + @property + def operator(self): + return self._spec[0] + + @property + def version(self): + return self._spec[1] + + @property + def prereleases(self): + return self._prereleases + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version or LegacyVersion, this allows us to have + # a shortcut for ``"2.0" in Specifier(">=2") + item = self._coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + return self._get_operator(self.operator)(item, self.version) + + def filter(self, iterable, prereleases=None): + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = self._coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later incase nothing + # else matches this specifier. + if (parsed_version.is_prerelease and not + (prereleases or self.prereleases)): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the begining. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +class LegacySpecifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(==|!=|<=|>=|<|>)) + \s* + (?P<version> + [^,;\s)]* # Since this is a "legacy" specifier, and the version + # string can be just about anything, we match everything + # except for whitespace, a semi-colon for marker support, + # a closing paren since versions can be enclosed in + # them, and a comma since it's a version separator. + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + } + + def _coerce_version(self, version): + if not isinstance(version, LegacyVersion): + version = LegacyVersion(str(version)) + return version + + def _compare_equal(self, prospective, spec): + return prospective == self._coerce_version(spec) + + def _compare_not_equal(self, prospective, spec): + return prospective != self._coerce_version(spec) + + def _compare_less_than_equal(self, prospective, spec): + return prospective <= self._coerce_version(spec) + + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= self._coerce_version(spec) + + def _compare_less_than(self, prospective, spec): + return prospective < self._coerce_version(spec) + + def _compare_greater_than(self, prospective, spec): + return prospective > self._coerce_version(spec) + + +def _require_version_compare(fn): + @functools.wraps(fn) + def wrapped(self, prospective, spec): + if not isinstance(prospective, Version): + return False + return fn(self, prospective, spec) + return wrapped + + +class Specifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(~=|==|!=|<=|>=|<|>|===)) + (?P<version> + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s]* # We just match everything, except for whitespace + # since we are only testing for strict identity. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + + # You cannot use a wild card and a dev or local version + # together so group them with a | and make them optional. + (?: + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + | + \.\* # Wild card syntax of .* + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?<!==|!=|~=) # We have special cases for these + # operators so we want to make sure they + # don't match here. + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "~=": "compatible", + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + @_require_version_compare + def _compare_compatible(self, prospective, spec): + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore post and dev releases and we want to treat the pre-release as + # it's own separate segment. + prefix = ".".join( + list( + itertools.takewhile( + lambda x: (not x.startswith("post") and not + x.startswith("dev")), + _version_split(spec), + ) + )[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return (self._get_operator(">=")(prospective, spec) and + self._get_operator("==")(prospective, prefix)) + + @_require_version_compare + def _compare_equal(self, prospective, spec): + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + prospective = Version(prospective.public) + # Split the spec out by dots, and pretend that there is an implicit + # dot in between a release segment and a pre-release segment. + spec = _version_split(spec[:-2]) # Remove the trailing .* + + # Split the prospective version out by dots, and pretend that there + # is an implicit dot in between a release segment and a pre-release + # segment. + prospective = _version_split(str(prospective)) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + prospective = prospective[:len(spec)] + + # Pad out our two sides with zeros so that they both equal the same + # length. + spec, prospective = _pad_version(spec, prospective) + else: + # Convert our spec string into a Version + spec = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec.local: + prospective = Version(prospective.public) + + return prospective == spec + + @_require_version_compare + def _compare_not_equal(self, prospective, spec): + return not self._compare_equal(prospective, spec) + + @_require_version_compare + def _compare_less_than_equal(self, prospective, spec): + return prospective <= Version(spec) + + @_require_version_compare + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= Version(spec) + + @_require_version_compare + def _compare_less_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + @_require_version_compare + def _compare_greater_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is techincally greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective, spec): + return str(prospective).lower() == str(spec).lower() + + @property + def prereleases(self): + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "==="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if parse(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version): + result = [] + for item in version.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _pad_version(left, right): + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split[0]):]) + right_split.append(right[len(right_split[0]):]) + + # Insert our padding + left_split.insert( + 1, + ["0"] * max(0, len(right_split[0]) - len(left_split[0])), + ) + right_split.insert( + 1, + ["0"] * max(0, len(left_split[0]) - len(right_split[0])), + ) + + return ( + list(itertools.chain(*left_split)), + list(itertools.chain(*right_split)), + ) + + +class SpecifierSet(BaseSpecifier): + + def __init__(self, specifiers="", prereleases=None): + # Split on , to break each indidivual specifier into it's own item, and + # strip each item to remove leading/trailing whitespace. + specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Parsed each individual specifier, attempting first to make it a + # Specifier and falling back to a LegacySpecifier. + parsed = set() + for specifier in specifiers: + try: + parsed.add(Specifier(specifier)) + except InvalidSpecifier: + parsed.add(LegacySpecifier(specifier)) + + # Turn our parsed specifiers into a frozen set and save them for later. + self._specs = frozenset(parsed) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<SpecifierSet({0!r}{1})>".format(str(self), pre) + + def __str__(self): + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self): + return hash(self._specs) + + def __and__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __ne__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs != other._specs + + def __len__(self): + return len(self._specs) + + def __iter__(self): + return iter(self._specs) + + @property + def prereleases(self): + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Ensure that our item is a Version or LegacyVersion instance. + if not isinstance(item, (LegacyVersion, Version)): + item = parse(item) + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if not prereleases and item.is_prerelease: + return False + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all( + s.contains(item, prereleases=prereleases) + for s in self._specs + ) + + def filter(self, iterable, prereleases=None): + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=bool(prereleases)) + return iterable + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases, and which will filter out LegacyVersion in general. + else: + filtered = [] + found_prereleases = [] + + for item in iterable: + # Ensure that we some kind of Version class for this item. + if not isinstance(item, (LegacyVersion, Version)): + parsed_version = parse(item) + else: + parsed_version = item + + # Filter out any item which is parsed as a LegacyVersion + if isinstance(parsed_version, LegacyVersion): + continue + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return found_prereleases + + return filtered diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/utils.py b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/utils.py new file mode 100644 index 0000000..942387c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/utils.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import re + + +_canonicalize_regex = re.compile(r"[-_.]+") + + +def canonicalize_name(name): + # This is taken from PEP 503. + return _canonicalize_regex.sub("-", name).lower() diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/version.py b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/version.py new file mode 100644 index 0000000..83b5ee8 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/packaging/version.py @@ -0,0 +1,393 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import collections +import itertools +import re + +from ._structures import Infinity + + +__all__ = [ + "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN" +] + + +_Version = collections.namedtuple( + "_Version", + ["epoch", "release", "dev", "pre", "post", "local"], +) + + +def parse(version): + """ + Parse the given version string and return either a :class:`Version` object + or a :class:`LegacyVersion` object depending on if the given version is + a valid PEP 440 version or a legacy version. + """ + try: + return Version(version) + except InvalidVersion: + return LegacyVersion(version) + + +class InvalidVersion(ValueError): + """ + An invalid version was found, users should refer to PEP 440. + """ + + +class _BaseVersion(object): + + def __hash__(self): + return hash(self._key) + + def __lt__(self, other): + return self._compare(other, lambda s, o: s < o) + + def __le__(self, other): + return self._compare(other, lambda s, o: s <= o) + + def __eq__(self, other): + return self._compare(other, lambda s, o: s == o) + + def __ge__(self, other): + return self._compare(other, lambda s, o: s >= o) + + def __gt__(self, other): + return self._compare(other, lambda s, o: s > o) + + def __ne__(self, other): + return self._compare(other, lambda s, o: s != o) + + def _compare(self, other, method): + if not isinstance(other, _BaseVersion): + return NotImplemented + + return method(self._key, other._key) + + +class LegacyVersion(_BaseVersion): + + def __init__(self, version): + self._version = str(version) + self._key = _legacy_cmpkey(self._version) + + def __str__(self): + return self._version + + def __repr__(self): + return "<LegacyVersion({0})>".format(repr(str(self))) + + @property + def public(self): + return self._version + + @property + def base_version(self): + return self._version + + @property + def local(self): + return None + + @property + def is_prerelease(self): + return False + + @property + def is_postrelease(self): + return False + + +_legacy_version_component_re = re.compile( + r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE, +) + +_legacy_version_replacement_map = { + "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@", +} + + +def _parse_version_parts(s): + for part in _legacy_version_component_re.split(s): + part = _legacy_version_replacement_map.get(part, part) + + if not part or part == ".": + continue + + if part[:1] in "0123456789": + # pad for numeric comparison + yield part.zfill(8) + else: + yield "*" + part + + # ensure that alpha/beta/candidate are before final + yield "*final" + + +def _legacy_cmpkey(version): + # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch + # greater than or equal to 0. This will effectively put the LegacyVersion, + # which uses the defacto standard originally implemented by setuptools, + # as before all PEP 440 versions. + epoch = -1 + + # This scheme is taken from pkg_resources.parse_version setuptools prior to + # it's adoption of the packaging library. + parts = [] + for part in _parse_version_parts(version.lower()): + if part.startswith("*"): + # remove "-" before a prerelease tag + if part < "*final": + while parts and parts[-1] == "*final-": + parts.pop() + + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == "00000000": + parts.pop() + + parts.append(part) + parts = tuple(parts) + + return epoch, parts + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +VERSION_PATTERN = r""" + v? + (?: + (?:(?P<epoch>[0-9]+)!)? # epoch + (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment + (?P<pre> # pre-release + [-_\.]? + (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) + [-_\.]? + (?P<pre_n>[0-9]+)? + )? + (?P<post> # post release + (?:-(?P<post_n1>[0-9]+)) + | + (?: + [-_\.]? + (?P<post_l>post|rev|r) + [-_\.]? + (?P<post_n2>[0-9]+)? + ) + )? + (?P<dev> # dev release + [-_\.]? + (?P<dev_l>dev) + [-_\.]? + (?P<dev_n>[0-9]+)? + )? + ) + (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version +""" + + +class Version(_BaseVersion): + + _regex = re.compile( + r"^\s*" + VERSION_PATTERN + r"\s*$", + re.VERBOSE | re.IGNORECASE, + ) + + def __init__(self, version): + # Validate the version and parse it into pieces + match = self._regex.search(version) + if not match: + raise InvalidVersion("Invalid version: '{0}'".format(version)) + + # Store the parsed out pieces of the version + self._version = _Version( + epoch=int(match.group("epoch")) if match.group("epoch") else 0, + release=tuple(int(i) for i in match.group("release").split(".")), + pre=_parse_letter_version( + match.group("pre_l"), + match.group("pre_n"), + ), + post=_parse_letter_version( + match.group("post_l"), + match.group("post_n1") or match.group("post_n2"), + ), + dev=_parse_letter_version( + match.group("dev_l"), + match.group("dev_n"), + ), + local=_parse_local_version(match.group("local")), + ) + + # Generate a key which will be used for sorting + self._key = _cmpkey( + self._version.epoch, + self._version.release, + self._version.pre, + self._version.post, + self._version.dev, + self._version.local, + ) + + def __repr__(self): + return "<Version({0})>".format(repr(str(self))) + + def __str__(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + # Pre-release + if self._version.pre is not None: + parts.append("".join(str(x) for x in self._version.pre)) + + # Post-release + if self._version.post is not None: + parts.append(".post{0}".format(self._version.post[1])) + + # Development release + if self._version.dev is not None: + parts.append(".dev{0}".format(self._version.dev[1])) + + # Local version segment + if self._version.local is not None: + parts.append( + "+{0}".format(".".join(str(x) for x in self._version.local)) + ) + + return "".join(parts) + + @property + def public(self): + return str(self).split("+", 1)[0] + + @property + def base_version(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + return "".join(parts) + + @property + def local(self): + version_string = str(self) + if "+" in version_string: + return version_string.split("+", 1)[1] + + @property + def is_prerelease(self): + return bool(self._version.dev or self._version.pre) + + @property + def is_postrelease(self): + return bool(self._version.post) + + +def _parse_letter_version(letter, number): + if letter: + # We consider there to be an implicit 0 in a pre-release if there is + # not a numeral associated with it. + if number is None: + number = 0 + + # We normalize any letters to their lower case form + letter = letter.lower() + + # We consider some words to be alternate spellings of other words and + # in those cases we want to normalize the spellings to our preferred + # spelling. + if letter == "alpha": + letter = "a" + elif letter == "beta": + letter = "b" + elif letter in ["c", "pre", "preview"]: + letter = "rc" + elif letter in ["rev", "r"]: + letter = "post" + + return letter, int(number) + if not letter and number: + # We assume if we are given a number, but we are not given a letter + # then this is using the implicit post release syntax (e.g. 1.0-1) + letter = "post" + + return letter, int(number) + + +_local_version_seperators = re.compile(r"[\._-]") + + +def _parse_local_version(local): + """ + Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). + """ + if local is not None: + return tuple( + part.lower() if not part.isdigit() else int(part) + for part in _local_version_seperators.split(local) + ) + + +def _cmpkey(epoch, release, pre, post, dev, local): + # When we compare a release version, we want to compare it with all of the + # trailing zeros removed. So we'll use a reverse the list, drop all the now + # leading zeros until we come to something non zero, then take the rest + # re-reverse it back into the correct order and make it a tuple and use + # that for our sorting key. + release = tuple( + reversed(list( + itertools.dropwhile( + lambda x: x == 0, + reversed(release), + ) + )) + ) + + # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. + # We'll do this by abusing the pre segment, but we _only_ want to do this + # if there is not a pre or a post segment. If we have one of those then + # the normal sorting rules will handle this case correctly. + if pre is None and post is None and dev is not None: + pre = -Infinity + # Versions without a pre-release (except as noted above) should sort after + # those with one. + elif pre is None: + pre = Infinity + + # Versions without a post segment should sort before those with one. + if post is None: + post = -Infinity + + # Versions without a development segment should sort after those with one. + if dev is None: + dev = Infinity + + if local is None: + # Versions without a local segment should sort before those with one. + local = -Infinity + else: + # Versions with a local segment need that segment parsed to implement + # the sorting rules in PEP440. + # - Alpha numeric segments sort before numeric segments + # - Alpha numeric segments sort lexicographically + # - Numeric segments sort numerically + # - Shorter versions sort before longer versions when the prefixes + # match exactly + local = tuple( + (i, "") if isinstance(i, int) else (-Infinity, i) + for i in local + ) + + return epoch, release, pre, post, dev, local diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/pyparsing.py b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/pyparsing.py new file mode 100644 index 0000000..cf75e1e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/pyparsing.py @@ -0,0 +1,5742 @@ +# module pyparsing.py +# +# Copyright (c) 2003-2018 Paul T. McGuire +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__doc__ = \ +""" +pyparsing module - Classes and methods to define and execute parsing grammars +============================================================================= + +The pyparsing module is an alternative approach to creating and executing simple grammars, +vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you +don't need to learn a new syntax for defining grammars or matching expressions - the parsing module +provides a library of classes that you use to construct the grammar directly in Python. + +Here is a program to parse "Hello, World!" (or any greeting of the form +C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements +(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to +L{Literal} expressions):: + + from pyparsing import Word, alphas + + # define grammar of a greeting + greet = Word(alphas) + "," + Word(alphas) + "!" + + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + +The program outputs the following:: + + Hello, World! -> ['Hello', ',', 'World', '!'] + +The Python representation of the grammar is quite readable, owing to the self-explanatory +class names, and the use of '+', '|' and '^' operators. + +The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an +object with named attributes. + +The pyparsing module handles some of the problems that are typically vexing when writing text parsers: + - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) + - quoted strings + - embedded comments + + +Getting Started - +----------------- +Visit the classes L{ParserElement} and L{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 L{Literal} and L{CaselessLiteral} classes + - construct character word-group expressions using the L{Word} class + - see how to create repetitive expressions using L{ZeroOrMore} and L{OneOrMore} classes + - use L{'+'<And>}, L{'|'<MatchFirst>}, L{'^'<Or>}, and L{'&'<Each>} operators to combine simple expressions into more complex ones + - associate names with your parsed results using L{ParserElement.setResultsName} + - find some helpful expression short-cuts like L{delimitedList} and L{oneOf} + - find more useful common expressions in the L{pyparsing_common} namespace class +""" + +__version__ = "2.2.1" +__versionTime__ = "18 Sep 2018 00:49 UTC" +__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" + +import string +from weakref import ref as wkref +import copy +import sys +import warnings +import re +import sre_constants +import collections +import pprint +import traceback +import types +from datetime import datetime + +try: + from _thread import RLock +except ImportError: + from threading import RLock + +try: + # 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 + +#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) + +__all__ = [ +'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', +'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', +'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', +'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', +'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', +'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', +'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', +'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', +'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', +'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', +'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', +'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', +'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', +'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', +'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', +'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', +'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', +'CloseMatch', 'tokenMap', 'pyparsing_common', +] + +system_version = tuple(sys.version_info)[:3] +PY_3 = system_version[0] == 3 +if PY_3: + _MAX_INT = sys.maxsize + basestring = str + unichr = chr + _ustr = str + + # build list of single arg builtins, that can be used as parse actions + singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] + +else: + _MAX_INT = sys.maxint + range = xrange + + def _ustr(obj): + """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries + str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It + then < returns the unicode object | encodes it with the default encoding | ... >. + """ + if isinstance(obj,unicode): + return obj + + try: + # If this works, then _ustr(obj) has the same behaviour as str(obj), so + # it won't break any existing code. + return str(obj) + + except UnicodeEncodeError: + # Else encode it + ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') + xmlcharref = Regex(r'&#\d+;') + xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) + return xmlcharref.transformString(ret) + + # build list of single arg builtins, tolerant of Python version, that can be used as parse actions + singleArgBuiltins = [] + import __builtin__ + for fname in "sum len sorted reversed list tuple set any all min max".split(): + try: + singleArgBuiltins.append(getattr(__builtin__,fname)) + except AttributeError: + continue + +_generatorType = type((y for y in range(1))) + +def _xml_escape(data): + """Escape &, <, >, ", ', etc. in a string of data.""" + + # ampersand must be replaced first + from_symbols = '&><"\'' + to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) + for from_,to_ in zip(from_symbols, to_symbols): + data = data.replace(from_, to_) + return data + +class _Constants(object): + pass + +alphas = string.ascii_uppercase + string.ascii_lowercase +nums = "0123456789" +hexnums = nums + "ABCDEFabcdef" +alphanums = alphas + nums +_bslash = chr(92) +printables = "".join(c for c in string.printable if c not in string.whitespace) + +class ParseBaseException(Exception): + """base exception class for all parsing runtime exceptions""" + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, pstr, loc=0, msg=None, elem=None ): + self.loc = loc + if msg is None: + self.msg = pstr + self.pstr = "" + else: + self.msg = msg + self.pstr = pstr + self.parserElement = elem + self.args = (pstr, loc, msg) + + @classmethod + def _from_exception(cls, pe): + """ + internal factory method to simplify creating one type of ParseException + from another - avoids having __init__ signature conflicts among subclasses + """ + return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) + + def __getattr__( self, aname ): + """supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + """ + if( aname == "lineno" ): + return lineno( self.loc, self.pstr ) + elif( aname in ("col", "column") ): + return col( self.loc, self.pstr ) + elif( aname == "line" ): + return line( self.loc, self.pstr ) + else: + raise AttributeError(aname) + + def __str__( self ): + return "%s (at char %d), (line:%d, col:%d)" % \ + ( self.msg, self.loc, self.lineno, self.column ) + def __repr__( self ): + return _ustr(self) + def markInputline( self, markerString = ">!<" ): + """Extracts the exception line from the input string, and marks + the location of the exception with a special symbol. + """ + line_str = self.line + line_column = self.column - 1 + if markerString: + line_str = "".join((line_str[:line_column], + markerString, line_str[line_column:])) + return line_str.strip() + def __dir__(self): + return "lineno col line".split() + dir(type(self)) + +class ParseException(ParseBaseException): + """ + Exception thrown when parse expressions don't match class; + supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + + Example:: + try: + Word(nums).setName("integer").parseString("ABC") + except ParseException as pe: + print(pe) + print("column: {}".format(pe.col)) + + prints:: + Expected integer (at char 0), (line:1, col:1) + column: 1 + """ + pass + +class ParseFatalException(ParseBaseException): + """user-throwable exception thrown when inconsistent parse content + is found; stops all parsing immediately""" + pass + +class ParseSyntaxException(ParseFatalException): + """just like L{ParseFatalException}, but thrown internally when an + L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop + immediately because an unbacktrackable syntax error has been found""" + pass + +#~ class ReparseException(ParseBaseException): + #~ """Experimental class - parse actions can raise this exception to cause + #~ pyparsing to reparse the input string: + #~ - with a modified input string, and/or + #~ - with a modified start location + #~ Set the values of the ReparseException in the constructor, and raise the + #~ exception in a parse action to cause pyparsing to use the new string/location. + #~ Setting the values as None causes no change to be made. + #~ """ + #~ def __init_( self, newstring, restartLoc ): + #~ self.newParseText = newstring + #~ self.reparseLoc = restartLoc + +class RecursiveGrammarException(Exception): + """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive""" + def __init__( self, parseElementList ): + self.parseElementTrace = parseElementList + + def __str__( self ): + return "RecursiveGrammarException: %s" % self.parseElementTrace + +class _ParseResultsWithOffset(object): + def __init__(self,p1,p2): + self.tup = (p1,p2) + def __getitem__(self,i): + return self.tup[i] + def __repr__(self): + return repr(self.tup[0]) + def setOffset(self,i): + self.tup = (self.tup[0],i) + +class ParseResults(object): + """ + Structured parse results, to provide multiple means of access to the parsed data: + - as a list (C{len(results)}) + - by list index (C{results[0], results[1]}, etc.) + - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName}) + + Example:: + integer = Word(nums) + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + # equivalent form: + # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + # parseString returns a ParseResults object + result = date_str.parseString("1999/12/31") + + def test(s, fn=repr): + print("%s -> %s" % (s, fn(eval(s)))) + test("list(result)") + test("result[0]") + test("result['month']") + test("result.day") + test("'month' in result") + test("'minutes' in result") + test("result.dump()", str) + prints:: + list(result) -> ['1999', '/', '12', '/', '31'] + result[0] -> '1999' + result['month'] -> '12' + result.day -> '31' + 'month' in result -> True + 'minutes' in result -> False + result.dump() -> ['1999', '/', '12', '/', '31'] + - day: 31 + - month: 12 + - year: 1999 + """ + def __new__(cls, toklist=None, name=None, asList=True, modal=True ): + if isinstance(toklist, cls): + return toklist + retobj = object.__new__(cls) + retobj.__doinit = True + return retobj + + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): + if self.__doinit: + self.__doinit = False + self.__name = None + self.__parent = None + self.__accumNames = {} + self.__asList = asList + self.__modal = modal + if toklist is None: + toklist = [] + if isinstance(toklist, list): + self.__toklist = toklist[:] + elif isinstance(toklist, _generatorType): + self.__toklist = list(toklist) + else: + self.__toklist = [toklist] + self.__tokdict = dict() + + if name is not None and name: + if not modal: + self.__accumNames[name] = 0 + if isinstance(name,int): + name = _ustr(name) # will always return a str, but use _ustr for consistency + self.__name = name + if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): + if isinstance(toklist,basestring): + toklist = [ toklist ] + if asList: + if isinstance(toklist,ParseResults): + self[name] = _ParseResultsWithOffset(toklist.copy(),0) + else: + self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) + self[name].__name = name + else: + try: + self[name] = toklist[0] + except (KeyError,TypeError,IndexError): + self[name] = toklist + + def __getitem__( self, i ): + if isinstance( i, (int,slice) ): + return self.__toklist[i] + else: + if i not in self.__accumNames: + return self.__tokdict[i][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[i] ]) + + def __setitem__( self, k, v, isinstance=isinstance ): + if isinstance(v,_ParseResultsWithOffset): + self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] + sub = v[0] + elif isinstance(k,(int,slice)): + self.__toklist[k] = v + sub = v + else: + self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] + sub = v + if isinstance(sub,ParseResults): + sub.__parent = wkref(self) + + def __delitem__( self, i ): + if isinstance(i,(int,slice)): + mylen = len( self.__toklist ) + del self.__toklist[i] + + # convert int to slice + if isinstance(i, int): + if i < 0: + i += mylen + i = slice(i, i+1) + # get removed indices + removed = list(range(*i.indices(mylen))) + removed.reverse() + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for j in removed: + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) + else: + del self.__tokdict[i] + + def __contains__( self, k ): + return k in self.__tokdict + + def __len__( self ): return len( self.__toklist ) + def __bool__(self): return ( not not self.__toklist ) + __nonzero__ = __bool__ + def __iter__( self ): return iter( self.__toklist ) + def __reversed__( self ): return iter( self.__toklist[::-1] ) + def _iterkeys( self ): + if hasattr(self.__tokdict, "iterkeys"): + return self.__tokdict.iterkeys() + else: + return iter(self.__tokdict) + + def _itervalues( self ): + return (self[k] for k in self._iterkeys()) + + def _iteritems( self ): + return ((k, self[k]) for k in self._iterkeys()) + + if PY_3: + keys = _iterkeys + """Returns an iterator of all named result keys (Python 3.x only).""" + + values = _itervalues + """Returns an iterator of all named result values (Python 3.x only).""" + + items = _iteritems + """Returns an iterator of all named result key-value tuples (Python 3.x only).""" + + else: + iterkeys = _iterkeys + """Returns an iterator of all named result keys (Python 2.x only).""" + + itervalues = _itervalues + """Returns an iterator of all named result values (Python 2.x only).""" + + iteritems = _iteritems + """Returns an iterator of all named result key-value tuples (Python 2.x only).""" + + def keys( self ): + """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iterkeys()) + + def values( self ): + """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.itervalues()) + + def items( self ): + """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iteritems()) + + def haskeys( self ): + """Since keys() returns an iterator, this method is helpful in bypassing + code that looks for the existence of any defined results names.""" + return bool(self.__tokdict) + + def pop( self, *args, **kwargs): + """ + Removes and returns item at specified index (default=C{last}). + Supports both C{list} and C{dict} semantics for C{pop()}. If passed no + argument or an integer argument, it will use C{list} semantics + and pop tokens from the list of parsed tokens. If passed a + non-integer argument (most likely a string), it will use C{dict} + semantics and pop the corresponding value from any defined + results names. A second default return value argument is + supported, just as in C{dict.pop()}. + + Example:: + def remove_first(tokens): + tokens.pop(0) + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] + + label = Word(alphas) + patt = label("LABEL") + OneOrMore(Word(nums)) + print(patt.parseString("AAB 123 321").dump()) + + # Use pop() in a parse action to remove named result (note that corresponding value is not + # removed from list form of results) + def remove_LABEL(tokens): + tokens.pop("LABEL") + return tokens + patt.addParseAction(remove_LABEL) + print(patt.parseString("AAB 123 321").dump()) + prints:: + ['AAB', '123', '321'] + - LABEL: AAB + + ['AAB', '123', '321'] + """ + if not args: + args = [-1] + for k,v in kwargs.items(): + if k == 'default': + args = (args[0], v) + else: + raise TypeError("pop() got an unexpected keyword argument '%s'" % k) + if (isinstance(args[0], int) or + len(args) == 1 or + args[0] in self): + index = args[0] + ret = self[index] + del self[index] + return ret + else: + defaultvalue = args[1] + return defaultvalue + + def get(self, key, defaultValue=None): + """ + Returns named result matching the given key, or if there is no + such name, then returns the given C{defaultValue} or C{None} if no + C{defaultValue} is specified. + + Similar to C{dict.get()}. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString("1999/12/31") + print(result.get("year")) # -> '1999' + print(result.get("hour", "not specified")) # -> 'not specified' + print(result.get("hour")) # -> None + """ + if key in self: + return self[key] + else: + return defaultValue + + def insert( self, index, insStr ): + """ + Inserts new element at location index in the list of parsed tokens. + + Similar to C{list.insert()}. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to insert the parse location in the front of the parsed results + def insert_locn(locn, tokens): + tokens.insert(0, locn) + print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] + """ + self.__toklist.insert(index, insStr) + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) + + def append( self, item ): + """ + Add single element to end of ParseResults list of elements. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to compute the sum of the parsed integers, and add it to the end + def append_sum(tokens): + tokens.append(sum(map(int, tokens))) + print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] + """ + self.__toklist.append(item) + + def extend( self, itemseq ): + """ + Add sequence of elements to end of ParseResults list of elements. + + Example:: + patt = OneOrMore(Word(alphas)) + + # use a parse action to append the reverse of the matched strings, to make a palindrome + def make_palindrome(tokens): + tokens.extend(reversed([t[::-1] for t in tokens])) + return ''.join(tokens) + print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' + """ + if isinstance(itemseq, ParseResults): + self += itemseq + else: + self.__toklist.extend(itemseq) + + def clear( self ): + """ + Clear all elements and results names. + """ + del self.__toklist[:] + self.__tokdict.clear() + + def __getattr__( self, name ): + try: + return self[name] + except KeyError: + return "" + + if name in self.__tokdict: + if name not in self.__accumNames: + return self.__tokdict[name][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[name] ]) + else: + return "" + + def __add__( self, other ): + ret = self.copy() + ret += other + return ret + + def __iadd__( self, other ): + if other.__tokdict: + offset = len(self.__toklist) + addoffset = lambda a: offset if a<0 else a+offset + otheritems = other.__tokdict.items() + otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) + for (k,vlist) in otheritems for v in vlist] + for k,v in otherdictitems: + self[k] = v + if isinstance(v[0],ParseResults): + v[0].__parent = wkref(self) + + self.__toklist += other.__toklist + self.__accumNames.update( other.__accumNames ) + return self + + def __radd__(self, other): + if isinstance(other,int) and other == 0: + # useful for merging many ParseResults using sum() builtin + return self.copy() + else: + # this may raise a TypeError - so be it + return other + self + + def __repr__( self ): + return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) + + def __str__( self ): + return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' + + def _asStringList( self, sep='' ): + out = [] + for item in self.__toklist: + if out and sep: + out.append(sep) + if isinstance( item, ParseResults ): + out += item._asStringList() + else: + out.append( _ustr(item) ) + return out + + def asList( self ): + """ + Returns the parse results as a nested list of matching tokens, all converted to strings. + + Example:: + patt = OneOrMore(Word(alphas)) + result = patt.parseString("sldkj lsdkj sldkj") + # even though the result prints in string-like form, it is actually a pyparsing ParseResults + print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] + + # Use asList() to create an actual list + result_list = result.asList() + print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] + """ + return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] + + def asDict( self ): + """ + Returns the named parse results as a nested dictionary. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) + + result_dict = result.asDict() + print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} + + # even though a ParseResults supports dict-like access, sometime you just need to have a dict + import json + print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable + print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} + """ + if PY_3: + item_fn = self.items + else: + item_fn = self.iteritems + + def toItem(obj): + if isinstance(obj, ParseResults): + if obj.haskeys(): + return obj.asDict() + else: + return [toItem(v) for v in obj] + else: + return obj + + return dict((k,toItem(v)) for k,v in item_fn()) + + def copy( self ): + """ + Returns a new copy of a C{ParseResults} object. + """ + ret = ParseResults( self.__toklist ) + ret.__tokdict = self.__tokdict.copy() + ret.__parent = self.__parent + ret.__accumNames.update( self.__accumNames ) + ret.__name = self.__name + return ret + + def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): + """ + (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. + """ + nl = "\n" + out = [] + namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() + for v in vlist) + nextLevelIndent = indent + " " + + # collapse out indents if formatting is not desired + if not formatted: + indent = "" + nextLevelIndent = "" + nl = "" + + selfTag = None + if doctag is not None: + selfTag = doctag + else: + if self.__name: + selfTag = self.__name + + if not selfTag: + if namedItemsOnly: + return "" + else: + selfTag = "ITEM" + + out += [ nl, indent, "<", selfTag, ">" ] + + for i,res in enumerate(self.__toklist): + if isinstance(res,ParseResults): + if i in namedItems: + out += [ res.asXML(namedItems[i], + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + out += [ res.asXML(None, + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + # individual token, see if there is a name for it + resTag = None + if i in namedItems: + resTag = namedItems[i] + if not resTag: + if namedItemsOnly: + continue + else: + resTag = "ITEM" + xmlBodyText = _xml_escape(_ustr(res)) + out += [ nl, nextLevelIndent, "<", resTag, ">", + xmlBodyText, + "</", resTag, ">" ] + + out += [ nl, indent, "</", selfTag, ">" ] + return "".join(out) + + def __lookup(self,sub): + for k,vlist in self.__tokdict.items(): + for v,loc in vlist: + if sub is v: + return k + return None + + def getName(self): + r""" + Returns the results name for this token expression. Useful when several + different expressions might match at a particular location. + + Example:: + integer = Word(nums) + ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") + house_number_expr = Suppress('#') + Word(nums, alphanums) + user_data = (Group(house_number_expr)("house_number") + | Group(ssn_expr)("ssn") + | Group(integer)("age")) + user_info = OneOrMore(user_data) + + result = user_info.parseString("22 111-22-3333 #221B") + for item in result: + print(item.getName(), ':', item[0]) + prints:: + age : 22 + ssn : 111-22-3333 + house_number : 221B + """ + if self.__name: + return self.__name + elif self.__parent: + par = self.__parent() + if par: + return par.__lookup(self) + else: + return None + elif (len(self) == 1 and + len(self.__tokdict) == 1 and + next(iter(self.__tokdict.values()))[0][1] in (0,-1)): + return next(iter(self.__tokdict.keys())) + else: + return None + + def dump(self, indent='', depth=0, full=True): + """ + Diagnostic method for listing out the contents of a C{ParseResults}. + Accepts an optional C{indent} argument so that this string can be embedded + in a nested display of other data. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(result.dump()) + prints:: + ['12', '/', '31', '/', '1999'] + - day: 1999 + - month: 31 + - year: 12 + """ + out = [] + NL = '\n' + out.append( indent+_ustr(self.asList()) ) + if full: + if self.haskeys(): + items = sorted((str(k), v) for k,v in self.items()) + for k,v in items: + if out: + out.append(NL) + out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) + if isinstance(v,ParseResults): + if v: + out.append( v.dump(indent,depth+1) ) + else: + out.append(_ustr(v)) + else: + out.append(repr(v)) + elif any(isinstance(vv,ParseResults) for vv in self): + v = self + for i,vv in enumerate(v): + if isinstance(vv,ParseResults): + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) + else: + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) + + return "".join(out) + + def pprint(self, *args, **kwargs): + """ + Pretty-printer for parsed results as a list, using the C{pprint} module. + Accepts additional positional or keyword args as defined for the + C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint}) + + Example:: + ident = Word(alphas, alphanums) + num = Word(nums) + func = Forward() + term = ident | num | Group('(' + func + ')') + func <<= ident + Group(Optional(delimitedList(term))) + result = func.parseString("fna a,b,(fnb c,d,200),100") + result.pprint(width=40) + prints:: + ['fna', + ['a', + 'b', + ['(', 'fnb', ['c', 'd', '200'], ')'], + '100']] + """ + pprint.pprint(self.asList(), *args, **kwargs) + + # add support for pickle protocol + def __getstate__(self): + return ( self.__toklist, + ( self.__tokdict.copy(), + self.__parent is not None and self.__parent() or None, + self.__accumNames, + self.__name ) ) + + def __setstate__(self,state): + self.__toklist = state[0] + (self.__tokdict, + par, + inAccumNames, + self.__name) = state[1] + self.__accumNames = {} + self.__accumNames.update(inAccumNames) + if par is not None: + self.__parent = wkref(par) + else: + self.__parent = None + + def __getnewargs__(self): + return self.__toklist, self.__name, self.__asList, self.__modal + + def __dir__(self): + return (dir(type(self)) + list(self.keys())) + +MutableMapping.register(ParseResults) + +def col (loc,strg): + """Returns current column within a string, counting newlines as line separators. + The first column is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + s = strg + return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) + +def lineno(loc,strg): + """Returns current line number within a string, counting newlines as line separators. + The first line is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + return strg.count("\n",0,loc) + 1 + +def line( loc, strg ): + """Returns the line of text containing loc within a string, counting newlines as line separators. + """ + lastCR = strg.rfind("\n", 0, loc) + nextCR = strg.find("\n", loc) + if nextCR >= 0: + return strg[lastCR+1:nextCR] + else: + return strg[lastCR+1:] + +def _defaultStartDebugAction( instring, loc, expr ): + print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) + +def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): + print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) + +def _defaultExceptionDebugAction( instring, loc, expr, exc ): + print ("Exception raised:" + _ustr(exc)) + +def nullDebugAction(*args): + """'Do-nothing' debug action, to suppress debugging output during parsing.""" + pass + +# Only works on Python 3.x - nonlocal is toxic to Python 2 installs +#~ 'decorator to trim function calls to match the arity of the target' +#~ def _trim_arity(func, maxargs=3): + #~ if func in singleArgBuiltins: + #~ return lambda s,l,t: func(t) + #~ limit = 0 + #~ foundArity = False + #~ def wrapper(*args): + #~ nonlocal limit,foundArity + #~ while 1: + #~ try: + #~ ret = func(*args[limit:]) + #~ foundArity = True + #~ return ret + #~ except TypeError: + #~ if limit == maxargs or foundArity: + #~ raise + #~ limit += 1 + #~ continue + #~ return wrapper + +# this version is Python 2.x-3.x cross-compatible +'decorator to trim function calls to match the arity of the target' +def _trim_arity(func, maxargs=2): + if func in singleArgBuiltins: + return lambda s,l,t: func(t) + limit = [0] + foundArity = [False] + + # traceback return data structure changed in Py3.5 - normalize back to plain tuples + if system_version[:2] >= (3,5): + def extract_stack(limit=0): + # special handling for Python 3.5.0 - extra deep call stack by 1 + offset = -3 if system_version == (3,5,0) else -2 + frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] + return [frame_summary[: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 = ParserElement.DEFAULT_WHITE_CHARS + self.copyDefaultWhiteChars = True + self.mayReturnEmpty = False # used when checking for left-recursion + self.keepTabs = False + self.ignoreExprs = list() + self.debug = False + self.streamlined = False + self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index + self.errmsg = "" + self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) + self.debugActions = ( None, None, None ) #custom debug actions + self.re = None + self.callPreparse = True # used to avoid redundant calls to preParse + self.callDuringTry = False + + def copy( self ): + """ + Make a copy of this C{ParserElement}. Useful for defining different parse actions + for the same parsing pattern, using copies of the original parse element. + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") + integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + + print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) + prints:: + [5120, 100, 655360, 268435456] + Equivalent form of C{expr.copy()} is just C{expr()}:: + integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + """ + cpy = copy.copy( self ) + cpy.parseAction = self.parseAction[:] + cpy.ignoreExprs = self.ignoreExprs[:] + if self.copyDefaultWhiteChars: + cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + return cpy + + def setName( self, name ): + """ + Define name for this expression, makes debugging and exception messages clearer. + + Example:: + Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) + Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) + """ + self.name = name + self.errmsg = "Expected " + self.name + if hasattr(self,"exception"): + self.exception.msg = self.errmsg + return self + + def setResultsName( self, name, listAllMatches=False ): + """ + Define name for referencing matching tokens as a nested attribute + of the returned parse results. + NOTE: this returns a *copy* of the original C{ParserElement} object; + this is so that the client can define a basic element, such as an + integer, and reference it in multiple places with different names. + + You can also set results names using the abbreviated syntax, + C{expr("name")} in place of C{expr.setResultsName("name")} - + see L{I{__call__}<__call__>}. + + Example:: + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + + # equivalent form: + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + """ + newself = self.copy() + if name.endswith("*"): + name = name[:-1] + listAllMatches=True + newself.resultsName = name + newself.modalResults = not listAllMatches + return newself + + def setBreak(self,breakFlag = True): + """Method to invoke the Python pdb debugger when this element is + about to be parsed. Set C{breakFlag} to True to enable, False to + disable. + """ + if breakFlag: + _parseMethod = self._parse + def breaker(instring, loc, doActions=True, callPreParse=True): + import pdb + pdb.set_trace() + return _parseMethod( instring, loc, doActions, callPreParse ) + breaker._originalParseMethod = _parseMethod + self._parse = breaker + else: + if hasattr(self._parse,"_originalParseMethod"): + self._parse = self._parse._originalParseMethod + return self + + def setParseAction( self, *fns, **kwargs ): + """ + Define one or more actions to perform when successfully matching parse element definition. + Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, + C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: + - s = the original string being parsed (see note below) + - loc = the location of the matching substring + - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object + If the functions in fns modify the tokens, they can return them as the return + value from fn, and the modified list of tokens will replace the original. + Otherwise, fn does not need to return any value. + + Optional keyword arguments: + - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{parseString}<parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + + Example:: + integer = Word(nums) + date_str = integer + '/' + integer + '/' + integer + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + # use parse action to convert to ints at parse time + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + date_str = integer + '/' + integer + '/' + integer + + # note that integer fields are now ints, not strings + date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] + """ + self.parseAction = list(map(_trim_arity, list(fns))) + self.callDuringTry = kwargs.get("callDuringTry", False) + return self + + def addParseAction( self, *fns, **kwargs ): + """ + Add one or more parse actions to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}. + + See examples in L{I{copy}<copy>}. + """ + self.parseAction += list(map(_trim_arity, list(fns))) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def addCondition(self, *fns, **kwargs): + """Add a boolean predicate function to expression's list of parse actions. See + L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, + functions passed to C{addCondition} need to return boolean success/fail of the condition. + + Optional keyword arguments: + - message = define a custom message to be used in the raised exception + - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + year_int = integer.copy() + year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") + date_str = year_int + '/' + integer + '/' + integer + + result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) + """ + msg = kwargs.get("message", "failed user-defined condition") + exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException + for fn in fns: + def pa(s,l,t): + if not bool(_trim_arity(fn)(s,l,t)): + raise exc_type(s,l,msg) + self.parseAction.append(pa) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def setFailAction( self, fn ): + """Define action to perform if parsing fails at this expression. + Fail acton fn is a callable function that takes the arguments + C{fn(s,loc,expr,err)} where: + - s = string being parsed + - loc = location where expression match was attempted and failed + - expr = the parse expression that failed + - err = the exception thrown + The function returns no value. It may throw C{L{ParseFatalException}} + if it is desired to stop parsing immediately.""" + self.failAction = fn + return self + + def _skipIgnorables( self, instring, loc ): + exprsFound = True + while exprsFound: + exprsFound = False + for e in self.ignoreExprs: + try: + while 1: + loc,dummy = e._parse( instring, loc ) + exprsFound = True + except ParseException: + pass + return loc + + def preParse( self, instring, loc ): + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + + if self.skipWhitespace: + wt = self.whiteChars + instrlen = len(instring) + while loc < instrlen and instring[loc] in wt: + loc += 1 + + return loc + + def parseImpl( self, instring, loc, doActions=True ): + return loc, [] + + def postParse( self, instring, loc, tokenlist ): + return tokenlist + + #~ @profile + def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): + debugging = ( self.debug ) #and doActions ) + + if debugging or self.failAction: + #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) + if (self.debugActions[0] ): + self.debugActions[0]( instring, loc, self ) + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + try: + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + except ParseBaseException as err: + #~ print ("Exception raised:", err) + if self.debugActions[2]: + self.debugActions[2]( instring, tokensStart, self, err ) + if self.failAction: + self.failAction( instring, tokensStart, self, err ) + raise + else: + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + if self.mayIndexError or 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: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + except ParseBaseException as err: + #~ print "Exception raised in user parse action:", err + if (self.debugActions[2] ): + self.debugActions[2]( instring, tokensStart, self, err ) + raise + else: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + if debugging: + #~ print ("Matched",self,"->",retTokens.asList()) + if (self.debugActions[1] ): + self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) + + return loc, retTokens + + def tryParse( self, instring, loc ): + try: + return self._parse( instring, loc, doActions=False )[0] + except ParseFatalException: + raise ParseException( instring, loc, self.errmsg, self) + + def canParseNext(self, instring, loc): + try: + self.tryParse(instring, loc) + except (ParseException, IndexError): + return False + else: + return True + + class _UnboundedCache(object): + def __init__(self): + cache = {} + self.not_in_cache = not_in_cache = object() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + if _OrderedDict is not None: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = _OrderedDict() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(cache) > size: + try: + cache.popitem(False) + except KeyError: + pass + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + else: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = {} + key_fifo = collections.deque([], size) + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(key_fifo) > size: + cache.pop(key_fifo.popleft(), None) + key_fifo.append(key) + + def clear(self): + cache.clear() + key_fifo.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + # argument cache for optimizing repeated calls when backtracking through recursive expressions + packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail + packrat_cache_lock = RLock() + packrat_cache_stats = [0, 0] + + # this method gets repeatedly called during backtracking with the same arguments - + # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression + def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): + HIT, MISS = 0, 1 + lookup = (self, instring, loc, callPreParse, doActions) + with ParserElement.packrat_cache_lock: + cache = ParserElement.packrat_cache + value = cache.get(lookup) + if value is cache.not_in_cache: + ParserElement.packrat_cache_stats[MISS] += 1 + try: + value = self._parseNoCache(instring, loc, doActions, callPreParse) + except ParseBaseException as pe: + # cache a copy of the exception, without the traceback + cache.set(lookup, pe.__class__(*pe.args)) + raise + else: + cache.set(lookup, (value[0], value[1].copy())) + return value + else: + ParserElement.packrat_cache_stats[HIT] += 1 + if isinstance(value, Exception): + raise value + return (value[0], value[1].copy()) + + _parse = _parseNoCache + + @staticmethod + def resetCache(): + ParserElement.packrat_cache.clear() + ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) + + _packratEnabled = False + @staticmethod + def enablePackrat(cache_size_limit=128): + """Enables "packrat" parsing, which adds memoizing to the parsing logic. + Repeated parse attempts at the same string location (which happens + often in many complex grammars) can immediately return a cached value, + instead of re-executing parsing/validating code. Memoizing is done of + both valid results and parsing exceptions. + + Parameters: + - cache_size_limit - (default=C{128}) - if an integer value is provided + will limit the size of the packrat cache; if None is passed, then + the cache size will be unbounded; if 0 is passed, the cache will + be effectively disabled. + + This speedup may break existing programs that use parse actions that + have side-effects. For this reason, packrat parsing is disabled when + you first import pyparsing. To activate the packrat feature, your + program must call the class method C{ParserElement.enablePackrat()}. If + your program uses C{psyco} to "compile as you go", you must call + C{enablePackrat} before calling C{psyco.full()}. If you do not do this, + Python will crash. For best results, call C{enablePackrat()} immediately + after importing pyparsing. + + Example:: + import pyparsing + pyparsing.ParserElement.enablePackrat() + """ + if not ParserElement._packratEnabled: + ParserElement._packratEnabled = True + if cache_size_limit is None: + ParserElement.packrat_cache = ParserElement._UnboundedCache() + else: + ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) + ParserElement._parse = ParserElement._parseCache + + def parseString( self, instring, parseAll=False ): + """ + Execute the parse expression with the given string. + This is the main interface to the client code, once the complete + expression has been built. + + If you want the grammar to require that the entire input string be + successfully parsed, then set C{parseAll} to True (equivalent to ending + the grammar with C{L{StringEnd()}}). + + Note: C{parseString} implicitly calls C{expandtabs()} on the input string, + in order to report proper column numbers in parse actions. + If the input string contains tabs and + the grammar uses parse actions that use the C{loc} argument to index into the + string being parsed, you can ensure you have a consistent view of the input + string by: + - calling C{parseWithTabs} on your grammar before calling C{parseString} + (see L{I{parseWithTabs}<parseWithTabs>}) + - define your parse action using the full C{(s,loc,toks)} signature, and + reference the input string using the parse action's C{s} argument + - explictly expand the tabs in your input string before calling + C{parseString} + + Example:: + Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] + Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text + """ + ParserElement.resetCache() + if not self.streamlined: + self.streamline() + #~ self.saveAsList = True + for e in self.ignoreExprs: + e.streamline() + if not self.keepTabs: + instring = instring.expandtabs() + try: + loc, tokens = self._parse( instring, 0 ) + if parseAll: + loc = self.preParse( instring, loc ) + se = Empty() + StringEnd() + se._parse( instring, loc ) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + else: + return tokens + + def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): + """ + Scan the input string for expression matches. Each match will return the + matching tokens, start location, and end location. May be called with optional + C{maxMatches} argument, to clip scanning after 'n' matches are found. If + C{overlap} is specified, then overlapping matches will be reported. + + Note that the start and end locations are reported relative to the string + being parsed. See L{I{parseString}<parseString>} for more information on parsing + strings with embedded tabs. + + Example:: + source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" + print(source) + for tokens,start,end in Word(alphas).scanString(source): + print(' '*start + '^'*(end-start)) + print(' '*start + tokens[0]) + + prints:: + + sldjf123lsdjjkf345sldkjf879lkjsfd987 + ^^^^^ + sldjf + ^^^^^^^ + lsdjjkf + ^^^^^^ + sldkjf + ^^^^^^ + lkjsfd + """ + if not self.streamlined: + self.streamline() + for e in self.ignoreExprs: + e.streamline() + + if not self.keepTabs: + instring = _ustr(instring).expandtabs() + instrlen = len(instring) + loc = 0 + preparseFn = self.preParse + parseFn = self._parse + ParserElement.resetCache() + matches = 0 + try: + while loc <= instrlen and matches < maxMatches: + try: + preloc = preparseFn( instring, loc ) + nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) + except ParseException: + loc = preloc+1 + else: + if nextLoc > loc: + matches += 1 + yield tokens, preloc, nextLoc + if overlap: + nextloc = preparseFn( instring, loc ) + if nextloc > loc: + loc = nextLoc + else: + loc += 1 + else: + loc = nextLoc + else: + loc = preloc+1 + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def transformString( self, instring ): + """ + Extension to C{L{scanString}}, to modify matching text with modified tokens that may + be returned from a parse action. To use C{transformString}, define a grammar and + attach a parse action to it that modifies the returned token list. + Invoking C{transformString()} on a target string will then scan for matches, + and replace the matched text patterns according to the logic in the parse + action. C{transformString()} returns the resulting transformed string. + + Example:: + wd = Word(alphas) + wd.setParseAction(lambda toks: toks[0].title()) + + print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) + Prints:: + Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. + """ + out = [] + lastE = 0 + # force preservation of <TAB>s, to minimize unwanted transformation of string, and to + # keep string locs straight between transformString and scanString + self.keepTabs = True + try: + for t,s,e in self.scanString( instring ): + out.append( instring[lastE:s] ) + if t: + if isinstance(t,ParseResults): + out += t.asList() + elif isinstance(t,list): + out += t + else: + out.append(t) + lastE = e + out.append(instring[lastE:]) + out = [o for o in out if o] + return "".join(map(_ustr,_flatten(out))) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def searchString( self, instring, maxMatches=_MAX_INT ): + """ + Another extension to C{L{scanString}}, simplifying the access to the tokens found + to match the given parse expression. May be called with optional + C{maxMatches} argument, to clip searching after 'n' matches are found. + + Example:: + # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters + cap_word = Word(alphas.upper(), alphas.lower()) + + print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) + + # the sum() builtin can be used to merge results into a single ParseResults object + print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))) + prints:: + [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] + ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] + """ + try: + return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): + """ + Generator method to split a string using the given expression as a separator. + May be called with optional C{maxsplit} argument, to limit the number of splits; + and the optional C{includeSeparators} argument (default=C{False}), if the separating + matching text should be included in the split results. + + Example:: + punc = oneOf(list(".,;:/-!?")) + print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) + prints:: + ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] + """ + splits = 0 + last = 0 + for t,s,e in self.scanString(instring, maxMatches=maxsplit): + yield instring[last:s] + if includeSeparators: + yield t[0] + last = e + yield instring[last:] + + def __add__(self, other ): + """ + Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement + converts them to L{Literal}s by default. + + Example:: + greet = Word(alphas) + "," + Word(alphas) + "!" + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + Prints:: + Hello, World! -> ['Hello', ',', 'World', '!'] + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return And( [ self, other ] ) + + def __radd__(self, other ): + """ + Implementation of + operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other + self + + def __sub__(self, other): + """ + Implementation of - operator, returns C{L{And}} with error stop + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return self + And._ErrorStop() + other + + def __rsub__(self, other ): + """ + Implementation of - operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other - self + + def __mul__(self,other): + """ + Implementation of * operator, allows use of C{expr * 3} in place of + C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer + tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples + may also include C{None} as in: + - C{expr*(n,None)} or C{expr*(n,)} is equivalent + to C{expr*n + L{ZeroOrMore}(expr)} + (read as "at least n instances of C{expr}") + - C{expr*(None,n)} is equivalent to C{expr*(0,n)} + (read as "0 to n instances of C{expr}") + - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} + - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} + + Note that C{expr*(None,n)} does not raise an exception if + more than n exprs exist in the input stream; that is, + C{expr*(None,n)} does not enforce a maximum number of expr + occurrences. If this behavior is desired, then write + C{expr*(None,n) + ~expr} + """ + if isinstance(other,int): + minElements, optElements = other,0 + elif isinstance(other,tuple): + other = (other + (None, None))[:2] + if other[0] is None: + other = (0, other[1]) + if isinstance(other[0],int) and other[1] is None: + if other[0] == 0: + return ZeroOrMore(self) + if other[0] == 1: + return OneOrMore(self) + else: + return self*other[0] + ZeroOrMore(self) + elif isinstance(other[0],int) and isinstance(other[1],int): + minElements, optElements = other + optElements -= minElements + else: + raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) + else: + raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) + + if minElements < 0: + raise ValueError("cannot multiply ParserElement by negative value") + if optElements < 0: + raise ValueError("second tuple value must be greater or equal to first tuple value") + if minElements == optElements == 0: + raise ValueError("cannot multiply ParserElement by 0 or (0,0)") + + if (optElements): + def makeOptionalList(n): + if n>1: + return Optional(self + makeOptionalList(n-1)) + else: + return Optional(self) + if minElements: + if minElements == 1: + ret = self + makeOptionalList(optElements) + else: + ret = And([self]*minElements) + makeOptionalList(optElements) + else: + ret = makeOptionalList(optElements) + else: + if minElements == 1: + ret = self + else: + ret = And([self]*minElements) + return ret + + def __rmul__(self, other): + return self.__mul__(other) + + def __or__(self, other ): + """ + Implementation of | operator - returns C{L{MatchFirst}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return MatchFirst( [ self, other ] ) + + def __ror__(self, other ): + """ + Implementation of | operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other | self + + def __xor__(self, other ): + """ + Implementation of ^ operator - returns C{L{Or}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Or( [ self, other ] ) + + def __rxor__(self, other ): + """ + Implementation of ^ operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other ^ self + + def __and__(self, other ): + """ + Implementation of & operator - returns C{L{Each}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Each( [ self, other ] ) + + def __rand__(self, other ): + """ + Implementation of & operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other & self + + def __invert__( self ): + """ + Implementation of ~ operator - returns C{L{NotAny}} + """ + return NotAny( self ) + + def __call__(self, name=None): + """ + Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}. + + If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be + passed as C{True}. + + If C{name} is omitted, same as calling C{L{copy}}. + + Example:: + # these are equivalent + userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") + userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") + """ + if name is not None: + return self.setResultsName(name) + else: + return self.copy() + + def suppress( self ): + """ + Suppresses the output of this C{ParserElement}; useful to keep punctuation from + cluttering up returned output. + """ + return Suppress( self ) + + def leaveWhitespace( self ): + """ + Disables the skipping of whitespace before matching the characters in the + C{ParserElement}'s defined pattern. This is normally only used internally by + the pyparsing module, but may be needed in some whitespace-sensitive grammars. + """ + self.skipWhitespace = False + return self + + def setWhitespaceChars( self, chars ): + """ + Overrides the default whitespace chars + """ + self.skipWhitespace = True + self.whiteChars = chars + self.copyDefaultWhiteChars = False + return self + + def parseWithTabs( self ): + """ + Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string. + Must be called before C{parseString} when the input grammar contains elements that + match C{<TAB>} characters. + """ + self.keepTabs = True + return self + + def ignore( self, other ): + """ + Define expression to be ignored (e.g., comments) while doing pattern + matching; may be called repeatedly, to define multiple comment or other + ignorable patterns. + + Example:: + patt = OneOrMore(Word(alphas)) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] + + patt.ignore(cStyleComment) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] + """ + if isinstance(other, basestring): + other = Suppress(other) + + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + self.ignoreExprs.append(other) + else: + self.ignoreExprs.append( Suppress( other.copy() ) ) + return self + + def setDebugActions( self, startAction, successAction, exceptionAction ): + """ + Enable display of debugging messages while doing pattern matching. + """ + self.debugActions = (startAction or _defaultStartDebugAction, + successAction or _defaultSuccessDebugAction, + exceptionAction or _defaultExceptionDebugAction) + self.debug = True + return self + + def setDebug( self, flag=True ): + """ + Enable display of debugging messages while doing pattern matching. + Set C{flag} to True to enable, False to disable. + + Example:: + wd = Word(alphas).setName("alphaword") + integer = Word(nums).setName("numword") + term = wd | integer + + # turn on debugging for wd + wd.setDebug() + + OneOrMore(term).parseString("abc 123 xyz 890") + + prints:: + Match alphaword at loc 0(1,1) + Matched alphaword -> ['abc'] + Match alphaword at loc 3(1,4) + Exception raised:Expected alphaword (at char 4), (line:1, col:5) + Match alphaword at loc 7(1,8) + Matched alphaword -> ['xyz'] + Match alphaword at loc 11(1,12) + Exception raised:Expected alphaword (at char 12), (line:1, col:13) + Match alphaword at loc 15(1,16) + Exception raised:Expected alphaword (at char 15), (line:1, col:16) + + The output shown is that produced by the default debug actions - custom debug actions can be + specified using L{setDebugActions}. Prior to attempting + to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"} + is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"} + message is shown. Also note the use of L{setName} to assign a human-readable name to the expression, + which makes debugging and exception messages easier to understand - for instance, the default + name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}. + """ + if flag: + self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) + else: + self.debug = False + return self + + def __str__( self ): + return self.name + + def __repr__( self ): + return _ustr(self) + + def streamline( self ): + self.streamlined = True + self.strRepr = None + return self + + def checkRecursion( self, parseElementList ): + pass + + def validate( self, validateTrace=[] ): + """ + Check defined expressions for valid structure, check for infinite recursive definitions. + """ + self.checkRecursion( [] ) + + def parseFile( self, file_or_filename, parseAll=False ): + """ + Execute the parse expression on the given file or filename. + If a filename is specified (instead of a file object), + the entire file is opened, read, and closed before parsing. + """ + try: + file_contents = file_or_filename.read() + except AttributeError: + with open(file_or_filename, "r") as f: + file_contents = f.read() + try: + return self.parseString(file_contents, parseAll) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def __eq__(self,other): + if isinstance(other, ParserElement): + return self is other or vars(self) == vars(other) + elif isinstance(other, basestring): + return self.matches(other) + else: + return super(ParserElement,self)==other + + def __ne__(self,other): + return not (self == other) + + def __hash__(self): + return hash(id(self)) + + def __req__(self,other): + return self == other + + def __rne__(self,other): + return not (self == other) + + def matches(self, testString, parseAll=True): + """ + Method for quick testing of a parser against a test string. Good for simple + inline microtests of sub expressions while building up larger parser. + + Parameters: + - testString - to test against this expression for a match + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + + Example:: + expr = Word(nums) + assert expr.matches("100") + """ + try: + self.parseString(_ustr(testString), parseAll=parseAll) + return True + except ParseBaseException: + return False + + def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False): + """ + Execute the parse expression on a series of test strings, showing each + test, the parsed results or where the parse failed. Quick and easy way to + run a parse expression against a list of sample strings. + + Parameters: + - tests - a list of separate test strings, or a multiline string of test strings + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + - comment - (default=C{'#'}) - expression for indicating embedded comments in the test + string; pass None to disable comment filtering + - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline; + if False, only dump nested list + - printResults - (default=C{True}) prints test output to stdout + - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing + + Returns: a (success, results) tuple, where success indicates that all tests succeeded + (or failed if C{failureTests} is True), and the results contain a list of lines of each + test's output + + Example:: + number_expr = pyparsing_common.number.copy() + + result = number_expr.runTests(''' + # unsigned integer + 100 + # negative integer + -100 + # float with scientific notation + 6.02e23 + # integer with scientific notation + 1e-12 + ''') + print("Success" if result[0] else "Failed!") + + result = number_expr.runTests(''' + # stray character + 100Z + # missing leading digit before '.' + -.100 + # too many '.' + 3.14.159 + ''', failureTests=True) + print("Success" if result[0] else "Failed!") + prints:: + # unsigned integer + 100 + [100] + + # negative integer + -100 + [-100] + + # float with scientific notation + 6.02e23 + [6.02e+23] + + # integer with scientific notation + 1e-12 + [1e-12] + + Success + + # stray character + 100Z + ^ + FAIL: Expected end of text (at char 3), (line:1, col:4) + + # missing leading digit before '.' + -.100 + ^ + FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) + + # too many '.' + 3.14.159 + ^ + FAIL: Expected end of text (at char 4), (line:1, col:5) + + Success + + Each test string must be on a single line. If you want to test a string that spans multiple + lines, create a test like this:: + + expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") + + (Note that this is a raw string literal, you must include the leading 'r'.) + """ + if isinstance(tests, basestring): + tests = list(map(str.strip, tests.rstrip().splitlines())) + if isinstance(comment, basestring): + comment = Literal(comment) + allResults = [] + comments = [] + success = True + for t in tests: + if comment is not None and comment.matches(t, False) or comments and not t: + comments.append(t) + continue + if not t: + continue + out = ['\n'.join(comments), t] + comments = [] + try: + t = t.replace(r'\n','\n') + result = self.parseString(t, parseAll=parseAll) + out.append(result.dump(full=fullDump)) + success = success and not failureTests + except ParseBaseException as pe: + fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" + if '\n' in t: + out.append(line(pe.loc, t)) + out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) + else: + out.append(' '*pe.loc + '^' + fatal) + out.append("FAIL: " + str(pe)) + success = success and failureTests + result = pe + except Exception as exc: + out.append("FAIL-EXCEPTION: " + str(exc)) + success = success and failureTests + result = exc + + if printResults: + if fullDump: + out.append('') + print('\n'.join(out)) + + allResults.append((t, result)) + + return success, allResults + + +class Token(ParserElement): + """ + Abstract C{ParserElement} subclass, for defining atomic matching patterns. + """ + def __init__( self ): + super(Token,self).__init__( savelist=False ) + + +class Empty(Token): + """ + An empty token, will always match. + """ + def __init__( self ): + super(Empty,self).__init__() + self.name = "Empty" + self.mayReturnEmpty = True + self.mayIndexError = False + + +class NoMatch(Token): + """ + A token that will never match. + """ + def __init__( self ): + super(NoMatch,self).__init__() + self.name = "NoMatch" + self.mayReturnEmpty = True + self.mayIndexError = False + self.errmsg = "Unmatchable token" + + def parseImpl( self, instring, loc, doActions=True ): + raise ParseException(instring, loc, self.errmsg, self) + + +class Literal(Token): + """ + Token to exactly match a specified string. + + Example:: + Literal('blah').parseString('blah') # -> ['blah'] + Literal('blah').parseString('blahfooblah') # -> ['blah'] + Literal('blah').parseString('bla') # -> Exception: Expected "blah" + + For case-insensitive matching, use L{CaselessLiteral}. + + For keyword matching (force word break before and after the matched string), + use L{Keyword} or L{CaselessKeyword}. + """ + def __init__( self, matchString ): + super(Literal,self).__init__() + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Literal; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.__class__ = Empty + self.name = '"%s"' % _ustr(self.match) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + + # Performance tuning: this routine gets called a *lot* + # if this is a single character match string and the first character matches, + # short-circuit as quickly as possible, and avoid calling startswith + #~ @profile + def parseImpl( self, instring, loc, doActions=True ): + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) +_L = Literal +ParserElement._literalStringClass = Literal + +class Keyword(Token): + """ + Token to exactly match a specified string as a keyword, that is, it must be + immediately followed by a non-keyword character. Compare with C{L{Literal}}: + - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}. + - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} + Accepts two optional constructor arguments in addition to the keyword string: + - C{identChars} is a string of characters that would be valid identifier characters, + defaulting to all alphanumerics + "_" and "$" + - C{caseless} allows case-insensitive matching, default is C{False}. + + Example:: + Keyword("start").parseString("start") # -> ['start'] + Keyword("start").parseString("starting") # -> Exception + + For case-insensitive matching, use L{CaselessKeyword}. + """ + DEFAULT_KEYWORD_CHARS = alphanums+"_$" + + def __init__( self, matchString, identChars=None, caseless=False ): + super(Keyword,self).__init__() + if identChars is None: + identChars = Keyword.DEFAULT_KEYWORD_CHARS + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Keyword; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.name = '"%s"' % self.match + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + self.caseless = caseless + if caseless: + self.caselessmatch = matchString.upper() + identChars = identChars.upper() + self.identChars = set(identChars) + + def parseImpl( self, instring, loc, doActions=True ): + if self.caseless: + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and + (loc == 0 or instring[loc-1].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + else: + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and + (loc == 0 or instring[loc-1] not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + + def copy(self): + c = super(Keyword,self).copy() + c.identChars = Keyword.DEFAULT_KEYWORD_CHARS + return c + + @staticmethod + def setDefaultKeywordChars( chars ): + """Overrides the default Keyword chars + """ + Keyword.DEFAULT_KEYWORD_CHARS = chars + +class CaselessLiteral(Literal): + """ + Token to match a specified string, ignoring case of letters. + Note: the matched results will always be in the case of the given + match string, NOT the case of the input text. + + Example:: + OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] + + (Contrast with example for L{CaselessKeyword}.) + """ + def __init__( self, matchString ): + super(CaselessLiteral,self).__init__( matchString.upper() ) + # Preserve the defining literal. + self.returnString = matchString + self.name = "'%s'" % self.returnString + self.errmsg = "Expected " + self.name + + def parseImpl( self, instring, loc, doActions=True ): + if instring[ loc:loc+self.matchLen ].upper() == self.match: + return loc+self.matchLen, self.returnString + raise ParseException(instring, loc, self.errmsg, self) + +class CaselessKeyword(Keyword): + """ + Caseless version of L{Keyword}. + + Example:: + OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] + + (Contrast with example for L{CaselessLiteral}.) + """ + def __init__( self, matchString, identChars=None ): + super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) + + def parseImpl( self, instring, loc, doActions=True ): + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + +class CloseMatch(Token): + """ + A variation on L{Literal} which matches "close" matches, that is, + strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters: + - C{match_string} - string to be matched + - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match + + The results from a successful parse will contain the matched text from the input string and the following named results: + - C{mismatches} - a list of the positions within the match_string where mismatches were found + - C{original} - the original match_string used to compare against the input string + + If C{mismatches} is an empty list, then the match was an exact match. + + Example:: + patt = CloseMatch("ATCATCGAATGGA") + patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) + patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) + + # exact match + patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) + + # close match allowing up to 2 mismatches + patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) + patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) + """ + def __init__(self, match_string, maxMismatches=1): + super(CloseMatch,self).__init__() + self.name = match_string + self.match_string = match_string + self.maxMismatches = maxMismatches + self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) + self.mayIndexError = False + self.mayReturnEmpty = False + + def parseImpl( self, instring, loc, doActions=True ): + start = loc + instrlen = len(instring) + maxloc = start + len(self.match_string) + + if maxloc <= instrlen: + match_string = self.match_string + match_stringloc = 0 + mismatches = [] + maxMismatches = self.maxMismatches + + for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): + src,mat = s_m + if src != mat: + mismatches.append(match_stringloc) + if len(mismatches) > maxMismatches: + break + else: + loc = match_stringloc + 1 + results = ParseResults([instring[start:loc]]) + results['original'] = self.match_string + results['mismatches'] = mismatches + return loc, results + + raise ParseException(instring, loc, self.errmsg, self) + + +class Word(Token): + """ + Token for matching words composed of allowed character sets. + Defined with string containing all allowed initial characters, + an optional string containing allowed body characters (if omitted, + defaults to the initial character set), and an optional minimum, + maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. An optional + C{excludeChars} parameter can list characters that might be found in + the input C{bodyChars} string; useful to define a word of all printables + except for one or two characters, for instance. + + L{srange} is useful for defining custom character set strings for defining + C{Word} expressions, using range notation from regular expression character sets. + + A common mistake is to use C{Word} to match a specific literal string, as in + C{Word("Address")}. Remember that C{Word} uses the string argument to define + I{sets} of matchable characters. This expression would match "Add", "AAA", + "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'. + To match an exact literal string, use L{Literal} or L{Keyword}. + + pyparsing includes helper strings for building Words: + - L{alphas} + - L{nums} + - L{alphanums} + - L{hexnums} + - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.) + - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.) + - L{printables} (any non-whitespace character) + + Example:: + # a word composed of digits + integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) + + # a word with a leading capital, and zero or more lowercase + capital_word = Word(alphas.upper(), alphas.lower()) + + # hostnames are alphanumeric, with leading alpha, and '-' + hostname = Word(alphas, alphanums+'-') + + # roman numeral (not a strict parser, accepts invalid mix of characters) + roman = Word("IVXLCDM") + + # any string of non-whitespace characters, except for ',' + csv_value = Word(printables, excludeChars=",") + """ + def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): + super(Word,self).__init__() + if excludeChars: + initChars = ''.join(c for c in initChars if c not in excludeChars) + if bodyChars: + bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) + self.initCharsOrig = initChars + self.initChars = set(initChars) + if bodyChars : + self.bodyCharsOrig = bodyChars + self.bodyChars = set(bodyChars) + else: + self.bodyCharsOrig = initChars + self.bodyChars = set(initChars) + + self.maxSpecified = max > 0 + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.asKeyword = asKeyword + + if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): + if self.bodyCharsOrig == self.initCharsOrig: + self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) + elif len(self.initCharsOrig) == 1: + self.reString = "%s[%s]*" % \ + (re.escape(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + else: + self.reString = "[%s][%s]*" % \ + (_escapeRegexRangeChars(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + if self.asKeyword: + self.reString = r"\b"+self.reString+r"\b" + try: + self.re = re.compile( self.reString ) + except Exception: + self.re = None + + def parseImpl( self, instring, loc, doActions=True ): + if self.re: + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + return loc, result.group() + + if not(instring[ loc ] in self.initChars): + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + instrlen = len(instring) + bodychars = self.bodyChars + maxloc = start + self.maxLen + maxloc = min( maxloc, instrlen ) + while loc < maxloc and instring[loc] in bodychars: + loc += 1 + + throwException = False + if loc - start < self.minLen: + throwException = True + if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: + throwException = True + if self.asKeyword: + if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): + throwException = True + + if throwException: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(Word,self).__str__() + except Exception: + pass + + + if self.strRepr is None: + + def charsAsStr(s): + if len(s)>4: + return s[:4]+"..." + else: + return s + + if ( self.initCharsOrig != self.bodyCharsOrig ): + self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) + else: + self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) + + return self.strRepr + + +class Regex(Token): + r""" + Token for matching strings that match a given regular expression. + Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. + If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as + named parse results. + + Example:: + realnum = Regex(r"[+-]?\d+\.\d*") + date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') + # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression + roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") + """ + compiledREtype = type(re.compile("[A-Z]")) + def __init__( self, pattern, flags=0): + """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.""" + super(Regex,self).__init__() + + if isinstance(pattern, basestring): + if not pattern: + warnings.warn("null string passed to Regex; use Empty() instead", + SyntaxWarning, stacklevel=2) + + self.pattern = pattern + self.flags = flags + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % pattern, + SyntaxWarning, stacklevel=2) + raise + + elif isinstance(pattern, Regex.compiledREtype): + self.re = pattern + self.pattern = \ + self.reString = str(pattern) + self.flags = flags + + else: + raise ValueError("Regex may only be constructed with a string or a compiled RE object") + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + d = result.groupdict() + ret = ParseResults(result.group()) + if d: + for k in d: + ret[k] = d[k] + return loc,ret + + def __str__( self ): + try: + return super(Regex,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "Re:(%s)" % repr(self.pattern) + + return self.strRepr + + +class QuotedString(Token): + r""" + Token for matching strings that are delimited by quoting characters. + + Defined with the following parameters: + - quoteChar - string of one or more characters defining the quote delimiting string + - escChar - character to escape quotes, typically backslash (default=C{None}) + - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None}) + - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) + - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) + - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) + - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True}) + + Example:: + qs = QuotedString('"') + print(qs.searchString('lsjdf "This is the quote" sldjf')) + complex_qs = QuotedString('{{', endQuoteChar='}}') + print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) + sql_qs = QuotedString('"', escQuote='""') + print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) + prints:: + [['This is the quote']] + [['This is the "quote"']] + [['This is the quote with "embedded" quotes']] + """ + def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): + super(QuotedString,self).__init__() + + # remove white space from quote chars - wont work anyway + quoteChar = quoteChar.strip() + if not quoteChar: + warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + if endQuoteChar is None: + endQuoteChar = quoteChar + else: + endQuoteChar = endQuoteChar.strip() + if not endQuoteChar: + warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + self.quoteChar = quoteChar + self.quoteCharLen = len(quoteChar) + self.firstQuoteChar = quoteChar[0] + self.endQuoteChar = endQuoteChar + self.endQuoteCharLen = len(endQuoteChar) + self.escChar = escChar + self.escQuote = escQuote + self.unquoteResults = unquoteResults + self.convertWhitespaceEscapes = convertWhitespaceEscapes + + if multiline: + self.flags = re.MULTILINE | re.DOTALL + self.pattern = r'%s(?:[^%s%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + else: + self.flags = 0 + self.pattern = r'%s(?:[^%s\n\r%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + if len(self.endQuoteChar) > 1: + self.pattern += ( + '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), + _escapeRegexRangeChars(self.endQuoteChar[i])) + for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' + ) + if escQuote: + self.pattern += (r'|(?:%s)' % re.escape(escQuote)) + if escChar: + self.pattern += (r'|(?:%s.)' % re.escape(escChar)) + self.escCharReplacePattern = re.escape(self.escChar)+"(.)" + self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, + SyntaxWarning, stacklevel=2) + raise + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result.group() + + if self.unquoteResults: + + # strip off quotes + ret = ret[self.quoteCharLen:-self.endQuoteCharLen] + + if isinstance(ret,basestring): + # replace escaped whitespace + if '\\' in ret and self.convertWhitespaceEscapes: + ws_map = { + r'\t' : '\t', + r'\n' : '\n', + r'\f' : '\f', + r'\r' : '\r', + } + for wslit,wschar in ws_map.items(): + ret = ret.replace(wslit, wschar) + + # replace escaped characters + if self.escChar: + ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret) + + # replace escaped quotes + if self.escQuote: + ret = ret.replace(self.escQuote, self.endQuoteChar) + + return loc, ret + + def __str__( self ): + try: + return super(QuotedString,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) + + return self.strRepr + + +class CharsNotIn(Token): + """ + Token for matching words composed of characters I{not} in a given set (will + include whitespace in matched characters if not listed in the provided exclusion set - see example). + Defined with string containing all disallowed characters, and an optional + minimum, maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. + + Example:: + # define a comma-separated-value as anything that is not a ',' + csv_value = CharsNotIn(',') + print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) + prints:: + ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] + """ + def __init__( self, notChars, min=1, max=0, exact=0 ): + super(CharsNotIn,self).__init__() + self.skipWhitespace = False + self.notChars = notChars + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = ( self.minLen == 0 ) + self.mayIndexError = False + + def parseImpl( self, instring, loc, doActions=True ): + if instring[loc] in self.notChars: + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + notchars = self.notChars + maxlen = min( start+self.maxLen, len(instring) ) + while loc < maxlen and \ + (instring[loc] not in notchars): + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(CharsNotIn, self).__str__() + except Exception: + pass + + if self.strRepr is None: + if len(self.notChars) > 4: + self.strRepr = "!W:(%s...)" % self.notChars[:4] + else: + self.strRepr = "!W:(%s)" % self.notChars + + return self.strRepr + +class White(Token): + """ + Special matching class for matching whitespace. Normally, whitespace is ignored + by pyparsing grammars. This class is included when some whitespace structures + are significant. Define with a string containing the whitespace characters to be + matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, + as defined for the C{L{Word}} class. + """ + whiteStrs = { + " " : "<SPC>", + "\t": "<TAB>", + "\n": "<LF>", + "\r": "<CR>", + "\f": "<FF>", + } + def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): + super(White,self).__init__() + self.matchWhite = ws + self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) + #~ self.leaveWhitespace() + self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) + self.mayReturnEmpty = True + self.errmsg = "Expected " + self.name + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + def parseImpl( self, instring, loc, doActions=True ): + if not(instring[ loc ] in self.matchWhite): + raise ParseException(instring, loc, self.errmsg, self) + start = loc + loc += 1 + maxloc = start + self.maxLen + maxloc = min( maxloc, len(instring) ) + while loc < maxloc and instring[loc] in self.matchWhite: + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + +class _PositionToken(Token): + def __init__( self ): + super(_PositionToken,self).__init__() + self.name=self.__class__.__name__ + self.mayReturnEmpty = True + self.mayIndexError = False + +class GoToColumn(_PositionToken): + """ + Token to advance to a specific column of input text; useful for tabular report scraping. + """ + def __init__( self, colno ): + super(GoToColumn,self).__init__() + self.col = colno + + def preParse( self, instring, loc ): + if col(loc,instring) != self.col: + instrlen = len(instring) + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : + loc += 1 + return loc + + def parseImpl( self, instring, loc, doActions=True ): + thiscol = col( loc, instring ) + if thiscol > self.col: + raise ParseException( instring, loc, "Text not in expected column", self ) + newloc = loc + self.col - thiscol + ret = instring[ loc: newloc ] + return newloc, ret + + +class LineStart(_PositionToken): + """ + Matches if current position is at the beginning of a line within the parse string + + Example:: + + test = '''\ + AAA this line + AAA and this line + AAA but not this one + B AAA and definitely not this one + ''' + + for t in (LineStart() + 'AAA' + restOfLine).searchString(test): + print(t) + + Prints:: + ['AAA', ' this line'] + ['AAA', ' and this line'] + + """ + def __init__( self ): + super(LineStart,self).__init__() + self.errmsg = "Expected start of line" + + def parseImpl( self, instring, loc, doActions=True ): + if col(loc, instring) == 1: + return loc, [] + raise ParseException(instring, loc, self.errmsg, self) + +class LineEnd(_PositionToken): + """ + Matches if current position is at the end of a line within the parse string + """ + def __init__( self ): + super(LineEnd,self).__init__() + self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) + self.errmsg = "Expected end of line" + + def parseImpl( self, instring, loc, doActions=True ): + if loc<len(instring): + if instring[loc] == "\n": + return loc+1, "\n" + else: + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class StringStart(_PositionToken): + """ + Matches if current position is at the beginning of the parse string + """ + def __init__( self ): + super(StringStart,self).__init__() + self.errmsg = "Expected start of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc != 0: + # see if entire string up to here is just whitespace and ignoreables + if loc != self.preParse( instring, 0 ): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class StringEnd(_PositionToken): + """ + Matches if current position is at the end of the parse string + """ + def __init__( self ): + super(StringEnd,self).__init__() + self.errmsg = "Expected end of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc < len(instring): + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + elif loc > len(instring): + return loc, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class WordStart(_PositionToken): + """ + Matches if the current position is at the beginning of a Word, and + is not preceded by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of + the string being parsed, or at the beginning of a line. + """ + def __init__(self, wordChars = printables): + super(WordStart,self).__init__() + self.wordChars = set(wordChars) + self.errmsg = "Not at the start of a word" + + def parseImpl(self, instring, loc, doActions=True ): + if loc != 0: + if (instring[loc-1] in self.wordChars or + instring[loc] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class WordEnd(_PositionToken): + """ + Matches if the current position is at the end of a Word, and + is not followed by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of + the string being parsed, or at the end of a line. + """ + def __init__(self, wordChars = printables): + super(WordEnd,self).__init__() + self.wordChars = set(wordChars) + self.skipWhitespace = False + self.errmsg = "Not at the end of a word" + + def parseImpl(self, instring, loc, doActions=True ): + instrlen = len(instring) + if instrlen>0 and loc<instrlen: + if (instring[loc] in self.wordChars or + instring[loc-1] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + +class ParseExpression(ParserElement): + """ + Abstract subclass of ParserElement, for combining and post-processing parsed tokens. + """ + def __init__( self, exprs, savelist = False ): + super(ParseExpression,self).__init__(savelist) + if isinstance( exprs, _generatorType ): + exprs = list(exprs) + + if isinstance( exprs, basestring ): + self.exprs = [ ParserElement._literalStringClass( exprs ) ] + elif isinstance( exprs, Iterable ): + exprs = list(exprs) + # if sequence of strings provided, wrap with Literal + if all(isinstance(expr, basestring) for expr in exprs): + exprs = map(ParserElement._literalStringClass, exprs) + self.exprs = list(exprs) + else: + try: + self.exprs = list( exprs ) + except TypeError: + self.exprs = [ exprs ] + self.callPreparse = False + + def __getitem__( self, i ): + return self.exprs[i] + + def append( self, other ): + self.exprs.append( other ) + self.strRepr = None + return self + + def leaveWhitespace( self ): + """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on + all contained expressions.""" + self.skipWhitespace = False + self.exprs = [ e.copy() for e in self.exprs ] + for e in self.exprs: + e.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + else: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + return self + + def __str__( self ): + try: + return super(ParseExpression,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) + return self.strRepr + + def streamline( self ): + super(ParseExpression,self).streamline() + + for e in self.exprs: + e.streamline() + + # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) + # but only if there are no parse actions or resultsNames on the nested And's + # (likewise for Or's and MatchFirst's) + if ( len(self.exprs) == 2 ): + other = self.exprs[0] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = other.exprs[:] + [ self.exprs[1] ] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + other = self.exprs[-1] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = self.exprs[:-1] + other.exprs[:] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + self.errmsg = "Expected " + _ustr(self) + + return self + + def setResultsName( self, name, listAllMatches=False ): + ret = super(ParseExpression,self).setResultsName(name,listAllMatches) + return ret + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + for e in self.exprs: + e.validate(tmp) + self.checkRecursion( [] ) + + def copy(self): + ret = super(ParseExpression,self).copy() + ret.exprs = [e.copy() for e in self.exprs] + return ret + +class And(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found in the given order. + Expressions may be separated by whitespace. + May be constructed using the C{'+'} operator. + May also be constructed using the C{'-'} operator, which will suppress backtracking. + + Example:: + integer = Word(nums) + name_expr = OneOrMore(Word(alphas)) + + expr = And([integer("id"),name_expr("name"),integer("age")]) + # more easily written as: + expr = integer("id") + name_expr("name") + integer("age") + """ + + class _ErrorStop(Empty): + def __init__(self, *args, **kwargs): + super(And._ErrorStop,self).__init__(*args, **kwargs) + self.name = '-' + self.leaveWhitespace() + + def __init__( self, exprs, savelist = True ): + super(And,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.setWhitespaceChars( self.exprs[0].whiteChars ) + self.skipWhitespace = self.exprs[0].skipWhitespace + self.callPreparse = True + + def parseImpl( self, instring, loc, doActions=True ): + # pass False as last arg to _parse for first element, since we already + # pre-parsed the string as part of our And pre-parsing + loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) + errorStop = False + for e in self.exprs[1:]: + if isinstance(e, And._ErrorStop): + errorStop = True + continue + if errorStop: + try: + loc, exprtokens = e._parse( instring, loc, doActions ) + except ParseSyntaxException: + raise + except ParseBaseException as pe: + pe.__traceback__ = None + raise ParseSyntaxException._from_exception(pe) + except IndexError: + raise ParseSyntaxException(instring, len(instring), self.errmsg, self) + else: + loc, exprtokens = e._parse( instring, loc, doActions ) + if exprtokens or exprtokens.haskeys(): + resultlist += exprtokens + return loc, resultlist + + def __iadd__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #And( [ self, other ] ) + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + if not e.mayReturnEmpty: + break + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + +class Or(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the expression that matches the longest string will be used. + May be constructed using the C{'^'} operator. + + Example:: + # construct Or using '^' operator + + number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) + prints:: + [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(Or,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + matches = [] + for e in self.exprs: + try: + loc2 = e.tryParse( instring, loc ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + else: + # save match among all matches, to retry longest to shortest + matches.append((loc2, e)) + + if matches: + matches.sort(key=lambda x: -x[0]) + for _,e in matches: + try: + return e._parse( instring, loc, doActions ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + + def __ixor__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #Or( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class MatchFirst(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the first one listed is the one that will match. + May be constructed using the C{'|'} operator. + + Example:: + # construct MatchFirst using '|' operator + + # watch the order of expressions to match + number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] + + # put more selective expression first + number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) + print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(MatchFirst,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + for e in self.exprs: + try: + ret = e._parse( instring, loc, doActions ) + return ret + except ParseException as err: + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + + # only got here if no expression matched, raise exception for match that made it the furthest + else: + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + def __ior__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #MatchFirst( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class Each(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found, but in any order. + Expressions may be separated by whitespace. + May be constructed using the C{'&'} operator. + + Example:: + color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") + shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") + integer = Word(nums) + shape_attr = "shape:" + shape_type("shape") + posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") + color_attr = "color:" + color("color") + size_attr = "size:" + integer("size") + + # use Each (using operator '&') to accept attributes in any order + # (shape and posn are required, color and size are optional) + shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) + + shape_spec.runTests(''' + shape: SQUARE color: BLACK posn: 100, 120 + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + color:GREEN size:20 shape:TRIANGLE posn:20,40 + ''' + ) + prints:: + shape: SQUARE color: BLACK posn: 100, 120 + ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] + - color: BLACK + - posn: ['100', ',', '120'] + - x: 100 + - y: 120 + - shape: SQUARE + + + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] + - color: BLUE + - posn: ['50', ',', '80'] + - x: 50 + - y: 80 + - shape: CIRCLE + - size: 50 + + + color: GREEN size: 20 shape: TRIANGLE posn: 20,40 + ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] + - color: GREEN + - posn: ['20', ',', '40'] + - x: 20 + - y: 40 + - shape: TRIANGLE + - size: 20 + """ + def __init__( self, exprs, savelist = True ): + super(Each,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.skipWhitespace = True + self.initExprGroups = True + + def parseImpl( self, instring, loc, doActions=True ): + if self.initExprGroups: + self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) + opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] + opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] + self.optionals = opt1 + opt2 + self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] + self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] + self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] + self.required += self.multirequired + self.initExprGroups = False + tmpLoc = loc + tmpReqd = self.required[:] + tmpOpt = self.optionals[:] + matchOrder = [] + + keepMatching = True + while keepMatching: + tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired + failed = [] + for e in tmpExprs: + try: + tmpLoc = e.tryParse( instring, tmpLoc ) + except ParseException: + failed.append(e) + else: + matchOrder.append(self.opt1map.get(id(e),e)) + if e in tmpReqd: + tmpReqd.remove(e) + elif e in tmpOpt: + tmpOpt.remove(e) + if len(failed) == len(tmpExprs): + keepMatching = False + + if tmpReqd: + missing = ", ".join(_ustr(e) for e in tmpReqd) + raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) + + # add any unmatched Optionals, in case they have default values defined + matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] + + resultlist = [] + for e in matchOrder: + loc,results = e._parse(instring,loc,doActions) + resultlist.append(results) + + finalResults = sum(resultlist, ParseResults([])) + return loc, finalResults + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class ParseElementEnhance(ParserElement): + """ + Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. + """ + def __init__( self, expr, savelist=False ): + super(ParseElementEnhance,self).__init__(savelist) + if isinstance( expr, basestring ): + if issubclass(ParserElement._literalStringClass, Token): + expr = ParserElement._literalStringClass(expr) + else: + expr = ParserElement._literalStringClass(Literal(expr)) + self.expr = expr + self.strRepr = None + if expr is not None: + self.mayIndexError = expr.mayIndexError + self.mayReturnEmpty = expr.mayReturnEmpty + self.setWhitespaceChars( expr.whiteChars ) + self.skipWhitespace = expr.skipWhitespace + self.saveAsList = expr.saveAsList + self.callPreparse = expr.callPreparse + self.ignoreExprs.extend(expr.ignoreExprs) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr is not None: + return self.expr._parse( instring, loc, doActions, callPreParse=False ) + else: + raise ParseException("",loc,self.errmsg,self) + + def leaveWhitespace( self ): + self.skipWhitespace = False + self.expr = self.expr.copy() + if self.expr is not None: + self.expr.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + else: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + return self + + def streamline( self ): + super(ParseElementEnhance,self).streamline() + if self.expr is not None: + self.expr.streamline() + return self + + def checkRecursion( self, parseElementList ): + if self in parseElementList: + raise RecursiveGrammarException( parseElementList+[self] ) + subRecCheckList = parseElementList[:] + [ self ] + if self.expr is not None: + self.expr.checkRecursion( subRecCheckList ) + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion( [] ) + + def __str__( self ): + try: + return super(ParseElementEnhance,self).__str__() + except Exception: + pass + + if self.strRepr is None and self.expr is not None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) + return self.strRepr + + +class FollowedBy(ParseElementEnhance): + """ + Lookahead matching of the given parse expression. C{FollowedBy} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression matches at the current + position. C{FollowedBy} always returns a null token list. + + Example:: + # use FollowedBy to match a label only if it is followed by a ':' + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() + prints:: + [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] + """ + def __init__( self, expr ): + super(FollowedBy,self).__init__(expr) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + self.expr.tryParse( instring, loc ) + return loc, [] + + +class NotAny(ParseElementEnhance): + """ + Lookahead to disallow matching with the given parse expression. C{NotAny} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression does I{not} match at the current + position. Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny} + always returns a null token list. May be constructed using the '~' operator. + + Example:: + + """ + def __init__( self, expr ): + super(NotAny,self).__init__(expr) + #~ self.leaveWhitespace() + self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs + self.mayReturnEmpty = True + self.errmsg = "Found unwanted token, "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr.canParseNext(instring, loc): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "~{" + _ustr(self.expr) + "}" + + return self.strRepr + +class _MultipleMatch(ParseElementEnhance): + def __init__( self, expr, stopOn=None): + super(_MultipleMatch, self).__init__(expr) + self.saveAsList = True + ender = stopOn + if isinstance(ender, basestring): + ender = ParserElement._literalStringClass(ender) + self.not_ender = ~ender if ender is not None else None + + def parseImpl( self, instring, loc, doActions=True ): + self_expr_parse = self.expr._parse + self_skip_ignorables = self._skipIgnorables + check_ender = self.not_ender is not None + if check_ender: + try_not_ender = self.not_ender.tryParse + + # must be at least one (but first see if we are the stopOn sentinel; + # if so, fail) + if check_ender: + try_not_ender(instring, loc) + loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) + try: + hasIgnoreExprs = (not not self.ignoreExprs) + while 1: + if check_ender: + try_not_ender(instring, loc) + if hasIgnoreExprs: + preloc = self_skip_ignorables( instring, loc ) + else: + preloc = loc + loc, tmptokens = self_expr_parse( instring, preloc, doActions ) + if tmptokens or tmptokens.haskeys(): + tokens += tmptokens + except (ParseException,IndexError): + pass + + return loc, tokens + +class OneOrMore(_MultipleMatch): + """ + Repetition of one or more of the given expression. + + Parameters: + - expr - expression that must match one or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: BLACK" + OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] + + # use stopOn attribute for OneOrMore to avoid reading label string as part of the data + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] + + # could also be written as + (attr_expr * (1,)).parseString(text).pprint() + """ + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + _ustr(self.expr) + "}..." + + return self.strRepr + +class ZeroOrMore(_MultipleMatch): + """ + Optional repetition of zero or more of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example: similar to L{OneOrMore} + """ + def __init__( self, expr, stopOn=None): + super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) + except (ParseException,IndexError): + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]..." + + return self.strRepr + +class _NullToken(object): + def __bool__(self): + return False + __nonzero__ = __bool__ + def __str__(self): + return "" + +_optionalNotMatched = _NullToken() +class Optional(ParseElementEnhance): + """ + Optional matching of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - default (optional) - value to be returned if the optional expression is not found. + + Example:: + # US postal code can be a 5-digit zip, plus optional 4-digit qualifier + zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) + zip.runTests(''' + # traditional ZIP code + 12345 + + # ZIP+4 form + 12101-0001 + + # invalid ZIP + 98765- + ''') + prints:: + # traditional ZIP code + 12345 + ['12345'] + + # ZIP+4 form + 12101-0001 + ['12101-0001'] + + # invalid ZIP + 98765- + ^ + FAIL: Expected end of text (at char 5), (line:1, col:6) + """ + def __init__( self, expr, default=_optionalNotMatched ): + super(Optional,self).__init__( expr, savelist=False ) + self.saveAsList = self.expr.saveAsList + self.defaultValue = default + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) + except (ParseException,IndexError): + if self.defaultValue is not _optionalNotMatched: + if self.expr.resultsName: + tokens = ParseResults([ self.defaultValue ]) + tokens[self.expr.resultsName] = self.defaultValue + else: + tokens = [ self.defaultValue ] + else: + tokens = [] + return loc, tokens + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]" + + return self.strRepr + +class SkipTo(ParseElementEnhance): + """ + Token for skipping over all undefined text until the matched expression is found. + + Parameters: + - expr - target expression marking the end of the data to be skipped + - include - (default=C{False}) if True, the target expression is also parsed + (the skipped text and target expression are returned as a 2-element list). + - ignore - (default=C{None}) used to define grammars (typically quoted strings and + comments) that might contain false matches to the target expression + - failOn - (default=C{None}) define expressions that are not allowed to be + included in the skipped test; if found before the target expression is found, + the SkipTo is not a match + + Example:: + report = ''' + Outstanding Issues Report - 1 Jan 2000 + + # | Severity | Description | Days Open + -----+----------+-------------------------------------------+----------- + 101 | Critical | Intermittent system crash | 6 + 94 | Cosmetic | Spelling error on Login ('log|n') | 14 + 79 | Minor | System slow when running too many reports | 47 + ''' + integer = Word(nums) + SEP = Suppress('|') + # use SkipTo to simply match everything up until the next SEP + # - ignore quoted strings, so that a '|' character inside a quoted string does not match + # - parse action will call token.strip() for each matched token, i.e., the description body + string_data = SkipTo(SEP, ignore=quotedString) + string_data.setParseAction(tokenMap(str.strip)) + ticket_expr = (integer("issue_num") + SEP + + string_data("sev") + SEP + + string_data("desc") + SEP + + integer("days_open")) + + for tkt in ticket_expr.searchString(report): + print tkt.dump() + prints:: + ['101', 'Critical', 'Intermittent system crash', '6'] + - days_open: 6 + - desc: Intermittent system crash + - issue_num: 101 + - sev: Critical + ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] + - days_open: 14 + - desc: Spelling error on Login ('log|n') + - issue_num: 94 + - sev: Cosmetic + ['79', 'Minor', 'System slow when running too many reports', '47'] + - days_open: 47 + - desc: System slow when running too many reports + - issue_num: 79 + - sev: Minor + """ + def __init__( self, other, include=False, ignore=None, failOn=None ): + super( SkipTo, self ).__init__( other ) + self.ignoreExpr = ignore + self.mayReturnEmpty = True + self.mayIndexError = False + self.includeMatch = include + self.asList = False + if isinstance(failOn, basestring): + self.failOn = ParserElement._literalStringClass(failOn) + else: + self.failOn = failOn + self.errmsg = "No match found for "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + startloc = loc + instrlen = len(instring) + expr = self.expr + expr_parse = self.expr._parse + self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None + self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None + + tmploc = loc + while tmploc <= instrlen: + if self_failOn_canParseNext is not None: + # break if failOn expression matches + if self_failOn_canParseNext(instring, tmploc): + break + + if self_ignoreExpr_tryParse is not None: + # advance past ignore expressions + while 1: + try: + tmploc = self_ignoreExpr_tryParse(instring, tmploc) + except ParseBaseException: + break + + try: + expr_parse(instring, tmploc, doActions=False, callPreParse=False) + except (ParseException, IndexError): + # no match, advance loc in string + tmploc += 1 + else: + # matched skipto expr, done + break + + else: + # ran off the end of the input string without matching skipto expr, fail + raise ParseException(instring, loc, self.errmsg, self) + + # build up return values + loc = tmploc + skiptext = instring[startloc:loc] + skipresult = ParseResults(skiptext) + + if self.includeMatch: + loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) + skipresult += mat + + return loc, skipresult + +class Forward(ParseElementEnhance): + """ + Forward declaration of an expression to be defined later - + used for recursive grammars, such as algebraic infix notation. + When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. + + Note: take care when assigning to C{Forward} not to overlook precedence of operators. + Specifically, '|' has a lower precedence than '<<', so that:: + fwdExpr << a | b | c + will actually be evaluated as:: + (fwdExpr << a) | b | c + thereby leaving b and c out as parseable alternatives. It is recommended that you + explicitly group the values inserted into the C{Forward}:: + fwdExpr << (a | b | c) + Converting to use the '<<=' operator instead will avoid this problem. + + See L{ParseResults.pprint} for an example of a recursive parser created using + C{Forward}. + """ + def __init__( self, other=None ): + super(Forward,self).__init__( other, savelist=False ) + + def __lshift__( self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass(other) + self.expr = other + self.strRepr = None + self.mayIndexError = self.expr.mayIndexError + self.mayReturnEmpty = self.expr.mayReturnEmpty + self.setWhitespaceChars( self.expr.whiteChars ) + self.skipWhitespace = self.expr.skipWhitespace + self.saveAsList = self.expr.saveAsList + self.ignoreExprs.extend(self.expr.ignoreExprs) + return self + + def __ilshift__(self, other): + return self << other + + def leaveWhitespace( self ): + self.skipWhitespace = False + return self + + def streamline( self ): + if not self.streamlined: + self.streamlined = True + if self.expr is not None: + self.expr.streamline() + return self + + def validate( self, validateTrace=[] ): + if self not in validateTrace: + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion([]) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + return self.__class__.__name__ + ": ..." + + # stubbed out for now - creates awful memory and perf issues + self._revertClass = self.__class__ + self.__class__ = _ForwardNoRecurse + try: + if self.expr is not None: + retString = _ustr(self.expr) + else: + retString = "None" + finally: + self.__class__ = self._revertClass + return self.__class__.__name__ + ": " + retString + + def copy(self): + if self.expr is not None: + return super(Forward,self).copy() + else: + ret = Forward() + ret <<= self + return ret + +class _ForwardNoRecurse(Forward): + def __str__( self ): + return "..." + +class TokenConverter(ParseElementEnhance): + """ + Abstract subclass of C{ParseExpression}, for converting parsed results. + """ + def __init__( self, expr, savelist=False ): + super(TokenConverter,self).__init__( expr )#, savelist ) + self.saveAsList = False + +class Combine(TokenConverter): + """ + Converter to concatenate all matching tokens to a single string. + By default, the matching patterns must also be contiguous in the input string; + this can be disabled by specifying C{'adjacent=False'} in the constructor. + + Example:: + real = Word(nums) + '.' + Word(nums) + print(real.parseString('3.1416')) # -> ['3', '.', '1416'] + # will also erroneously match the following + print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] + + real = Combine(Word(nums) + '.' + Word(nums)) + print(real.parseString('3.1416')) # -> ['3.1416'] + # no match when there are internal spaces + print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) + """ + def __init__( self, expr, joinString="", adjacent=True ): + super(Combine,self).__init__( expr ) + # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself + if adjacent: + self.leaveWhitespace() + self.adjacent = adjacent + self.skipWhitespace = True + self.joinString = joinString + self.callPreparse = True + + def ignore( self, other ): + if self.adjacent: + ParserElement.ignore(self, other) + else: + super( Combine, self).ignore( other ) + return self + + def postParse( self, instring, loc, tokenlist ): + retToks = tokenlist.copy() + del retToks[:] + retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) + + if self.resultsName and retToks.haskeys(): + return [ retToks ] + else: + return retToks + +class Group(TokenConverter): + """ + Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions. + + Example:: + ident = Word(alphas) + num = Word(nums) + term = ident | num + func = ident + Optional(delimitedList(term)) + print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] + + func = ident + Group(Optional(delimitedList(term))) + print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] + """ + def __init__( self, expr ): + super(Group,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + return [ tokenlist ] + +class Dict(TokenConverter): + """ + Converter to return a repetitive expression as a list, but also as a dictionary. + Each element can also be referenced using the first token in the expression as its key. + Useful for tabular report scraping when the first column can be used as a item key. + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + # print attributes as plain groups + print(OneOrMore(attr_expr).parseString(text).dump()) + + # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names + result = Dict(OneOrMore(Group(attr_expr))).parseString(text) + print(result.dump()) + + # access named fields as dict entries, or output as dict + print(result['shape']) + print(result.asDict()) + prints:: + ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] + + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} + See more examples at L{ParseResults} of accessing fields by results name. + """ + def __init__( self, expr ): + super(Dict,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + for i,tok in enumerate(tokenlist): + if len(tok) == 0: + continue + ikey = tok[0] + if isinstance(ikey,int): + ikey = _ustr(tok[0]).strip() + if len(tok)==1: + tokenlist[ikey] = _ParseResultsWithOffset("",i) + elif len(tok)==2 and not isinstance(tok[1],ParseResults): + tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) + else: + dictvalue = tok.copy() #ParseResults(i) + del dictvalue[0] + if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) + else: + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) + + if self.resultsName: + return [ tokenlist ] + else: + return tokenlist + + +class Suppress(TokenConverter): + """ + Converter for ignoring the results of a parsed expression. + + Example:: + source = "a, b, c,d" + wd = Word(alphas) + wd_list1 = wd + ZeroOrMore(',' + wd) + print(wd_list1.parseString(source)) + + # often, delimiters that are useful during parsing are just in the + # way afterward - use Suppress to keep them out of the parsed output + wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) + print(wd_list2.parseString(source)) + prints:: + ['a', ',', 'b', ',', 'c', ',', 'd'] + ['a', 'b', 'c', 'd'] + (See also L{delimitedList}.) + """ + def postParse( self, instring, loc, tokenlist ): + return [] + + def suppress( self ): + return self + + +class OnlyOnce(object): + """ + Wrapper for parse actions, to ensure they are only called once. + """ + def __init__(self, methodCall): + self.callable = _trim_arity(methodCall) + self.called = False + def __call__(self,s,l,t): + if not self.called: + results = self.callable(s,l,t) + self.called = True + return results + raise ParseException(s,l,"") + def reset(self): + self.called = False + +def traceParseAction(f): + """ + Decorator for debugging parse actions. + + When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".} + When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised. + + Example:: + wd = Word(alphas) + + @traceParseAction + def remove_duplicate_chars(tokens): + return ''.join(sorted(set(''.join(tokens)))) + + wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) + print(wds.parseString("slkdjs sld sldd sdlf sdljf")) + prints:: + >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) + <<leaving remove_duplicate_chars (ret: 'dfjkls') + ['dfjkls'] + """ + f = _trim_arity(f) + def z(*paArgs): + thisFunc = f.__name__ + s,l,t = paArgs[-3:] + if len(paArgs)>3: + thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc + sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) + try: + ret = f(*paArgs) + except Exception as exc: + sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) + raise + sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) + return ret + try: + z.__name__ = f.__name__ + except AttributeError: + pass + return z + +# +# global helpers +# +def delimitedList( expr, delim=",", combine=False ): + """ + Helper to define a delimited list of expressions - the delimiter defaults to ','. + By default, the list elements and delimiters can have intervening whitespace, and + comments, but this can be overridden by passing C{combine=True} in the constructor. + If C{combine} is set to C{True}, the matching tokens are returned as a single token + string, with the delimiters included; otherwise, the matching tokens are returned + as a list of tokens, with the delimiters suppressed. + + Example:: + delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] + delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] + """ + dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." + if combine: + return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) + else: + return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) + +def countedArray( expr, intExpr=None ): + """ + Helper to define a counted list of expressions. + This helper defines a pattern of the form:: + integer expr expr expr... + where the leading integer tells how many expr expressions follow. + The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. + + If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value. + + Example:: + countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] + + # in this parser, the leading integer value is given in binary, + # '10' indicating that 2 values are in the array + binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) + countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] + """ + arrayExpr = Forward() + def countFieldParseAction(s,l,t): + n = t[0] + arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) + return [] + if intExpr is None: + intExpr = Word(nums).setParseAction(lambda t:int(t[0])) + else: + intExpr = intExpr.copy() + intExpr.setName("arrayLen") + intExpr.addParseAction(countFieldParseAction, callDuringTry=True) + return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') + +def _flatten(L): + ret = [] + for i in L: + if isinstance(i,list): + ret.extend(_flatten(i)) + else: + ret.append(i) + return ret + +def matchPreviousLiteral(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousLiteral(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches a + previous literal, will also match the leading C{"1:1"} in C{"1:10"}. + If this is not desired, use C{matchPreviousExpr}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + def copyTokenToRepeater(s,l,t): + if t: + if len(t) == 1: + rep << t[0] + else: + # flatten t tokens + tflat = _flatten(t.asList()) + rep << And(Literal(tt) for tt in tflat) + else: + rep << Empty() + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def matchPreviousExpr(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousExpr(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches by + expressions, will I{not} match the leading C{"1:1"} in C{"1:10"}; + the expressions are evaluated first, and then compared, so + C{"1"} is compared with C{"10"}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + e2 = expr.copy() + rep <<= e2 + def copyTokenToRepeater(s,l,t): + matchTokens = _flatten(t.asList()) + def mustMatchTheseTokens(s,l,t): + theseTokens = _flatten(t.asList()) + if theseTokens != matchTokens: + raise ParseException("",0,"") + rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def _escapeRegexRangeChars(s): + #~ escape these chars: ^-] + for c in r"\^-]": + s = s.replace(c,_bslash+c) + s = s.replace("\n",r"\n") + s = s.replace("\t",r"\t") + return _ustr(s) + +def oneOf( strs, caseless=False, useRegex=True ): + """ + Helper to quickly define a set of alternative Literals, and makes sure to do + longest-first testing when there is a conflict, regardless of the input order, + but returns a C{L{MatchFirst}} for best performance. + + Parameters: + - strs - a string of space-delimited literals, or a collection of string literals + - caseless - (default=C{False}) - treat all literals as caseless + - useRegex - (default=C{True}) - as an optimization, will generate a Regex + object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or + if creating a C{Regex} raises an exception) + + Example:: + comp_oper = oneOf("< = > <= >= !=") + var = Word(alphas) + number = Word(nums) + term = var | number + comparison_expr = term + comp_oper + term + print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) + prints:: + [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] + """ + if caseless: + isequal = ( lambda a,b: a.upper() == b.upper() ) + masks = ( lambda a,b: b.upper().startswith(a.upper()) ) + parseElementClass = CaselessLiteral + else: + isequal = ( lambda a,b: a == b ) + masks = ( lambda a,b: b.startswith(a) ) + parseElementClass = Literal + + symbols = [] + if isinstance(strs,basestring): + symbols = strs.split() + elif isinstance(strs, Iterable): + symbols = list(strs) + else: + warnings.warn("Invalid argument to oneOf, expected string or iterable", + SyntaxWarning, stacklevel=2) + if not symbols: + return NoMatch() + + i = 0 + while i < len(symbols)-1: + cur = symbols[i] + for j,other in enumerate(symbols[i+1:]): + if ( isequal(other, cur) ): + del symbols[i+j+1] + break + elif ( masks(cur, other) ): + del symbols[i+j+1] + symbols.insert(i,other) + cur = other + break + else: + i += 1 + + if not caseless and useRegex: + #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) + try: + if len(symbols)==len("".join(symbols)): + return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) + else: + return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) + except Exception: + warnings.warn("Exception creating Regex for oneOf, building MatchFirst", + SyntaxWarning, stacklevel=2) + + + # last resort, just use MatchFirst + return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) + +def dictOf( key, value ): + """ + Helper to easily and clearly define a dictionary by specifying the respective patterns + for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens + in the proper order. The key pattern can include delimiting markers or punctuation, + as long as they are suppressed, thereby leaving the significant key text. The value + pattern can include named results, so that the C{Dict} results can include named token + fields. + + Example:: + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + print(OneOrMore(attr_expr).parseString(text).dump()) + + attr_label = label + attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) + + # similar to Dict, but simpler call format + result = dictOf(attr_label, attr_value).parseString(text) + print(result.dump()) + print(result['shape']) + print(result.shape) # object attribute access works too + print(result.asDict()) + prints:: + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + SQUARE + {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} + """ + return Dict( ZeroOrMore( Group ( key + value ) ) ) + +def originalTextFor(expr, asString=True): + """ + Helper to return the original, untokenized text for a given expression. Useful to + restore the parsed fields of an HTML start tag into the raw tag text itself, or to + revert separate tokens with intervening whitespace back to the original matching + input text. By default, returns astring containing the original parsed text. + + If the optional C{asString} argument is passed as C{False}, then the return value is a + C{L{ParseResults}} containing any results names that were originally matched, and a + single token containing the original matched text from the input string. So if + the expression passed to C{L{originalTextFor}} contains expressions with defined + results names, you must set C{asString} to C{False} if you want to preserve those + results name values. + + Example:: + src = "this is test <b> bold <i>text</i> </b> normal text " + for tag in ("b","i"): + opener,closer = makeHTMLTags(tag) + patt = originalTextFor(opener + SkipTo(closer) + closer) + print(patt.searchString(src)[0]) + prints:: + ['<b> bold <i>text</i> </b>'] + ['<i>text</i>'] + """ + locMarker = Empty().setParseAction(lambda s,loc,t: loc) + endlocMarker = locMarker.copy() + endlocMarker.callPreparse = False + matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") + if asString: + extractText = lambda s,l,t: s[t._original_start:t._original_end] + else: + def extractText(s,l,t): + t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] + matchExpr.setParseAction(extractText) + matchExpr.ignoreExprs = expr.ignoreExprs + return matchExpr + +def ungroup(expr): + """ + Helper to undo pyparsing's default grouping of And expressions, even + if all but one are non-empty. + """ + return TokenConverter(expr).setParseAction(lambda t:t[0]) + +def locatedExpr(expr): + """ + Helper to decorate a returned token with its starting and ending locations in the input string. + This helper adds the following results names: + - locn_start = location where matched expression begins + - locn_end = location where matched expression ends + - value = the actual parsed results + + Be careful if the input text contains C{<TAB>} characters, you may want to call + C{L{ParserElement.parseWithTabs}} + + Example:: + wd = Word(alphas) + for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): + print(match) + prints:: + [[0, 'ljsdf', 5]] + [[8, 'lksdjjf', 15]] + [[18, 'lkkjj', 23]] + """ + locator = Empty().setParseAction(lambda s,l,t: l) + return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) + + +# convenience constants for positional expressions +empty = Empty().setName("empty") +lineStart = LineStart().setName("lineStart") +lineEnd = LineEnd().setName("lineEnd") +stringStart = StringStart().setName("stringStart") +stringEnd = StringEnd().setName("stringEnd") + +_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) +_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) +_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) +_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | 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 C{\-} or C{\]}) + - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) + (C{\0x##} is also supported for backwards compatibility) + - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character) + - a range of any of the above, separated by a dash (C{'a-z'}, etc.) + - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.) + """ + _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) + try: + return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) + except Exception: + return "" + +def matchOnlyAtCol(n): + """ + Helper method for defining parse actions that require matching at a specific + column in the input text. + """ + def verifyCol(strg,locn,toks): + if col(locn,strg) != n: + raise ParseException(strg,locn,"matched token not at column %d" % n) + return verifyCol + +def replaceWith(replStr): + """ + Helper method for common parse actions that simply return a literal value. Especially + useful when used with C{L{transformString<ParserElement.transformString>}()}. + + Example:: + num = Word(nums).setParseAction(lambda toks: int(toks[0])) + na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) + term = na | num + + OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] + """ + return lambda s,l,t: [replStr] + +def removeQuotes(s,l,t): + """ + Helper parse action for removing quotation marks from parsed quoted strings. + + Example:: + # by default, quotation marks are included in parsed results + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] + + # use removeQuotes to strip quotation marks from parsed results + quotedString.setParseAction(removeQuotes) + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] + """ + return t[0][1:-1] + +def tokenMap(func, *args): + """ + Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional + args are passed, they are forwarded to the given function as additional arguments after + the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the + parsed data to an integer using base 16. + + Example (compare the last to example in L{ParserElement.transformString}:: + hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) + hex_ints.runTests(''' + 00 11 22 aa FF 0a 0d 1a + ''') + + upperword = Word(alphas).setParseAction(tokenMap(str.upper)) + OneOrMore(upperword).runTests(''' + my kingdom for a horse + ''') + + wd = Word(alphas).setParseAction(tokenMap(str.title)) + OneOrMore(wd).setParseAction(' '.join).runTests(''' + now is the winter of our discontent made glorious summer by this sun of york + ''') + prints:: + 00 11 22 aa FF 0a 0d 1a + [0, 17, 34, 170, 255, 10, 13, 26] + + my kingdom for a horse + ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] + + now is the winter of our discontent made glorious summer by this sun of york + ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] + """ + def pa(s,l,t): + return [func(tokn, *args) for tokn in t] + + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + pa.__name__ = func_name + + return pa + +upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) +"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}""" + +downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) +"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}""" + +def _makeTags(tagStr, xml): + """Internal helper to construct opening and closing tag expressions, given a tag name""" + if isinstance(tagStr,basestring): + resname = tagStr + tagStr = Keyword(tagStr, caseless=not xml) + else: + resname = tagStr.name + + tagAttrName = Word(alphas,alphanums+"_-:") + if (xml): + tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + else: + printablesLessRAbrack = "".join(c for c in printables if c not in ">") + tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ + Optional( Suppress("=") + tagAttrValue ) ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + closeTag = Combine(_L("</") + tagStr + ">") + + openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) + closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) + openTag.tag = resname + closeTag.tag = resname + return openTag, closeTag + +def makeHTMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches + tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values. + + Example:: + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple + a,a_end = makeHTMLTags("A") + link_expr = a + SkipTo(a_end)("link_text") + a_end + + for link in link_expr.searchString(text): + # attributes in the <A> tag (like "href" shown here) are also accessible as named results + print(link.link_text, '->', link.href) + prints:: + pyparsing -> http://pyparsing.wikispaces.com + """ + return _makeTags( tagStr, False ) + +def makeXMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for XML, given a tag name. Matches + tags only in the given upper/lower case. + + Example: similar to L{makeHTMLTags} + """ + return _makeTags( tagStr, True ) + +def withAttribute(*args,**attrDict): + """ + Helper to create a validating parse action to be used with start tags created + with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag + with a required attribute value, to avoid false matches on common tags such as + C{<TD>} or C{<DIV>}. + + Call C{withAttribute} with a series of attribute names and values. Specify the list + of filter attributes names and values as: + - keyword arguments, as in C{(align="right")}, or + - as an explicit dict with C{**} operator, when an attribute name is also a Python + reserved word, as in C{**{"class":"Customer", "align":"right"}} + - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) + For attribute names with a namespace prefix, you must use the second form. Attribute + names are matched insensitive to upper/lower case. + + If just testing for C{class} (with or without a namespace), use C{L{withClass}}. + + To verify that the attribute exists, but without specifying a value, pass + C{withAttribute.ANY_VALUE} as the value. + + Example:: + html = ''' + <div> + Some text + <div type="grid">1 4 0 1 0</div> + <div type="graph">1,3 2,3 1,1</div> + <div>this has no type</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + + # only match div tag having a type attribute with value "grid" + div_grid = div().setParseAction(withAttribute(type="grid")) + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + # construct a match with any div tag having a type attribute, regardless of the value + div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + if args: + attrs = args[:] + else: + attrs = attrDict.items() + attrs = [(k,v) for k,v in attrs] + def pa(s,l,tokens): + for attrName,attrValue in attrs: + if attrName not in tokens: + raise ParseException(s,l,"no matching attribute " + attrName) + if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: + raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % + (attrName, tokens[attrName], attrValue)) + return pa +withAttribute.ANY_VALUE = object() + +def withClass(classname, namespace=''): + """ + Simplified version of C{L{withAttribute}} when matching on a div class - made + difficult because C{class} is a reserved word in Python. + + Example:: + html = ''' + <div> + Some text + <div class="grid">1 4 0 1 0</div> + <div class="graph">1,3 2,3 1,1</div> + <div>this <div> has no class</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + div_grid = div().setParseAction(withClass("grid")) + + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + classattr = "%s:class" % namespace if namespace else "class" + return withAttribute(**{classattr : classname}) + +opAssoc = _Constants() +opAssoc.LEFT = object() +opAssoc.RIGHT = object() + +def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): + """ + Helper method for constructing grammars of expressions made up of + operators working in a precedence hierarchy. Operators may be unary or + binary, left- or right-associative. Parse actions can also be attached + to operator expressions. The generated parser will also recognize the use + of parentheses to override operator precedences (see example below). + + Note: if you define a deep operator list, you may see performance issues + when using infixNotation. See L{ParserElement.enablePackrat} for a + mechanism to potentially improve your parser performance. + + Parameters: + - baseExpr - expression representing the most basic element for the nested + - opList - list of tuples, one for each operator precedence level in the + expression grammar; each tuple is of the form + (opExpr, numTerms, rightLeftAssoc, parseAction), where: + - opExpr is the pyparsing expression for the operator; + may also be a string, which will be converted to a Literal; + if numTerms is 3, opExpr is a tuple of two expressions, for the + two operators separating the 3 terms + - numTerms is the number of terms for this operator (must + be 1, 2, or 3) + - rightLeftAssoc is the indicator whether the operator is + right or left associative, using the pyparsing-defined + constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. + - parseAction is the parse action to be associated with + expressions matching this operator expression (the + parse action tuple member may be omitted); if the parse action + is passed a tuple or list of functions, this is equivalent to + calling C{setParseAction(*fn)} (L{ParserElement.setParseAction}) + - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) + - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) + + Example:: + # simple example of four-function arithmetic with ints and variable names + integer = pyparsing_common.signed_integer + varname = pyparsing_common.identifier + + arith_expr = infixNotation(integer | varname, + [ + ('-', 1, opAssoc.RIGHT), + (oneOf('* /'), 2, opAssoc.LEFT), + (oneOf('+ -'), 2, opAssoc.LEFT), + ]) + + arith_expr.runTests(''' + 5+3*6 + (5+3)*6 + -2--11 + ''', fullDump=False) + prints:: + 5+3*6 + [[5, '+', [3, '*', 6]]] + + (5+3)*6 + [[[5, '+', 3], '*', 6]] + + -2--11 + [[['-', 2], '-', ['-', 11]]] + """ + ret = Forward() + lastExpr = baseExpr | ( lpar + ret + rpar ) + for i,operDef in enumerate(opList): + opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] + termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr + if arity == 3: + if opExpr is None or len(opExpr) != 2: + raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") + opExpr1, opExpr2 = opExpr + thisExpr = Forward().setName(termName) + if rightLeftAssoc == opAssoc.LEFT: + if arity == 1: + matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) + else: + matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ + Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + elif rightLeftAssoc == opAssoc.RIGHT: + if arity == 1: + # try to avoid LR with this extra test + if not isinstance(opExpr, Optional): + opExpr = Optional(opExpr) + matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) + else: + matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ + Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + else: + raise ValueError("operator must indicate right or left associativity") + if pa: + if isinstance(pa, (tuple, list)): + matchExpr.setParseAction(*pa) + else: + matchExpr.setParseAction(pa) + thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) + lastExpr = thisExpr + ret <<= lastExpr + return ret + +operatorPrecedence = infixNotation +"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release.""" + +dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") +sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") +quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| + Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") +unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") + +def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): + """ + Helper method for defining nested lists enclosed in opening and closing + delimiters ("(" and ")" are the default). + + Parameters: + - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression + - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression + - content - expression for items within the nested lists (default=C{None}) + - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) + + If an expression is not provided for the content argument, the nested + expression will capture all whitespace-delimited content between delimiters + as a list of separate values. + + Use the C{ignoreExpr} argument to define expressions that may contain + opening or closing characters that should not be treated as opening + or closing characters for nesting, such as quotedString or a comment + expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. + The default is L{quotedString}, but if no expressions are to be ignored, + then pass C{None} for this argument. + + Example:: + data_type = oneOf("void int short long char float double") + decl_data_type = Combine(data_type + Optional(Word('*'))) + ident = Word(alphas+'_', alphanums+'_') + number = pyparsing_common.number + arg = Group(decl_data_type + ident) + LPAR,RPAR = map(Suppress, "()") + + code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) + + c_function = (decl_data_type("type") + + ident("name") + + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + + code_body("body")) + c_function.ignore(cStyleComment) + + source_code = ''' + int is_odd(int x) { + return (x%2); + } + + int dec_to_hex(char hchar) { + if (hchar >= '0' && hchar <= '9') { + return (ord(hchar)-ord('0')); + } else { + return (10+ord(hchar)-ord('A')); + } + } + ''' + for func in c_function.searchString(source_code): + print("%(name)s (%(type)s) args: %(args)s" % func) + + prints:: + is_odd (int) args: [['int', 'x']] + dec_to_hex (int) args: [['char', 'hchar']] + """ + if opener == closer: + raise ValueError("opening and closing strings cannot be the same") + if content is None: + if isinstance(opener,basestring) and isinstance(closer,basestring): + if len(opener) == 1 and len(closer)==1: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS + ).setParseAction(lambda t:t[0].strip())) + else: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + ~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + raise ValueError("opening and closing arguments must be strings if no content expression is given") + ret = Forward() + if ignoreExpr is not None: + ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) + else: + ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) + ret.setName('nested %s%s expression' % (opener,closer)) + return ret + +def indentedBlock(blockStatementExpr, indentStack, indent=True): + """ + Helper method for defining space-delimited indentation blocks, such as + those used to define block statements in Python source code. + + Parameters: + - blockStatementExpr - expression defining syntax of statement that + is repeated within the indented block + - indentStack - list created by caller to manage indentation stack + (multiple statementWithIndentedBlock expressions within a single grammar + should share a common indentStack) + - indent - boolean indicating whether block must be indented beyond the + the current level; set to False for block of left-most statements + (default=C{True}) + + A valid block must contain at least one C{blockStatement}. + + Example:: + data = ''' + def A(z): + A1 + B = 100 + G = A2 + A2 + A3 + B + def BB(a,b,c): + BB1 + def BBA(): + bba1 + bba2 + bba3 + C + D + def spam(x,y): + def eggs(z): + pass + ''' + + + indentStack = [1] + stmt = Forward() + + identifier = Word(alphas, alphanums) + funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") + func_body = indentedBlock(stmt, indentStack) + funcDef = Group( funcDecl + func_body ) + + rvalue = Forward() + funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") + rvalue << (funcCall | identifier | Word(nums)) + assignment = Group(identifier + "=" + rvalue) + stmt << ( funcDef | assignment | identifier ) + + module_body = OneOrMore(stmt) + + parseTree = module_body.parseString(data) + parseTree.pprint() + prints:: + [['def', + 'A', + ['(', 'z', ')'], + ':', + [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], + 'B', + ['def', + 'BB', + ['(', 'a', 'b', 'c', ')'], + ':', + [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], + 'C', + 'D', + ['def', + 'spam', + ['(', 'x', 'y', ')'], + ':', + [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] + """ + def checkPeerIndent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if curCol != indentStack[-1]: + if curCol > indentStack[-1]: + raise ParseFatalException(s,l,"illegal nesting") + raise ParseException(s,l,"not a peer entry") + + def checkSubIndent(s,l,t): + curCol = col(l,s) + if curCol > indentStack[-1]: + indentStack.append( curCol ) + else: + raise ParseException(s,l,"not a subentry") + + def checkUnindent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): + raise ParseException(s,l,"not an unindent") + indentStack.pop() + + NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) + INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') + PEER = Empty().setParseAction(checkPeerIndent).setName('') + UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') + if indent: + smExpr = Group( Optional(NL) + + #~ FollowedBy(blockStatementExpr) + + INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) + else: + smExpr = Group( Optional(NL) + + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) + blockStatementExpr.ignore(_bslash + LineEnd()) + return smExpr.setName('indented block') + +alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") +punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") + +anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) +_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) +commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") +def replaceHTMLEntity(t): + """Helper parser action to replace common HTML entities with their special characters""" + return _htmlEntityMap.get(t.entity) + +# it's easy to get these comment structures wrong - they're very common, so may as well make them available +cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") +"Comment of the form C{/* ... */}" + +htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") +"Comment of the form C{<!-- ... -->}" + +restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") +dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") +"Comment of the form C{// ... (to end of line)}" + +cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") +"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}" + +javaStyleComment = cppStyleComment +"Same as C{L{cppStyleComment}}" + +pythonStyleComment = Regex(r"#.*").setName("Python style comment") +"Comment of the form C{# ... (to end of line)}" + +_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + + Optional( Word(" \t") + + ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") +commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") +"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas. + This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}.""" + +# some other useful expressions - using lower-case class name since we are really using this as a namespace +class pyparsing_common: + """ + Here are some common low-level expressions that may be useful in jump-starting parser development: + - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>}) + - common L{programming identifiers<identifier>} + - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>}) + - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>} + - L{UUID<uuid>} + - L{comma-separated list<comma_separated_list>} + Parse actions: + - C{L{convertToInteger}} + - C{L{convertToFloat}} + - C{L{convertToDate}} + - C{L{convertToDatetime}} + - C{L{stripHTMLTags}} + - C{L{upcaseTokens}} + - C{L{downcaseTokens}} + + Example:: + pyparsing_common.number.runTests(''' + # any int or real number, returned as the appropriate type + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.fnumber.runTests(''' + # any int or real number, returned as float + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.hex_integer.runTests(''' + # hex numbers + 100 + FF + ''') + + pyparsing_common.fraction.runTests(''' + # fractions + 1/2 + -3/4 + ''') + + pyparsing_common.mixed_integer.runTests(''' + # mixed fractions + 1 + 1/2 + -3/4 + 1-3/4 + ''') + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(''' + # uuid + 12345678-1234-5678-1234-567812345678 + ''') + prints:: + # any int or real number, returned as the appropriate type + 100 + [100] + + -100 + [-100] + + +100 + [100] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # any int or real number, returned as float + 100 + [100.0] + + -100 + [-100.0] + + +100 + [100.0] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # hex numbers + 100 + [256] + + FF + [255] + + # fractions + 1/2 + [0.5] + + -3/4 + [-0.75] + + # mixed fractions + 1 + [1] + + 1/2 + [0.5] + + -3/4 + [-0.75] + + 1-3/4 + [1.75] + + # uuid + 12345678-1234-5678-1234-567812345678 + [UUID('12345678-1234-5678-1234-567812345678')] + """ + + convertToInteger = tokenMap(int) + """ + Parse action for converting parsed integers to Python int + """ + + convertToFloat = tokenMap(float) + """ + Parse action for converting parsed numbers to Python float + """ + + integer = Word(nums).setName("integer").setParseAction(convertToInteger) + """expression that parses an unsigned integer, returns an int""" + + hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) + """expression that parses a hexadecimal integer, returns an int""" + + signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) + """expression that parses an integer with optional leading sign, returns an int""" + + fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") + """fractional expression of an integer divided by an integer, returns a float""" + fraction.addParseAction(lambda t: t[0]/t[-1]) + + mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") + """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" + mixed_integer.addParseAction(sum) + + real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) + """expression that parses a floating point number and returns a float""" + + sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) + """expression that parses a floating point number with optional scientific notation and returns a float""" + + # streamlining this expression makes the docs nicer-looking + number = (sci_real | real | signed_integer).streamline() + """any numeric expression, returns the corresponding Python type""" + + fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) + """any int or real number, returned as float""" + + identifier = Word(alphas+'_', alphanums+'_').setName("identifier") + """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" + + ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") + "IPv4 address (C{0.0.0.0 - 255.255.255.255})" + + _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") + _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") + _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") + _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) + _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") + ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") + "IPv6 address (long, short, or mixed form)" + + mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") + "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" + + @staticmethod + def convertToDate(fmt="%Y-%m-%d"): + """ + Helper to create a parse action for converting parsed date string to Python datetime.date + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) + + Example:: + date_expr = pyparsing_common.iso8601_date.copy() + date_expr.setParseAction(pyparsing_common.convertToDate()) + print(date_expr.parseString("1999-12-31")) + prints:: + [datetime.date(1999, 12, 31)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt).date() + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + @staticmethod + def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): + """ + Helper to create a parse action for converting parsed datetime string to Python datetime.datetime + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) + + Example:: + dt_expr = pyparsing_common.iso8601_datetime.copy() + dt_expr.setParseAction(pyparsing_common.convertToDatetime()) + print(dt_expr.parseString("1999-12-31T23:59:59.999")) + prints:: + [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt) + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") + "ISO8601 date (C{yyyy-mm-dd})" + + iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") + "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}" + + uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") + "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})" + + _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() + @staticmethod + def stripHTMLTags(s, l, tokens): + """ + Parse action to remove HTML tags from web page HTML source + + Example:: + # strip HTML links from normal text + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + td,td_end = makeHTMLTags("TD") + table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end + + print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' + """ + return pyparsing_common._html_stripper.transformString(tokens[0]) + + _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') + + Optional( White(" \t") ) ) ).streamline().setName("commaItem") + comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") + """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" + + upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) + """Parse action to convert tokens to upper case.""" + + downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) + """Parse action to convert tokens to lower case.""" + + +if __name__ == "__main__": + + selectToken = CaselessLiteral("select") + fromToken = CaselessLiteral("from") + + ident = Word(alphas, alphanums + "_$") + + columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + columnNameList = Group(delimitedList(columnName)).setName("columns") + columnSpec = ('*' | columnNameList) + + tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + tableNameList = Group(delimitedList(tableName)).setName("tables") + + simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") + + # demo runTests method, including embedded comments in test string + simpleSQL.runTests(""" + # '*' as column list and dotted table name + select * from SYS.XYZZY + + # caseless match on "SELECT", and casts back to "select" + SELECT * from XYZZY, ABC + + # list of column names, and mixed case SELECT keyword + Select AA,BB,CC from Sys.dual + + # multiple tables + Select A, B, C from Sys.dual, Table2 + + # invalid SELECT keyword - should fail + Xelect A, B, C from Sys.dual + + # incomplete command - should fail + Select + + # invalid column name - should fail + Select ^^^ frox Sys.dual + + """) + + pyparsing_common.number.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + # any int or real number, returned as float + pyparsing_common.fnumber.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + pyparsing_common.hex_integer.runTests(""" + 100 + FF + """) + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(""" + 12345678-1234-5678-1234-567812345678 + """) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/six.py b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/six.py new file mode 100644 index 0000000..190c023 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/_vendor/six.py @@ -0,0 +1,868 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/archive_util.py b/mongo_mac/lib/python3.6/site-packages/setuptools/archive_util.py new file mode 100644 index 0000000..8143604 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/archive_util.py @@ -0,0 +1,173 @@ +"""Utilities for extracting common archive formats""" + +import zipfile +import tarfile +import os +import shutil +import posixpath +import contextlib +from distutils.errors import DistutilsError + +from pkg_resources import ensure_directory + +__all__ = [ + "unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter", + "UnrecognizedFormat", "extraction_drivers", "unpack_directory", +] + + +class UnrecognizedFormat(DistutilsError): + """Couldn't recognize the archive type""" + + +def default_filter(src, dst): + """The default progress/filter callback; returns True for all files""" + return dst + + +def unpack_archive(filename, extract_dir, progress_filter=default_filter, + drivers=None): + """Unpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat`` + + `progress_filter` is a function taking two arguments: a source path + internal to the archive ('/'-separated), and a filesystem path where it + will be extracted. The callback must return the desired extract path + (which may be the same as the one passed in), or else ``None`` to skip + that file or directory. The callback can thus be used to report on the + progress of the extraction, as well as to filter the items extracted or + alter their extraction paths. + + `drivers`, if supplied, must be a non-empty sequence of functions with the + same signature as this function (minus the `drivers` argument), that raise + ``UnrecognizedFormat`` if they do not support extracting the designated + archive type. The `drivers` are tried in sequence until one is found that + does not raise an error, or until all are exhausted (in which case + ``UnrecognizedFormat`` is raised). If you do not supply a sequence of + drivers, the module's ``extraction_drivers`` constant will be used, which + means that ``unpack_zipfile`` and ``unpack_tarfile`` will be tried, in that + order. + """ + for driver in drivers or extraction_drivers: + try: + driver(filename, extract_dir, progress_filter) + except UnrecognizedFormat: + continue + else: + return + else: + raise UnrecognizedFormat( + "Not a recognized archive type: %s" % filename + ) + + +def unpack_directory(filename, extract_dir, progress_filter=default_filter): + """"Unpack" a directory, using the same interface as for archives + + Raises ``UnrecognizedFormat`` if `filename` is not a directory + """ + if not os.path.isdir(filename): + raise UnrecognizedFormat("%s is not a directory" % filename) + + paths = { + filename: ('', extract_dir), + } + for base, dirs, files in os.walk(filename): + src, dst = paths[base] + for d in dirs: + paths[os.path.join(base, d)] = src + d + '/', os.path.join(dst, d) + for f in files: + target = os.path.join(dst, f) + target = progress_filter(src + f, target) + if not target: + # skip non-files + continue + ensure_directory(target) + f = os.path.join(base, f) + shutil.copyfile(f, target) + shutil.copystat(f, target) + + +def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): + """Unpack zip `filename` to `extract_dir` + + Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined + by ``zipfile.is_zipfile()``). See ``unpack_archive()`` for an explanation + of the `progress_filter` argument. + """ + + if not zipfile.is_zipfile(filename): + raise UnrecognizedFormat("%s is not a zip file" % (filename,)) + + with zipfile.ZipFile(filename) as z: + for info in z.infolist(): + name = info.filename + + # don't extract absolute paths or ones with .. in them + if name.startswith('/') or '..' in name.split('/'): + continue + + target = os.path.join(extract_dir, *name.split('/')) + target = progress_filter(name, target) + if not target: + continue + if name.endswith('/'): + # directory + ensure_directory(target) + else: + # file + ensure_directory(target) + data = z.read(info.filename) + with open(target, 'wb') as f: + f.write(data) + unix_attributes = info.external_attr >> 16 + if unix_attributes: + os.chmod(target, unix_attributes) + + +def unpack_tarfile(filename, extract_dir, progress_filter=default_filter): + """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` + + Raises ``UnrecognizedFormat`` if `filename` is not a tarfile (as determined + by ``tarfile.open()``). See ``unpack_archive()`` for an explanation + of the `progress_filter` argument. + """ + try: + tarobj = tarfile.open(filename) + except tarfile.TarError: + raise UnrecognizedFormat( + "%s is not a compressed or uncompressed tar file" % (filename,) + ) + with contextlib.closing(tarobj): + # don't do any chowning! + tarobj.chown = lambda *args: None + for member in tarobj: + name = member.name + # don't extract absolute paths or ones with .. in them + if not name.startswith('/') and '..' not in name.split('/'): + prelim_dst = os.path.join(extract_dir, *name.split('/')) + + # resolve any links and to extract the link targets as normal + # files + while member is not None and (member.islnk() or member.issym()): + linkpath = member.linkname + if member.issym(): + base = posixpath.dirname(member.name) + linkpath = posixpath.join(base, linkpath) + linkpath = posixpath.normpath(linkpath) + member = tarobj._getmember(linkpath) + + if member is not None and (member.isfile() or member.isdir()): + final_dst = progress_filter(name, prelim_dst) + if final_dst: + if final_dst.endswith(os.sep): + final_dst = final_dst[:-1] + try: + # XXX Ugh + tarobj._extract_member(member, final_dst) + except tarfile.ExtractError: + # chown/chmod/mkfifo/mknode/makedev failed + pass + return True + + +extraction_drivers = unpack_directory, unpack_zipfile, unpack_tarfile diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/build_meta.py b/mongo_mac/lib/python3.6/site-packages/setuptools/build_meta.py new file mode 100644 index 0000000..e40904a --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/build_meta.py @@ -0,0 +1,254 @@ +"""A PEP 517 interface to setuptools + +Previously, when a user or a command line tool (let's call it a "frontend") +needed to make a request of setuptools to take a certain action, for +example, generating a list of installation requirements, the frontend would +would call "setup.py egg_info" or "setup.py bdist_wheel" on the command line. + +PEP 517 defines a different method of interfacing with setuptools. Rather +than calling "setup.py" directly, the frontend should: + + 1. Set the current directory to the directory with a setup.py file + 2. Import this module into a safe python interpreter (one in which + setuptools can potentially set global variables or crash hard). + 3. Call one of the functions defined in PEP 517. + +What each function does is defined in PEP 517. However, here is a "casual" +definition of the functions (this definition should not be relied on for +bug reports or API stability): + + - `build_wheel`: build a wheel in the folder and return the basename + - `get_requires_for_build_wheel`: get the `setup_requires` to build + - `prepare_metadata_for_build_wheel`: get the `install_requires` + - `build_sdist`: build an sdist in the folder and return the basename + - `get_requires_for_build_sdist`: get the `setup_requires` to build + +Again, this is not a formal definition! Just a "taste" of the module. +""" + +import io +import os +import sys +import tokenize +import shutil +import contextlib + +import setuptools +import distutils +from setuptools.py31compat import TemporaryDirectory + +from pkg_resources import parse_requirements + +__all__ = ['get_requires_for_build_sdist', + 'get_requires_for_build_wheel', + 'prepare_metadata_for_build_wheel', + 'build_wheel', + 'build_sdist', + '__legacy__', + 'SetupRequirementsError'] + +class SetupRequirementsError(BaseException): + def __init__(self, specifiers): + self.specifiers = specifiers + + +class Distribution(setuptools.dist.Distribution): + def fetch_build_eggs(self, specifiers): + specifier_list = list(map(str, parse_requirements(specifiers))) + + raise SetupRequirementsError(specifier_list) + + @classmethod + @contextlib.contextmanager + def patch(cls): + """ + Replace + distutils.dist.Distribution with this class + for the duration of this context. + """ + orig = distutils.core.Distribution + distutils.core.Distribution = cls + try: + yield + finally: + distutils.core.Distribution = orig + + +def _to_str(s): + """ + Convert a filename to a string (on Python 2, explicitly + a byte string, not Unicode) as distutils checks for the + exact type str. + """ + if sys.version_info[0] == 2 and not isinstance(s, str): + # Assume it's Unicode, as that's what the PEP says + # should be provided. + return s.encode(sys.getfilesystemencoding()) + return s + + +def _get_immediate_subdirectories(a_dir): + return [name for name in os.listdir(a_dir) + if os.path.isdir(os.path.join(a_dir, name))] + + +def _file_with_extension(directory, extension): + matching = ( + f for f in os.listdir(directory) + if f.endswith(extension) + ) + file, = matching + return file + + +def _open_setup_script(setup_script): + if not os.path.exists(setup_script): + # Supply a default setup.py + return io.StringIO(u"from setuptools import setup; setup()") + + return getattr(tokenize, 'open', open)(setup_script) + + +class _BuildMetaBackend(object): + + def _fix_config(self, config_settings): + config_settings = config_settings or {} + config_settings.setdefault('--global-option', []) + return config_settings + + def _get_build_requires(self, config_settings, requirements): + config_settings = self._fix_config(config_settings) + + sys.argv = sys.argv[:1] + ['egg_info'] + \ + config_settings["--global-option"] + try: + with Distribution.patch(): + self.run_setup() + except SetupRequirementsError as e: + requirements += e.specifiers + + return requirements + + def run_setup(self, setup_script='setup.py'): + # Note that we can reuse our build directory between calls + # Correctness comes first, then optimization later + __file__ = setup_script + __name__ = '__main__' + + with _open_setup_script(__file__) as f: + code = f.read().replace(r'\r\n', r'\n') + + exec(compile(code, __file__, 'exec'), locals()) + + def get_requires_for_build_wheel(self, config_settings=None): + config_settings = self._fix_config(config_settings) + return self._get_build_requires(config_settings, requirements=['wheel']) + + def get_requires_for_build_sdist(self, config_settings=None): + config_settings = self._fix_config(config_settings) + return self._get_build_requires(config_settings, requirements=[]) + + def prepare_metadata_for_build_wheel(self, metadata_directory, + config_settings=None): + sys.argv = sys.argv[:1] + ['dist_info', '--egg-base', + _to_str(metadata_directory)] + self.run_setup() + + dist_info_directory = metadata_directory + while True: + dist_infos = [f for f in os.listdir(dist_info_directory) + if f.endswith('.dist-info')] + + if (len(dist_infos) == 0 and + len(_get_immediate_subdirectories(dist_info_directory)) == 1): + + dist_info_directory = os.path.join( + dist_info_directory, os.listdir(dist_info_directory)[0]) + continue + + assert len(dist_infos) == 1 + break + + # PEP 517 requires that the .dist-info directory be placed in the + # metadata_directory. To comply, we MUST copy the directory to the root + if dist_info_directory != metadata_directory: + shutil.move( + os.path.join(dist_info_directory, dist_infos[0]), + metadata_directory) + shutil.rmtree(dist_info_directory, ignore_errors=True) + + return dist_infos[0] + + def build_wheel(self, wheel_directory, config_settings=None, + metadata_directory=None): + config_settings = self._fix_config(config_settings) + wheel_directory = os.path.abspath(wheel_directory) + + # Build the wheel in a temporary directory, then copy to the target + with TemporaryDirectory(dir=wheel_directory) as tmp_dist_dir: + sys.argv = (sys.argv[:1] + + ['bdist_wheel', '--dist-dir', tmp_dist_dir] + + config_settings["--global-option"]) + self.run_setup() + + wheel_basename = _file_with_extension(tmp_dist_dir, '.whl') + wheel_path = os.path.join(wheel_directory, wheel_basename) + if os.path.exists(wheel_path): + # os.rename will fail overwriting on non-unix env + os.remove(wheel_path) + os.rename(os.path.join(tmp_dist_dir, wheel_basename), wheel_path) + + return wheel_basename + + def build_sdist(self, sdist_directory, config_settings=None): + config_settings = self._fix_config(config_settings) + sdist_directory = os.path.abspath(sdist_directory) + sys.argv = sys.argv[:1] + ['sdist', '--formats', 'gztar'] + \ + config_settings["--global-option"] + \ + ["--dist-dir", sdist_directory] + self.run_setup() + + return _file_with_extension(sdist_directory, '.tar.gz') + + +class _BuildMetaLegacyBackend(_BuildMetaBackend): + """Compatibility backend for setuptools + + This is a version of setuptools.build_meta that endeavors to maintain backwards + compatibility with pre-PEP 517 modes of invocation. It exists as a temporary + bridge between the old packaging mechanism and the new packaging mechanism, + and will eventually be removed. + """ + def run_setup(self, setup_script='setup.py'): + # In order to maintain compatibility with scripts assuming that + # the setup.py script is in a directory on the PYTHONPATH, inject + # '' into sys.path. (pypa/setuptools#1642) + sys_path = list(sys.path) # Save the original path + + script_dir = os.path.dirname(os.path.abspath(setup_script)) + if script_dir not in sys.path: + sys.path.insert(0, script_dir) + + try: + super(_BuildMetaLegacyBackend, + self).run_setup(setup_script=setup_script) + finally: + # While PEP 517 frontends should be calling each hook in a fresh + # subprocess according to the standard (and thus it should not be + # strictly necessary to restore the old sys.path), we'll restore + # the original path so that the path manipulation does not persist + # within the hook after run_setup is called. + sys.path[:] = sys_path + +# The primary backend +_BACKEND = _BuildMetaBackend() + +get_requires_for_build_wheel = _BACKEND.get_requires_for_build_wheel +get_requires_for_build_sdist = _BACKEND.get_requires_for_build_sdist +prepare_metadata_for_build_wheel = _BACKEND.prepare_metadata_for_build_wheel +build_wheel = _BACKEND.build_wheel +build_sdist = _BACKEND.build_sdist + + +# The legacy backend +__legacy__ = _BuildMetaLegacyBackend() diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/cli-32.exe b/mongo_mac/lib/python3.6/site-packages/setuptools/cli-32.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083 GIT binary patch literal 65536 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[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/cli-64.exe b/mongo_mac/lib/python3.6/site-packages/setuptools/cli-64.exe new file mode 100644 index 0000000000000000000000000000000000000000..675e6bf3743f3d3011c238657e7128ee9960ef7f GIT binary patch literal 74752 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 &sjKl@1{;unAiW2w^OujNoW z+s1GGSx<J&+NxO_wZOh=MOmE@ZP49QvUKMZkCAB3K%I|@I?-k|+Emw|J{xyq05F-y zq7$V8l2oRcow-7Yh^cOL;xdHl)f~cwpX#{~ZSyaWVW!KqqDW)=HMWc2eUv6Y*DyJJ zd<PmpV>@Y{fyvVRn1*ukl8i(qo?7gm{xW32isz5Se(%>1j-a2k4wb|wT)GbP)~3cw z?6fpLj~Sq`9YkM)yDZB*We>-k{xAm5y?nH0Ho2{x^Hypsn|E~r0<*<Uahmy+U5m}= zGCmb!!{0-iAbH9V4jiJiWkbU(=Y8Ht#jK`Y2}?gSAwHl{38mHoTDRHs^TO;c0K(t; zJur}@Zp6KBL8hecMc8IO7nuZRlY>jx=2YhD6NHvl9yo4U5tiyIlU>#Dq@mTY2oce0 zScIx+t*YHbRIT2s&bjqw$p*oU67G{!71sDN2sxTN5)0-<Vw&&T>oL1Aw=ob$3lFj* ztVs)OQ=VuDG#Tgc$T*v=MF_RTL4A^~749wE!fzjIvze_{!i$bjkvG#thW==gNvR?q zqN9=c9sWvw6oprI%*YEWbx$CY=-}BgsJF|~&ojGDfwn3zlecP(M_rM)Yu~wcoB82L zZNc91uwxJ?*>iE0-InZ+zyt&|243NM1(`ag6+L8(rCNqjEnXsf)~Gdhxy%nxd<%-_ zG<2v%HTr0NH-P%#9@h8)$xbV9#5j)t>pPHUVJX`#82c>$e2P5Fi^z73?Zb3>4H-a4 zyZAo{B_wtgf!oXxBcR1yzjoPeO~Gr4i!#^3fZeu!5V{O<&s;;BtE4N?q(qtks-WJO zD~v3>0nlkN*NA*{4_W;X4Io~{Mogf@=VYQSm6*9^7%EIIDcl0W%13KjY>-_uHx_7S zBM3Ta*CEci_MQineL{VRdq*QvNnCS;!G7c3CFAYj=nW|}g_(0Bp(?@#*~8{BOV7sd zDcx0Cx7X;?l5q+PV%P#V+gK1b6L#Y@;%u9I)LB}a`E+cYYNlR9TO8fRcYr1|=D8ki zBiH!EGQ4k>xDX4mXDLK0EpVV}G7x2RQ+WU4iC8DJH7~s={+*}g@6kFx*BXyG1VJP& zk4O6F@~-nB`>b1#rzEqq_{;*!TY-&T3J_Vpd32D*-d(1cjk$bl@7z}+_r*QACEP&D zVFxw8wdzuUVu0Idf!4+O%DVgW6fJ*iFL*i=X9BYTeFhw6BWnKWO#uf<A%qV=u}o3c zRpkjdrpb(P0%2Wu#uU7F_=8fI=C=Y|;*J>j;l&UybT5BxG@`(Cv-v9sK`sc!KoDR) z67}ijJN2A5PZ=2nO;9zBVYAC!b*-{`Z+NXe^)IaaZ4aV@RcC9R2h0yL^*)jOMlF^L z;kuNyhRwFi!;OhPMzMU!#EV1kKX2Z=l`FMaf1;|ewZ-_h6!2u#_t&h(u+?gGG$|v4 zHp+zm;o76Nvuw8N0?Hq|1`@?JxhMxg>6-ocYeRWFIR4u4*JbQaJ`RvWfLCeik3W>a zk1T?~etHvy@Z|K;PCs47?)I7-zb!EfMA;h!J^hcc1Etvwx*tQ>u`yF0zXD5Ky|cd( z{fLlbZ3N_cCQ^(~lR075)TG6n=-@`+HY03uch$J?TI-bfw>;v2tg<_7eq)su?g_88 zNnF;J*6q=^gv|!G5@o0}RXt%pRsE9a$MydHx{-RlOKar0BA0%9D(ZTf<J#2gjGi39 zRMbT>#|5d^vE5aSOvMb88FJ;TQa6RBDfP#(RV&<!vCge3>1fQ<voKoq{n6{>Vf4>e zHMI8t#jeT2Ao(bv`ZIKiLhh=*sWGP#4Q@o)t1`u?Cy!7I+f(zogymtrMc5YA{HROq zusI`ak3LXkL3e3InX_|$#IXlFE;43MxT5JwHYitP({q{T)*Lh49jZgobClJp!)$BU zo+LyUZVj_7g1QsGhU6pWQYllhRv}>zkD+^~3H)*$Bbgb}+xSQ<;`f1gBW$Av`I&Dx z2crSD+_YWn2O`LmcO5N%w9$t&Xnp}X^Y{K2FlZ61txwY6v7?X$3-^|?qikzzmcLR9 z9MiKRfo}{Y64<CKYr)`biP!K;uZJUntwxSk{J4K5qKyy14N_tKok-wwnY4<MT4WN1 z_4Sd!hcfA9O8T=*qOiV7_KqDY8mMQBoiCQ!jf)T01ST630EIpZW9m>I#&Td&*J2qF z@)G(Q#-?r8cnF+(wfKYfq?__O)cV01?J&R5P~i~$PTG?FQe*<`E(kHnAuAkHCh49j zv-Q4HCK^~TjwGF0d;#q(iv}9Iw7}>3qzEuDHUfz%e^;dVQPET7kr#V6y^GJ1O|z5K z@-b?8hz1C*(E^=S5nw_e6=6G56|6$hMfa1OC*a<}hls*Jie9GWzpoWP?I&C;x{7ue z4C^ZOZaY7W!At@e)TQMgqFkb)@gi4uUE7eWa4*&6RO<)%AqM>~)Wx<YonW4o5f=5= z;GM7oKsPQT6cNCl^te&X5Nf0!#jHZ!MX2aHl=x6a3D88{pbTRyA2xz$><+)rww`o> zJrWbP>=VHYSyOTVh-4o>jF+`w;<lI@vI(}mOF)_hB(#yL=GHm4U`h!(1=rMR^J;!k z7A9Hwm=x_bc9;ae8q`3-P3QhFYb+gpuyo9Rgs~=+4&O^VQ}Eh|zo>M~ZV}s}Q7n`+ zG&RPDMJy0jI=n$ctPg^WYPMm8-O1k-g6C}7ed>^P%uQw8%8YIn+rwYAfad}1kc|FX zV`J{T&PK~JGLAH9jazaPx16@tH>-JA!1gM24+Cy~_#yxwn+_(hvVr;$8>q2*(!Fc3 znc%%1Z#J#Jd-TDqrWLVuu1EW#5jWp_A!Pxau4)n%il@8v;ewIWi)@}dDO+Fu2duNG z9yLwR?GQC&7+zE4$!MOQhiP#{xi900@{qmv8Y<S|pgHwtLouneiUS6~b1i^?sl4he zH{0CF>uFEmE8NS+f&FOMq5I4=Iml~YKA5&<J|VzCAUp!4aER?sqI^vd=^^FSv&z91 z-Oz*;+4LMLT41gskWZ>&5f2La2_um!c$45?Br(nf%0OEiAmB;b>LDvByYe@O3UNGn zod#vdJ2d7&`Y9mwTn!o!+ZafF&_omg>WA>urXil+l!bx|{Y7@Re@PZ;6$+q0ON#wk zLE#o2xP(X+!#_8*ljt6N1bW7wWB>yqS_FJ~eR@fxg=XXm`?M8<`eM16ywSLUmf5SY zxx7;AY@|(*@xhhxL4D`derPH4YL9g(i}z^Ej#Z&An4Ga$NEldp!t2s&?;<S9?N-FG zH(a<eT-T&G0?@*SCJp3k?zftvd-Zdo9r_rp@$+1Sha)^B6;=?=meI~=hfz<(&;u!R zu>(B282#MF-$QpncdwrWX1*xE1cfb#mJHv`n$^}TKeimt>>$O9V=L0p`Js>;A3_ZF zYL@rZ78&Ve+pOK9^l5FqiUB~1_Ykt7&b4l|k(lVC7a1NslEM%|tIrpTLz?@To5x62 zW)5mDgX+aLHE^ivOX3{`)CwkOPj=EJi2|r)2qZ|%tZbr<3~NuiWTJP;6t9s@nNy!S z8wAS^=y~YrV+iwglf`b|O@J?_h{M1bI=x~WJv=w#!Iz_BXzC`s{|2f23Xx^RB#~um z0UpVIKhyzpY9TeJk3_-qsP0nPm;!<=+@i+IGA!=^#8aQn=&Rt3q^im5y^IG-SQ~pc z#EuGl^1WwcXJ$_QD|9?|C3*trZgD+DF9?O|$3BK&-9e>p7hW;=D@Oo=uP0I%QYoog z>Kc^j?_}ZvO57_FyC~5YVI2emmK}((m|U9qH5fMb|61TwRSy3RWi8G$GLoNC1eB=? z|Ai>NpFc#;Sf=$R8XZpc{!}L5)k&`l@EXDP(-jGD9St3!(H)O9nVyhTQVlW*NU{#2 zaTbwd+;b9?#b2ZSe%w1$MrGl_|AeTOqyx^9h*^s@2(QMt7T3?g!3ZBJc$=HALV}8| zYz_+GX?Y7<NcsZyD``ETr7GCHRDrl@p!O#2#;#C=F=Y0{Y`l@GAQYcwPh2gMwhOH~ zqS(g7REm-Fj~nL`wp+2;;ZIGa;5PmrspnSgs_A`l>ixXb^I?z(#s8s5J|CuM-187f zke^M}#ax|7@u0bzlJ|swx2E(aDA<Z!S?^$tx?ZbrO+^3&kG+kDqp`M#Or=mKAEdQ2 z8CaVQp=w^Sme(CM-dsaceZR%&JVOc(7C+gADCLPJQK*kB{05<ua5!CT^GBOgOR$_} zU_1O<EPI4{8()ZpOz;@~J`_BB>ZEkmVX3Uulr@*Ks@+-tL0L1vsaEnRG^TY84`i(! zPFW@*!Sb%$EPDTU?7jJWK@ol(s~6vYc`7gQ8=gUxY@U*e>Pt~yLn{Y(zeNgIOeVBW z|3*xNxh_NTNX&IP9vbud@L-<7RORzuqC^)>gSvwT75EnP!ZR_l$sw!@TCgBiYeXjy zy`5V`ePlBseK}+u;#Z_AxD*Q!-p41d7epd-ROOgN^YgS=rH}Mgr_JqB_JF&TjS92- zi%Ro9>rkEZN=X#@Ji-!6-FxT=wEHow75c5+#g{3MKsy4$n3Kb%cSQni%ENy|4mSM+ zh0Wg}Y(D6;DN&LN&467W3jT^2P@u85!;ThfH>Q3)4fpbDwRV}UqWYdTW4vZgok_BR zem3Z48bbWPu+jr%{RDZ3*$&H_k7zd2six$2RJM!HKtIFmiXgkzSz1vF3dI%$@8iRc zeL@GmLogJ}yRQj@aV0Wa5M!Hi1D93bowy7mTiB4C7iJIm3cn2JTg4L>%|f?w+01Vv zfe)%KlijPnL<=0P%FzN{)tPEXiPL9HG6OcfFM1W|(#Ir+Xl#~$33~Q-XhHjgfQM2? zi)!tLk&#-OSoN|1n2Z}R9o}3JW()AF*23(g-qSrTmoD|^3f-X(D--9SMU3?mD&azj z{t8&*P7sJ@Hb5`F-*5u{f&7~<M9f@@Su7f}TpOWg>71TNGL%sfiH{veLS02y*qn00 zX5_CWLp{H80FW1Ro&Ym8uqaIjT|jP(IfTYEHr)>~FG&j76D`yIRG?+Ln;sA(kt@4) zW*!+7MSC!<Hpq1Z#!~QWSVx6r6pLelP|qprZqI{o_HOlA*k<y^K{i`$MV|E)bjKBb z5b7BGRph2QOIn8Ln3e}j?T1un{xsKSxKzuQ9A{2*TT47pBGkiBnW3z1OuCf~Tll9F zKx|OwJNr748I~i(qw4l9kBIfV#||x4<1jlKX6@|V;EDuolGr=J6+5hLybcs$UT*2m zx`PjWmg*1WIAYI1s!@pRKUAOE5hPG$r5a1<Ibm~&0NLI@c`2YMTu~~vk?b8bb2gfR z4H_*OL-<r+)GRvB=q~~J`{mrilm!4gegpt&|FkW3?H9YjP$5uX`7IvO;@pZD8j=Gf zvCb#41v79-nC&iQ3CxkXFh}AsE5zFIpgB^GzcT*95z8upQX}xLq4MWIe1!+k6pN{O zAAhx<%~tfZ*r@7?hAm$`O?D}FlM4GJL{Zh;Wpzx?3r6Ce_Fa~x)U87vT3-fu@Qi!6 z9YLNzi$0zd%3~rG4anGnj8L6o$25{O)TIj=%1a&5Ej6&cC$pe)K$hPl3-Aqf^tn{} zY$`oeD780|CL0=Qsm*@8kxD^tU8AdfAK?A5z9a$8kM%`mEr|=z7lD*x`m4belT@-} z&GHB7C!{j${T>%;4R!M8O7!zS)WxTTzC&G4N@&e$Q3Ky-Fo(X3?kkVBB1gQWZA$s# z0h+R5^E73{qwaQK!u&u<I#jk*tJtVjK;1m36-ke0<zh@5k2%rSY_?Sm>{X%<034`? zm1sQ{9TAw64kXh_@1_H*(t%&0S@WnJ>MI0bzus(i-Jv|T9PB}f)&NYiOI4z@qcXdu zE79FFnq4JIbfSovp+v`uz_t24W>>iq{aC!+qz^H>Zd0OUuQ0nRl;|H(ETK7xCBs;4 zZiZQBqdrMv<p{j1k5iR(A7?9X*s2Ho8hfQOl(OY-+|!j9fD(kwvV<EUjg5HbFzPuB z<&@gFsQ{hB)K}JhksW5Y*h&JODr;Vg8T616f&zB48+me(M~RYR9POm5)|AkQxu^&f zm-q%vol#d$Nqs_z@@i=pS@{}}k7i1!lr{0}pcr=*eHejC%L(4(Ky^h)7v4hjRv%53 zcv?IYr2rXem6R5&+3Zuz?ZFZZeq5%j?1&OSAIMfWU=VDH1qhm5cPfv1QO@l8$?{!h z*Ih~!FyrlBCHgNBxKD{bB?6WDon}|H68#SR!R#`W=ynmkM5%il6|Ff3Z^>(|)_I}g z{xD0JjTwO4_*%=~rtLYJ90kk}My_ZV7)fSXt)Zg+I(TR!Wjma|4U8g`U;;X@B)HeC z`$Aa*^09$4%vFWJR1*F8fw|6WnnV6bff~Q&oBEKyG<mHm1Yb%EQK7!csbRKE3_o85 zVF*(PEhy0?(0-^Ln|!)!UhL9jM(olwP7@1hq=71RZ5EotYN`>XC{>yC$f?dMO;J;F zq8M+gV-RWz>Y1g=8zo)IAs9bAaz$L9(h7u~C9DLhQsnWJ1~x8phdcKZY;IX`mZ-SO zQNkK9Jj>kb1~InTs`+teN#IC{a`llA7P7fyy204J0i;0HGknXKtw55dvYo26Qw?l= z$c4IfXf2R0j5*tRIKmp@(+bS4;^hw2(NgcwtZm8N<e5WNsBeI3t^6h^{;2)Fz-ve` zN$MdI>su2jP@)h~!7;X3NNRQzBu)SyMnAZe{KQaGKo+L}RBKN?ht%cgs__lCP^pSt z`~l!kgTK*}NT4lkCZvDXne3x(psX}0u@CzA7=oaFFoBa=1$J6d!L4}NC={YqBE;Y? z1bIzr^O_MHPgdp^s8aT32s<;MwOeH;3L9!at3jkbA{1zc0Kq)Zpla?G^*|)T#Itr6 zHVEj41-c9<N<E7y$EQAODV?JxaK1s~@&#zIiI#^ZY;i#}gq~3GEPuIDHxvC6gLwfV z&Rv~J6nK6z8*z3$mtOM4&LFnbuO<5<HbWO#d`XUBq~&`S`M=E1*ZraVPNe5xxkXol zuo1I&{_f*%!Qd<+2muj_-Ny&PvW={6eF%P?rxhsR&!GUS4iz@Qid3c>fv)BEYb*(M z6ogP>Bt$Ym+A82jT|=|o+NGJBGx+L2dPW!*GO7IpSJ%fyptzc!0^w0noc{uCh{<!z z_@e+nIYvCNCIL6W<k0Re>?5?@A+w{NAn0l7FoIei)SZXA`DKTwk=AP>5#r9!VYG4; zbc2@CE1AaRVnt#PX5(xux|3Rg46&Zk3W$}i&JX8;P?6NilL+vr6ak)TMa3tfQbq&` zA!I<mFbR1Fi=q$n9ENm~R=Oo$=wv}4VSO@w=j-|SU8sBTyV&?8(L{Fgv6{;l8nCUj z&}&Yz28<#%u^1Bx0bk-?1Xd8A_(GX-i7}|=A^Sx}Kllw~h^WNXNS;zC;xFuu|5iy{ zO7V9n(Mj|K%RPslV6-FY3C=o%o=cRdLQkxBnRwC)HCvEvP+7f0tXF&?c8rA`foAB- zfhde0kPlIkPx;QWfG9v6ocxs%%>ezLo?$pL0ON^YgO{VX=NUswm?5Sm7?KkI6{1U6 zXW}tDr^j<v(}Ep}>)P(bGLiC4!ble!p{BSa1|4KEONrlvBp?Tdp`-$8m=({dq4M#N zwwp2}Cd;BeT}8`d^b7EtuaCy>`T9Wo7ASRjvIciTNmZ5TBLnutNzz^b-I<9a6f(DG zBtA!g&{0W0<@7U)ezX$yA^JeUvP3iT@c(cTnUNP4=`cve<4dVp=VRRu7X4GmlZnNk zQt0ry_pFuJZ7hLb#av&?rd0dIN)Q=MRiEV@u^OB9b>)Z%#cyvVE5;!-6Jh&H3axOU z#c-22`XEta%$2|<NM+k&o>tloxop{_4BB5ky`=s@Sl_ZOwRw8qtdiJ+Ify92OK}!{ zCR0oqVj^L)sT^YVbG-{!H8Iam5rI{AssDB*8Wuy1xs0}zDA|xA@%c`zq9E+}ZoLh1 zN^zbN$rIcPE+O$a;Eu#EE<+8X4+Q^62|p^(@51)%6mtzlvg+6rbLAosjx!1Pfok=8 zfU7kXMKwPRIlK=}b@#byGjlbOCEjWYG%bySP)7U{ugOdRL-8uJ)WD(T%Qf>dOJ9KB zQ~I6Q{MzjL9D2AhnOHx|`{X}q@oLe-k&4gA9}L1b*3glq3qFR}?gta-LykcZnQSU# z1$P)jmb-2h_7!~Rd9q}tinT5$DMsmSAj4`2)5f{k9XP)9;Sz>g!8#6U3l5fRjuGb) z#Ad*v9bw><-lt}!yC(Ti^K^HuikWB85^Xkqw+8fMl>|OhLeLw3^$(hQ?HYNmTuCS` z5$fbah$g@<)nbLp>ISnb!=T!N$-c1t8BPS<aDGU^Iywcb%bK2(%mqCqCsJOm#erF2 zsn#Z7Q8O)v^5`{qXP&$JkW1l0G=c581NkEmB8X(M{r6$(4-LhG1*NQ_s9Oa<x@_oe zil9w~P2xPFR$=eznJuY_aybZ!0B|t%EbK^Oc7@)+b0bt`<Oc&^OwbNWR*Ko7L-Jbl zINIf9hiH8xO=CRj&m|JY+C<N8N6RwHJ6xdZX}_DA$MPJ+s)D)7?|%sIkR}2IQ;}d~ zL7IGXg_J-cc(k<Ai;xpUwXkpC-3M#O`6!+A(UQXf8%Z0o{+{<22%c0rNzX%^HnOSc zh!**4@U*;lz5;Y^Vf!ubwFptGn&k~52<1f%RAuhCmcbWZL|I28b{*9shB}9`!}k-d z3wz5C?BAi9g5usYpc6#F4uqloW#8~%9?GHH!y;hq*f7ITN}2)<R$8z$h(O7)!aB@5 z3xP){;LgZH+vNEm5ZcBEY2nsL5Gli`k(O@zcC4!BenKPyt9vLObO*BZe5)bs*ll*5 zU-eB~{nG5}zqrpDY))-WwT&TA)|$Zxn@9Vp$`vrsJgKr!qcf%NTP%Tvc{%P1d<u*^ zp(4sfTjOD9f<EwuUg;y#>4QXix4ovYSDxd5Ow=(5Hr8QCfHTuah$DnJBk{6a2pj<- z{#XVoA$4$Cf0g$47kU<Q3O;P^!0%4J|3Va(t~cY0U4Q)!W?vtv!Owb`SoiNZgo99E z#4i!Avg68(lYx^4wAbD07f=)snKH_BuMP9DHdI2VxdcZG$f83H!W5st!i4n|1VH1( z?}7l9YWlolS0Ob$nwoy*Z@rryE}K@B87I`h2?K?D8iy1~_RKT{q}}>)7&?TRNWcK= zF9Gm)Pv0kLaPbBdf5FBcQ0&CK6Hxp%g@7jzkBuUr_*M;kYi#&`fa3djPx}=Yb_hcL zTm}Ad+Cot8+qAwM{5~+gZeV`?S3*e|7<V@?->HG`jP<?9SYkt{#e{Lai7a843T0n} zjPITZY#-!7{uXM)938^1g$#gEfPWTZAax$ch7bnl6#1m-2X=Welm&$y@vH3oZb$|z z<8vIObqb8AA85BNyDL)h5tiZEa4NgfoYH2~%dTWOZ5?W!sps->n2f~h`&iA8FZ|~5 zK}#<{=1G(pxv(vUgV^D}5IuN?$;c153QCT!5m|VjY5G61S!8tZB_CT$EQo&wen<kX zn8xsT0>lL%fD|7|`4RY-npcQ{Kj3#v$uKVORP(S@+w@CVasC6jIJI&<KZ_i6*|oVL z)`HGoKiOu3bfU27dC`Uk6tnGQY<gZY)0~;-gM*~TX6Bj|Zqcj`1!OF{oAd<lkaL#Q zdsr|s`NaS;If37eZeV`8Xn{CeSyz$Qui8sHgJ&VCqsbxIdSHoc5XxGKb&|ng6@bn; z61&5n*W<GjVux`iLJk4-e`TSCTu^B2vI0{xaI!^-KY~VaHV4SvYZoKIZTj6XG;^qJ zO?@t`9y|BJIDzz6D4peSF+>-ua2GZP@nYg0Sb@i4{S2XTe{y(9U57CknKCer!(_6m zggOD^c-Tl5idqJJj*3sBVylG!5*q+HOr*S`x>4j?8ZP3s*rH)=x&uoUjhXNRX%e{; z8K|Lq?qCcF33-x-KwED6faH1zknBD4LATw2(`>VlTdZac;xw4-sdkW1JO|5OHqRI> zOcm!NI`bn$L+uZNAh3UFlTeP!p#wZc1dp6CAfJjB&Cw7x{hLTiIM@x#Y5Y@*k1*P( zq4WRxA(8BHja{nMb?C#*hun5J;S&4szeFiJ`BL&OG0#EsExB6Y<We|B3+r@_=s_RL zd;CQS8#(i10ueLq;c!yBEi{j=3~JJ`MPulmHFhBt!+ZdpbmK`JT!0^k(3`+^bE{BP z4B>f0q1?P`1m{?(qz&$-Hlq6DngjC3`F}b@s)wZ~F)^I1Ir-q)@t`5z1oBLAXN6D1 zON$L>um~$R355`!hqslooH0oZ15x#(KFL=oTtk+(BiOK~igqM(!?D>XZArLWZR58i z6?Ev?ismiv(|<}&XY~KHLAgcFX|Zylb6R|A7oGWV9MsGyhv10AN%IC)22rCw_Z}js za}M=POyH^rbqick9kBH5r<DMF@j~($o7M&mkrrsF_HzxOeqX|)Uh`Wzg;nYnP5IkV zNj`O!ri8k%n3-1F;ym=@8z@oWwG569zX56yFr9Bs{T$IYsKPNpULGlMvrVfzsK3(U zpo)_((n}xtLO>HC3VWd(+un2s#LyxN$d%}ElqK(?=r;(^@_K+AQ%0#P;E$;fBfS>f ziS{XvyhefejrMwbvtu$eIgn~f(Q{R;DYij$qzQ3KF@K3%D>C3pNxHG7n#nff6L=%? zND*9{izev<Yl>#W2TWwHzDFM0BL|wfgv6oA0jZR0SJ*{)C@)dF0ojd=9LRFP3Ok_6 zpE6M&oyt1C*@1&qa1cwq=bc$JKEtjBniu6ZmjL-MW9zUUvl$-n%?_f#G5o(MiUhAS z#|whd-?58NuY;IMrwe#JbB2f^$lirBz1Xv=?5N7x`IL8wfI|N9A!YSJHM-O>!WfCE zjY%CMud#aKXVc&xb>o<3;@HI41wC|oIzdHeN_7hjXBiQ5ImR?dHej}q?NQfa?F4IR zg&-vO<o509NZNvLN!%oPAniNEZiDZ*gu01c1qttNY$xieg1F~{uV~^N{{zXnBes8y z2WY08<ST3w<`VYH`OIo$g?<47?oxl5O;<I@@EBIA0463%!T}rTM<|4ig6mOKN?~6F z<;zI_RZcpRx!5xtt-=V5ragfGAm%DZo3wQiuVw>Sk?RvG4m&!f#9V*-lHQ_Xmxb4t zk=WvT1d)AdGvTU12<W5&V-HXPY|s%Nl?qo{-ahDD%+-#3ay1zZ)<kEMK7Ah9<DTDP znpxgGcrmALMJAh(CG#DF+THTLjD&U6l-O}RMP+I?5wJfZ7h|Hp5SrM4B@Hl<3npCO zUfM%Cp@Uj{S*{wN*+*4gZ3@M1apKR7znpnTUIIt@!+R)^e{zL$q?`dbRAa!v5QlS% zZ5{P-g|oOGzNL+t`8lQhAe$Gm7M465%cb*LH7<g}mAxMiX+EqJF^5?go~lsaSl*H7 z5}eS8t0>W_c*?P_tk1xK1#4rVsp`8GA^-JI#lpJ)=YXzHo~x|B!4A@H2*J5_u$sRc zO7bh?5hsoZPP4z_<FD@~7TA)pA~V`xyveS}5t~cWpj8s7uq&L{a!FE&`YW+HNcp)4 zlHtnbVxJqdAs@Rw2l<MKKFIO{(ku`(Myk)s5NpDDK}d6aKg1uj@x3D8V5b*>FDT+t zrJhA8+P)J68kRO}sXH8YJ*TE`?uzIjYLDy=jtqT3O<y0yplE$9VJex~ES}J@G?MSQ z*@Uf9(r&zwyqs2pt4073zf<EupV>8Zu^aWpr}>gOD!uhXU05#8s0U}stj55bRoI0- z>K7vf-Re8=u_5?q4541ggL(lfhL4B`pjX1h)yMyxMFZT$Qm&j&VI73x*Id&83WX<w z#-3b*K=R(T9z1v_7AGv1zoR&+1fB*XZpA{VhiC;ktKD>1(B;Qn!{4P^$+08Q3J;tU zupNVnE~X_j_A^nKxy})97|(Xo29HowCfgw0HfqCCI@8CuLYzzOu7vNvt@2DyP@X4+ zeTC<um*&`WG1qP8@l(dw7S}L@fn?0R$DhU8A-q4Y70{%3VzR_Me$p7w;%WykkU4Kh z&g5I>@e>BluYmEixZX;ov7j@#zMHWE+>|LB%pDB%W+4}(ZSKU((a(Rsg?`d(A<~1o zAPi=TvtC^|;|1@8o!kX+ERhFlfZTJzzaesLgMA>(Hml^=ZYwT=(is8Ou|4egg4{XG zqpqq%t;Hc6DN#BVT?;EZg}ablc@?|We>{UNLz5Ey3=uRf#qRl$RAjS=yy`4c`4Cs( zx9q^~YPmBuCnr>Vhu^0>5*Il_{&7XK{p0lWi^}c#cx82wvRbnTjxP4*??RoIjsQS4 zS<bNIt#JN!<2wMBQIu!Asl~52d+jMyP~&!o9h*cNyUJOc_&uhDKHf|?^|Q=`N6%FQ z+acODC5NqXV)021Ttl|qWX>9=8xPl-{&<UBkrRr|b0;0KInc2!&jp)X+Xq#Hza`r6 zEFLip3|6Uo6~Y#FGKqH(hw0MOGi>eQUAFKZV0Of=gGh9Isjj1?t~4I{GMBsuit_Xe zif**)6O`5carVI;*u9vHB^QoRSHLd!mg=@sY^h^=VD};*zcHg|sIe=Ib*0qtUTOYY z#(E&G_G{`JL8|-Bubq0H`L##SA;rM3^|Ej4W#87zzO5I1n*%T3>vM4u@=K@al=5mO zF}Zo9CfS%lc!O^#WOeKXNjnh%?O+o3-%Aq!lbE^+g6sBH@76K&)`62~2@wL@dhUdM z7TQgoOR_)vEloN|e;e=y2amvXrxJY(w6N9(GUT)2Z38hIA{=R^mm*$czm(IoRb3;p z+=xwSEC3@Pl;oVwHij5S<~qN~{Bz3OZrUwln8w5lc1nXWJYfuaKYrqCxTryYJl26I zEhc~gudsJK(u#5!N*x@?Z5^(&Fk)~+pbdj$1@+&O3)^&O%rz$o@Ta?Dt{X)lC+3<( zfqkTI!!g8{{sMwH=2`}4kFCn9p_#e!)L2xj$7*D4q%6q~W!BnbGy#?kLADj4p=V92 zkJ^3bb!Ym3wvDwGv4myAU^HD39ZG8_<tl(*o7`3=-^UDJ0O<g1%Yp|!^UT2u_0z=% zp`Ti8M5#!1*kvc0zCq{n$pL8`FkpY1GQS7wI(8o)1MmC>xM)cgZqii<w0^D93GHr; z0``TFfbJ0TTY-vw2y}Ml)Z0kpHU_Q5Kv?`Rep_5K5d~;z`4zf7uxGh1lbaS+J07V* zFVLVr0J)`w_-~+5zei&xDP~E3cbi#cGvGDLd?I3tKG=j1-Jb^pfiS9pzdDtwVR@(L z7}_gGsmwu@a(l1%@5nuknFXR`gFb^An}({2D55q&OoZ<dd6<T%H);@}<?rIJ%eXSi zhS$H!SE`0TE5qfK6nE()0b#`%X0Dx!7=rw5&@Gyv4BVj1@dwL=iv_a(Yd_M8XSC}B z;3rIbge>Z<i<eS9^Pw(U3E9=|UMYnlrNu`FmW|gjgef74_KGH)z!C$HVf%K>1gvPa zgaDxxl`CAWL@KnTsdtIOp7%6jWO`gJm*!#kLkan-xU8K{G2~*)MO9?rwCNJSh$RKb zRD0sY0W!ORJ$fzmy4|cHT-ZskjGidbCxI9h$Ku;Vb}a9`fDG9|l)ZqI?>#`u_Z}eW zy*H5a_7OTy12SaC0nIaj6me$)8M4<ClsH;LaHe%w?^3r^!vB;A>mPwJd=edtV_W%C zSOIW0Rv#J0%UDbT)x?GoXOms+U@?)vZp_AGg7eYcE;J)Z5iRTG3DMI2w9NAdlz``b zTIT7;w}|v78-S=}{#vp1K82aRQj0T+gTg6^uJY^AEV!o3@Nc5?wA3<a7p0JZAk^R6 zvHc(V6g;|N*|f$g6v9|oV?7k2`OG})P@#F$(mj@!(oN3`hyW47P1h16C3T>wsVq(! z#9hxn2Vi2gs{m7rdKQ4TwbT+rrBHJ%8A+x$*LKnac&XnlG83bgd?{aaiJ6jh+fv-h zi+;!+WsCIK`UaGMVw%i)t|Nkfn<9z{Wbj-tpOv!20h%2o$ced--roqAEpHp>j(PT? z0@h`Dhy9xHC=T0dam~Jt`~kSi1wv`c6f(~rsV%nK@^+vkrW#@gL*DxqBaeF_D9)Ve zhL$*)$)8RL0SkiAyCQFoHa;aU`uP2Fut*;Q9ZfF3e@Cw&67xcME_VyY#3)&qtZtyB zDX1TMS53Z6lyBwo%_rZ4j={wT$hS(F=9F(s<Xea69;*@fq-sBr5vwQy=k1@tLx{^e z5HH8*XTT`rZMKH8VB?L$5nJ>TVxb*^BLCcp=(L#Khd+UGD`ml}u&BsE3CSwb!>H$z z66grjURq$PAB&Mb3>B?^liKdm`<a*HBp2m)9m=-Uux5}CF;=Tf1h}(PtgdIC^5;SB zeEa7@!#o!&%U{G0-TEs?46Y9#3zO1a6GJRF#y5US71H4A7ckEoBrVf8_d@|hosBIJ zTBEZNIER9`)Htspvc_O<!?f<6(WD#gt)7~zRUE~cOKk6g@Mz^nS|O;!Z?&tn$7xn9 z78;abN`nFg$^(htp;FdKGIOx;6da#c@8quxO6@2Km|*=s{j^&T*1zVD;n^JZufPL_ zkSp!UffP%rh^0iFKf`q^bWD7fzbKMYN-%Yh*tM$IFjJCHabPPecdNG*2zA`xBIr2e z8MU(11_LUlVUT6~m18zz`%x}Vu+hylQm;cM+qv);@3pG~E*Lf)<=DMTU;dcpPB9EX z^)6ri0aQ{m^R$Zgj>d;!bb0?H5<L0>Y++h}Jbe*x)X@mXIKEM&jYeAX!$Pa05w7~N z2i+Zwxk{8eN=N+64^F`$JT@~Ab_%4KZC{(M8L(9RNjR2I;)^$6l%+E|M8Lb`+gx%) z&xV-$?*YQdA;h2(Y^33kPF4{mN_!CoBE2>@e?cxZqqrEv!KVAI*1*?rI$u6C1P`p8 z{K8ShN0K*~TYP{ZaXDzkJZ0%)%u}auPJr#ypyrQz2Vp-%cTfn&-z{(x$k~|81c5GW zK|fWuPajgam+i!6JA=oHiO{+%CHgg}7n3~~N{fPedvfsW01NXIr#O+7ZRW4~sOi8- zrEW8FDyxx=m>za|3!%Y+rj4vXr}=}!d=LSZ`c%5!3}*x{es2$|!1W)vYAN8>v*|jM zhFtUbkgCJ@QOvi{;#%x5Y`l63%^o=Pl1wh6<{}DA%wtZCV`GP;+mKXik<bipP=uig zTG)mq{`Enq0<!U~|3%}qE6m>JU9bj$sJ&<EEBV1g=yTj#O6A18TZLPiUDG~5otAg; ze~Jb#KvgH6rs_T8kZs*@;@E%uu?km+3Oy&FPT>78)VR?M*qyTI3Kaj0B9Hc`s=V)f zC}8}Zs5nyezA8G2qm5j@=tp3kgsK6{d=x>S1h0Z&?+3f(q^uRtH&eD!N5j=D)a>Rz z|FP_Ezb~-x>2C-Nxjs0QfDxW3!W<}Bi=7DA(fa>Ixa=a%b)oPZnV?l1gcTsnBJaET zSoA5(X1(v0_$4Ki2DeYtVtH=_7E@Ba5a<`C1o}BbE`tmpN0-i7VZikvsqx1v2781# zb=4*eHUxeeXa0NeMrlKN3L%mb(z1;>3>&{PkAEkOE3II&d^sspVy<&O1q3ly9z7ta zxZ*G>_M!6?J<PO6FP*Y^k<|}03q9;%-qbACBF~{u0KsLb6L<Vz_tQ$Rlc)){KOESk zJd72Xa1_oz5sBXi->H*s<>4se$i94pW*KV_2R2vFT4&3}OJJj>OxvwFc58v%RsAW? z8-N_DPAE%;L3D%8^Ln2ac&F+LN_&oa6=>3nwMHD|h@aI3r7Hg|)bQxo3;;ss@E;Se zNS*2CrcCmSr1z;h?nXCK8l|9|t+d0UDcf^vAIW4~@BuQ4cJ9ZGQUb>UKa!=!NBrt} zfFGZ_5|1A~XW1hOomTEXS#JLS+j2v8VM_#U9T1q!Uxax9j1l%k5Zl*wBYC>q#TwVj zgLiJ-K__-Av?;h{1YWttbl%R$StrlgU6Y3!=#DgPk5s5r;7=66i3LX^l*_?EaGNgg z1D&ibuLO#{v)MH{kiM(3nCf<Hgmhh{sH8@29A6UHR`nsZAO&~Gwe*kh2TMQPSO)x- z4sC2n+n-05<~L$prkHxnCz?kJ3;G-R$j;qnn>{6}i_7H17+g-{$4GPq&2G`1)}AEJ z(qTrX#slqup+Grq@h34uK?O0|)zV;XB-vW-fqM%GJ}BhaQGPq{M+$YKS?JAH5Z`3= ztI$rQ!qr!ZReOpj>jTNn+uWF|HMTi%T#;xrK~deW)lTHXjXrONaV1l9I;x4VY3@?0 z^Afz^x(JuyiNtPlLz{adK_?{;WjBOR+Yr&{OD|C8V*j8AyV7YMbt`pTz~MD^Aj(sX zU)8a-lx+<K_AEOu-1vbLo9I=@qLS*kF}E}}+up@IGbp#K1iy|}<Xrl0?c|^1E>yPu zWn?vST1<MH_)9LToxBn$>9|^oyS;WYcw2WIP1xjBwUd9*E3S^>Cf81m_lkR%;>OiZ zeymsABNR8Fb}~3#gOMfMC7Fr+f*=ql0&oT{Cg6frh>(Nx)iHsH#79_D!H~q<InxA< z@$~%tJ;Ijf75VsweEbs+!AId|j$mRHR4z33kc7yNL2fUp8%Llx7VZj_g&k~<`FVyC zCDoG%JPY7Npe7vvk`UuiqCXP>r(SA)-bbHc9<%GW@>Q_WNwtkON<ZzcuGI&mc5)AD zhQ=q8U}PQ}9%)bX%EXJP5oyPv@j}|Sc=V)U)F^GAOxxW%Eotx<sBiFEq>T*eKo<xq zTDb~^urUVp&fEq?>5Wd(;x|I&nIcwPHrHCkPkXI)QML@s`}l1*;yJ;e9EoPjWV7Mk z&GM@c6T9bN=5`|!Cc_T2R$BL^k)_5<9sGeNC_Ui1<c59jZE)z7=5aSPN5`}E{^oI~ zo)ZCwEeb(0s!U!GVH=3jBT%(LW%36KLvQak28P&bB9E3w==V|lC0(KjB^EQ!U0Xpw zduR*9T(=?YXr;*jJ)ZDJcw`j{VAXAPONCzn^AsUd@=YFV2Lp;Z{Qxf$;9YXavfgkb zbKsESVZWrd*e=z2JLzKE@CY1&4hV3&0Jkw95)-f@Yi1}Wpet-hpVfqeW_7UJNfS4S z2>Oe8ir)n(f<V>Np0J}@-gzr%gRmbP0AF(0)FCuGvc+t$ykn3Ab`%25`sCdd<i1Jt z-k0i0>qD?5^>jhG$lt);oS0`Wc1m<=R?n2XqaIa<;K8`wp|(hzqRls#<T;J8Ea;o+ zbNynd?wvY{9{r|{rbp&fTkzL*qYwWXl+W9RJkZU9!C(Il{%UzU>(A6J_U5Yv=F}bk z1~v^Bze)J?k9ZZF2pVOG8pDZBw;*xKR9uJv8`U;`jI`5n_-U<hz{d9(EbT&a!Cgf> zu%8GVr|ex9qXz0F*ujXq5XQBo`khqzHI%LiOpRCC_32v0SHk?K!I#cPMPr#%rYb_# zcgTIMJR|={#KTYCLUyyo4G$j8u^+V?&!Q!3J6c5}Gcb)cbL`i61!<iFqwyY0VazrX zn82Tcy*%Dba+kp1n8?ig$%2chV8Ra6{jfh^k8HKjKNn}J;gYACcVcR=521WeTS!xl z?(fyXA~V9~CU@bNHG$Daf7tuK46YuHl^f0rj3<lf`d9KC%v|B9&x9|7vbvB`cJgyE z7lDd_XJ$ZZ5Epa|#{~XMu;!Fc?}OjI#xqn&-{u)ON=v7c3OneUSaD@nO#nx;Y65)? zacdE-Lqa^b3|PR&x;q@3;wSJ_t53=fo1|>;zX;6MQO9WGlIT`r1pF8J;UKZSrf4*( z!96Y6<m+G8fqt;|J&9z0Tuz4e`!r|bLS`J2F2OysMv}-wzZ%Y8?kPTf#+1JLbRgtX zWkV~EU?x+6;pkz%734A^I!^^tct~a=2?%MTIDrGJDRCplBh?NzC8C|gAjDBuTyVMa zBWIs8hZp>-ytjl%YYRL}!S+cQ1nKX^EG5#vl~g40sk5QFO7ElK=GpAJY9G=q?*uHN zps+gR)?!l^fkR<>5N2(LgIw8R;nu{d9CE@SEr`?+yiP)X1y0;(YXK?!8>s~jSI^ce zu))xvHmtq|heF{$w5LiV<!GGfTJBPyg>bg_)GK^WQ?>pCwT1*8$EL2w>{K!24WZbG zmk<`N>4b%{wCjj)OzyTho#9&>WS;xcWw-^xD^88;ew;7dZd_=2e<M0f`vN_u#T7;# zBI@KQ_)9>-V4eVC%&sL$XlKkbiNbUYbse(6L}GX?@6Fxi#j*nzPvGx34pfYR&fakf zfpd(`bl@v;R4k&O0xkczwg)R#Q{moF{AxR{z(6c6D7%A>g`7guS_M}FUqH7Et}*9L zLKikAoAe8Ms-SYB0$BSO!YhT?w&mT3vT9(Hkxiz$u`oS{*|!)c_zP2|a9pbn?9}_B z_ex!a2FhD2;>FG=IvEk6A|JT6)qtnbm3p@4H(`5R(N1;l5%#_=07D8_R9u7#5;l~i z%eZhwBN*C_v#Bkloh2#<Llpx>TS_dlbIFx(KFBpF4%!QM9mvTbDY4@s&y_(`F6P=y znm5dmG2~iNAbo;}>{{WTLpPj)Vn2kyD3%r>QwzG6`yb}&{1-~YYofrWy>a2QhtB^s z*evXaP-1mLnsc=wIk|{bUImu73Dppk2)>LUR>5%LLCbqlukcFBg4_@kWa45(knem^ z1akTsLMDAGA~I&bwx%%ETqJNPqJ;KGVk7QGYvIl}5t>h6p;(Y6tXP%BmIOaN_b0)z zWxo^btFWOIDtV#`x&UfC|K(LETf2$UX!)fwint$9AQ4Kvyb$u`hFcnG5ly;Nc~<sh z24e9~tle1i&7-Fb4_^d#7O7`T{zu)GB@+XlJAnA=al)h0TS<e!8hfj$a2KeuA>@Wi zEtnk5FBRS}fU(yBDOnwlK=CS8Ye)-1Mo9Zb@MHfVng+>|2U$wrDLlr;+G^515wIm; zaMFHa!kGabI;|e)+h6|wT$993&u=gM(+z3|v_D}Px9Q5fl`CjQ;0mc*U&u6$gx93+ zpX#~W3RW*%EC?-`JA$hfJ8>b^p75AAbq>>47s_3O)eQGHifgEf5uTI^k3x8ejLyO} zRBOQq?NGMi_mucODSl6g-{a!<nD{*^e!FNz@Ba@e^=z?g#h$14K*{zvcDuB%oEHLB z_;8^imVmjqBt#qyA+tf?ZDU|0uz68GEwDq+h@A_0`S<83y*bRjR=5^UG}c3l{QQ=k zDgVKqvpg{@E6^13DwrqWD{-I3<UvrOI_CaYhz)?Y)#3$%lsbq+aQ~18HibH99`3`A zXo2s*90Mm8dEf;~(|IRf_!2hAU!%$v@nsGEG1ZP!b>JAJbMDb9_wqEDOLyW?UDHw5 z;wk)Plo9@q-v@T{cAQkC%9N;vuJx`^9H*@B1HWSOFD2%m%J>=fc|@RTZFk}wib$!< zV}BM}b(PI@N+%lN1bS21Q&kuda0nPTy^A#%>*_-g=r`+wi)A^bP9ZSR=6}LG^mEI5 z$8uU`eyY@UQX}8TPvk}5XBT?$BOUyBTXzS4awgn#iw-CNn;Dv-`~#_wD{3;wKCm0z zm9#=|N{1^V5c6o;;-zB02c?FllpF<}6+^p&H{8bkHN@w&;P5v7I?P8>%{NI*LeC&% z5`&8MW*M;!u??J1?8-(0#4AXxdyWX1&y#$Kp90j<>6stt4$>MmfWL%X{Qd4oDbPZV zowj3xfe9M#4L6)rj}nBqwr;Dqi!XUMq*EL*I2&Y~oUNJ1+7?eoPws>EL@pV12Q}i( zM1{EZ(DH8Xf%(2-*A2*rD<=W-2nln(W*%=_L{@d4P4Hdz-@wO5ArVrf<*i=|L86s! z*-9ryl5cZ&I^jN<@UlptZm&P1PX*+%j9wikA^QT%l=uv|VIK(x8mh<eMikRVE$zLr zPvLUk7Gk=%$w2uVOj!690v|D!#sa!Xtj;@mlb{e98GW!8I9}bK?#qnlWD*jZ_y>O^ zxX(B;Ld%rEw-hILA%{4=F@{eTV9Y)pjKM@4WdI|)C3%H7IWd{XFg<}ed@DmakD%Gc zTUs#5TR9(3yPpSKIG&M&JHyQJ1alU@3)GH_b;jGwiaZ;gUXv@P5c32q(49p5!hQt0 zIDpb161WdM(E!DRpFfM%Q`!$f_dQI3zY3chYe|j+U_rf)d0U<>na7tuFO<jIxEC{% zP_>O8N0e+BGORrKMmQjjnpW7XDHx8PzJE75l-~yPbM!9=NjFp<QVPE;#8GHY8>Wf_ zU=hI*z((qc&-x%AXmcVT1~^9*2|M8TMpK}%FQBFE=|52<!j99mZ*kXq*t&%qPvOAo zXCrYsr9Fb_TUNTjDpyzNN>MPQBe?q%woDmf<77Ab!egg%_X~D?rP>ivU{><Lth7y- zm7c;xMqj^%ew^H64@0U#{Yz2*mCV_W?3wNwCHgL+`L!_5k-8fPrLkZ)V2qLTKajKd z#z6!GZd+26$D1tg&wolIsziT}QrJH9#a<5gKjFplE<h59HUcpmf=YQw-Iq#qF;YmA zQvSLJbyDU!Q^?Wq-d&Mhf^FVW+~$2g$A%70)^Fo>kH?!;bLkK`YWvg`p&^m_i2oM( z5rX=Vf3|Agfg}QRb}~%YD{T{f(=UPpqn6(kcHq+wuvq<k7qtO-E+mU$a`1~mnZm@j zh|=JBf0im41tt#V<b%=~uA>YfEF38n5+;_Ya@xh<z5!hQkX`{GrjB<Jp0K7%@qEk! zKsP7k$gP6#IVZjhEk>s3U=Fm>xW_@jPZ)(o&+@*uL}HY_dccmW`6nDp{lVge{)qA@ zZF2?UZ~{q*{*79rRZDXFVEsZm_wV`hRuB(W8;X};JCM`ZUA^U<o2vU$6ovbH#J==F z9BU5ZdoXu`gzSQZGK?Y0s}2msJhLln9=d|tQXa?EyG<FrvRtCPN;sN74*rk<WKrs% zoVCG&5Rl;_wH@;?142BUPBxZUEz}TeQu8;dfz8Upb}%MPbKGG8Y9?c49WGv4;~*kZ zqCdscJnmBJ?nHn$ZBC1<d_RJ*yu^N3-B&n7QLE)j7Ws~jZ7Y#0SqPz)P-YoWXQSGa z&s*Ma7a_bq`AhNs49J*aPf0W^<_8FVD`=9;pI-=aq;*n|>Ip>0uk{eM2DSJ<{XPhY zIM};c_Mm#)3Me|P%~P_B?E1kf&RfxcI8Zl2z(BC}s5Q`LtJ<xN0v91sf{NqwO`-e- zfZzrQbU{f_^g-C>wD{v9PkMI2j~0M~Z(oe@*U~j;`R!T-9a9K2E02=Nmu+50GbxSM ztH99`(&gcVLH$mwLMCDlN*!c-*|X8;nJD#ReY*hn)PUGGXAlV(%DmWM)og}mDE&2x zzj-lO>+o88^b~b-^AC4(RO|nso7({=O_D1C`j2+?T}U!#boFxT>PEzi(Ygvlu8Kp* zG<z$-^U?z~@wCq5KvIUU8uenM_?wq{tv&VvxNa5X`kt9iv%E4NA4tH1=J$0#HLO|W z@BHihjfH#nbcL`HNDXdk)}N2=;JPyEQ4N5jvzFacRIAvDVa_2^D8aHD_u%srn8K0` zXrcUOVgfjKs*8cocEEfe3Uoa5deUuq&qpNNk5}cfR**kCDSHe4pu+tBa38|P-;h96 zh}A_<mHe8B<^4&jO6<n9!h?y&kP-e#)q+AErs}rwr#GU8<wvm+!=ByTYfT91*=o%c z|1jLLg;ahK^0m;_{x%*)(DdOdEyU-ar1kSrKdpu2EBpyoRFdH9>AiLnEuOtEQ;{-; zw26qdJ-y754hvVf(&w-$4v-W5S^UFB;L(Z|@wEt~oJ6on5<M4MfkVop&ma^S@te)q zftXJqjC)eCcG995iBEkR(dMW4_D4tgOy=xVHbe^C<_C5opRYi5sI{WIR&jZ2FX`cd z2C*I|?*V$g8;iqzR6$3m0B0Kem#|GR<s*Ua<bn5xmk;l*hZl&NA*Uey4lqH8Am@s7 zH1{nkm7O@Vxh&Zni9hp6{H-KWq#J2sA5XeILRad;Ed}r}GObg_K>pkAT1kL_S{@op zrT(vkn5hqMBE&o^5OYX_gONbYSQF9aM?lQMa@@J`EfA9@5Hprv(_NWdT6&>m-Ww7n zKZQ5KhkiQmh@u@K_{-?|h?<Eg=xlJ_uZn2c$g;fp{X}JC?uLBe<zCc{BWYiup43oo zqnk%B1A4K?9K+x4PWWEipKlOt6Mp6j)ZnUgd45EQh7jM=+X6rTIjT9cg4Ep<&!HN~ z%!^3U-bXhr<6IJS59Fd%_MF_)7O6OlYBPqy*Ga>2JsmD%!j&q0W@EAzzZO>`ZpFRt zi?i|3q-nsw2q*c>Z^LIMKwVn?0Z~@&XoG3J25L$}Uq*5^^k9i879gcPd@tuQnhcl- zWhJzgr`sCE-Tenj13Qd<Vfpj6;X@}b!<#-N9C&-t07`U)>d#H`(!gfpa)fvcJ^kKQ z^uqgx|MqoIZ4()g%H(Yy3vk;<HIVR8>Xbb8`YVZI2sOOu*%V%c6=PdT@dCHui?Cf# z1M+e>nuM_7*7U!hhNI_j4ipzhuAt>mob*yBZ`LP@<6g<+xYMI^C|bvo0`GxO!njeP z55UJ-ijFCDF0l3xKB|Re%Wm8V10g9oBY}^qhAFF|#)mT${|ELLkSpk(xSd+yNcE>G z+mzo7DfqmS`U!qsgWj%#JZFpLN>GKOAw4X(k@yH!NdYgmjwkJluGZpu{wa-}LS58~ zB3mi#X=NAfraooO`7LO~7pkAwT`$C(l+)arGPIa@5><!l7v@{Z_d@mg{JYnFU}rDK zBnwHR8u(EWJP<U~ASTL0L?eV+NVFMCZ`9)Ve;>ZTz?~$8h11~62Yh@fYVVB$oZcbI z!|IfVS70Fpz$&a=r=>lHi0#4ada>!bINSo!D0WMk7BkAV*s{6U72UfEG*h@)i<RVs znAiD+&9(v32KaO-I}nML=7wS=SRTKLUFXI|E)>7l3I+BVSHp$sHi)JrY=<}-D8HO1 z*rVl*+zTECO>PN$I}|(rl?~A34!68#-$To+_c^>mXCG2R?}TFBC-4?wx8Ul6(#lX^ z*Yb;1wgn$3QS)~Mi;DEDuw!#zmvI>G<|=E<Z&dR)tAWO4St0oRhGM0aNnDEC8Y@A` zca-RCKn>88=(Pxx5E<4`40|4iNBC%l0-qU~xX(Pq<~lq7izW(gV#H~b;VDhfQhXTT zL$~U9+ww*MX{4en6o5P56x5-uhZUIqDe8uQ!%C^XZgb*(yqjsyKdmj?*+~Oj6`2{2 zT%L>Bjc*~vRRw1w7Q-ro!EbBlH_b*Z*n{HyVi4vdCHe_wNK58+Y|oOpJnt(SIpG!t zOEKJ^am=1FHPAEyVj`?0SJ=h?Zb<5_0IlVHZz0LIfkq`d6FJ#+HmozyX+f>XO5G(i z*Kv&d4P>J8v=!}Ypk0ZM5_MijmoR>qRUKe;HNb=#fb4@CkZj2D7_{Uzl*cw=yv9nF z$a-)aX-ZnU5A`JuibCzn=Smc4ogD%Nup>n-5hytCdnmZ!<`fE`DF_Gl>myqnqWc5+ z&@aiEra?H<z~Uw_&;*LO4t69Qbf?Vsc6SJXKnh1MA*92;us~u!zg%_%;Gp}k0qi9E zErJDsMkBi$ElE$hSE4gOr{$f5D!{GdGuuPO7Z@)7*m?{`{OZ(OE#6pjVh3=8WjMk< z3k5pKdIK`592AP-zU<eDyx`vstDl1{apDR`KHo><#_7xssS{SBaD**eLc>T0q^97# z@L(ifTFG{^UFeAH4X;Bn(#gR=4R@|16(25P4XCg?i{<^`ZX(TA5Wh1N*oIrYk0)|b z9m0|{m){QOs4!^=ZzTT>Nc%*pi!Z{lU{K_N#aTVHteGESk!s=_Zlr<v2<CL6&4c>b z)WGEOnk3PsaJ23jl~O0!<eh~FlV)i}BM=UOY337PgA50XCDa%!az%g-S95Bd&I8!7 z5+}q9XCdyml7j^d;Cn+&G$i<v30-~!s^$-k#CR-2LL0m#aP4;p*Qd&{8PAWvfSDX6 zOQ+hR(m;_Y3;Wt#DBJ}#NZ<$^k=n@{Q3C4@-PL&lwr2PM{tYoC_m<{qg**7+r>KkI zhYb9Xfgi^2^rhvuANZzACEZ>i&e~%QKA=Kfwi^|&sDBNJAOzXD0Z&?h%LoDFtX+h} zml26zfrju42t%7m^fw-_tME$Kw!DLPAHN#@6A(h?r<}Ft_Hx#)46~bavEIXBn~vau z50Les7jF*|Z!Z9E2Y)v-@OJdc^`B1x9KqY&A?BH|HsvQ&c(9bUhuAS(!X962CqkNv z!2saiID|lg2QH_-oDY7`q`PBNzeVqomssA}KcPg=CwP?{d}k=;*@w4KV5brtC+Sd$ z(xEr-a;1*^*_bgOA4SNd8$wy7v-6fE7`O6L);t`Z(?lcSxq?O<`z&t`T8vb*g#sT* zZlu0W+;;hVZB2^*J_LeTd?WZQT(eS?eQ}!6WOe6K1k3&GdLrvKV!1d*d|cjn+s$&H zCrdk6E;@)aqvMI?!fOGyiBL|4K`CXMh_=b?moNNJB5wh<V8d|aCVOydwYwfzK{eh8 zE1esHzZB6j(02o(F?R$fITw88(pO1*OAxmRu{$f#7W!#`Bx!Y>JLq&g(J9H%*su`` zp_|yR!$pvO3=v@tOrwV*@G|5|bz~ntHw=yqAVfZu0D&$Rgk^af=K&h9mg6)ncJUWi z6I;V1aML9C;#Xo41ThITOoB2@g52JdASLUjY!Gw1=Ri<iX~wssd^au28>(pz1ZfTw z5#b~8N%Wg&p5_28zVg;HT%siie<DN`5dN8`6iD(0rsO9q=ALGa?QM_6_u}C4tvvi& z&>Q?C-Bq{I$80X4V+YwQoLTsejgV$L8Z%%mWQZ_1&dmy)LPw)h_sA%xh;f$UTY8NN zmvM~@ICPxoc4lcJQG7zL9iQ6E#7!kMc1=z6{XDcG8bCv^KOzzz)T4jt@A)B^{=S|M zmRp=zbmGSGSy^tdXrC5S+amN?Jr>Gpr`Rs>ojny=V|**`Ei^VVL8p&;*SAuuJx1=& zRsULp3T;ZBGfT+}Wd*g`#u~f>j4yB?l5(sG;yuE0WP1^%sW1MnapPi)tXyg=53k`| zip!%oAH`udGzKZYjpCsnkE8&zS}C@jV!MnN!?m1RfIX5Pib+7qFZ->9<oo^p0|zU^ zj@B~=2;a?4kC7N4%}iwU8YD45h;w!iQhI>OdIrc$fU0SrVU4#N-2()!Ljwe*Uw0G# z!|@4abrB}o(J&1V&R^iWh8Q3qZjfw7#V1+&8*hu@sg}djGu~o+z_S+1@xfTouyhZT z9G}Ks;}c1>NBHd`{DKl9SwQ`)EE<F`r?@tXgFS3k)^5NhMu>**8VqDaLM8{ujmZB0 z-T17doe7=gY{P^R_o|V>h=tw!KVc!J!z(-{19`kg27G+642<XZ%0L0XQv|a4Eixj= zXUTxZXUaespC$w4yjTY2@&Xx{&(D#8B7U|ERC2EjEa5pKzzApDCd0%w`M2;S)EHYy zVJ^eOR``1|yo$oRW%vaOZ<67cDZEC8u~^yopJlj#!mDJsmBNq9@NNp%%kX{*FO}go z3RlW7r|=yz+)m+g8SbKRM25*(i3eqv4kz)8WS9gtK3<0ND14R-`zV|%!{Vs4Q-%vD zzUyVt_aX{^A;Uomx5+Rac;;`(a2bVLDQu?hPlU;CTF*G+dtIKs&%k=>;?If__<CEw zW33V~D`iYBV!o3x%e!k5G((GHPhH_WWPD3zyiOLyaSP8@88cnRj7Lm^jJZI@U`6(< zmN6q`Oc7%KEMq(}CWx44Wz6xv39^I^-Sec3Nl;9xd(!8m0AH~r+oXq-L~i2G6GHWN zUi6ogLgh@=5;R(oKhu&-da0Y6=q{<gWDby*+rawgQtSIC-@t8D_;Rjb?{FoALIZc- zB*{3aAeq058sx1`tFTJ{3(hLS{{>gD?#C5XaKVy4dxhrbasqD%fj58>q50_x%}*N8 z$EYf@DgFSU&%M+GD8A5%uT?<Aw~RboIuV9{Vtq!~+6d?-U}3WxpC@rG?rHJ(WC(|@ zMtu7BV`|z_QlEu}mAZN0T%xM%P<^Psg;NG)$tRofjU0QrV~Kl^rMq80fZ%<A?Z@Cw zzStY?EfSY%y&WH!??&e5gv@@x<<F_2(Lg}*U%=&7w0Zi!p7m6Ix{lWP;qrrZ_*&id z7(3K?L;72FpRVk2|2gBcb=%<Aoc?Ux8$F+^!-wkVdv#d++^G-NwIr4F$LerKg;w$Z z`8VqrooY#a=}z|JH2B3TIGVaJ2>wg<$<8ce0%^~zR>T=!rIt2hBt}VBWO|NFHx6s4 zdUykULT@D`l??q-^hXPzhMP4Uu+aiori=)Jn8Ts0Tw^MNn5ChtJOjGCMjw3!cn7Up z>GktB>GH!x-;w+ki8x7<Uc3KT4!-f*swrEb*pRLF_#F74_{V05zDiky?O+#-F3<<y zdJDexPidvG1}%5;1}09nhWu0LQvjrO4ni{m5wM7|545~TZxV)-zVJNQfTBrULxACe zKb7}qe?g_GkAkPZc3pFa+kKK$UPUA*LT}RR+~ohnPBDT{MjOIT(f>3!g*ILqDxL>H z21b1IXOeJ!O|!GNq2dUlf5=cVfq(FVFjTC=<A*H=yUCG*P;x)*pMkJmmWl!0mI}J3 z0MdPOFt6;ciPwp`HEF9L1DXb7#d-W*+2oAwjAt4vZb>ys$eRB{)(XM9e3q;2zo^aw z@>5O^p+52TCQzaWCw<+iPc|h7;ss}tr~42AC7DfRqJzD-T~zD7eKoarfUkerF9TX~ zY#bol;2U6v`S>?50&p?x(uzks{vxnkN6Rk^ZHMk5kA%BOIf0D}8Rs6wx&}g6jRZkD zCFKZELNz6TV&2*SP~+Y@kzwcmZtq;+qb{z+Kbr?EAz>3pAd%N1QPC)dhc*z<UD)VG z5{wW8TOSE|m}p4W<hKZl5Zqu1OImByTD3|kZShg{Rz<XG1IWV{;G6nPebirEt*MoV zFY^DM`TaHt0b1|v?d|8@e;0l^^PAs1&YU?jb7tnu8I(w;lOT57B^;k0wm#47`h2qf zd~mMy`DW|0tLt-`{``*pS<WM4`<+yi@E7%*QRMYBt6{7&bf#^zgB3|CoLj$3R`!^I z?-2*8Rq?xUVB>B#K-65zP(C#-7PQ7ojBwH;@&SW8qjf%QVvCajqt%$)`Kka+fLiw; zc=fq_t#YfE`nWA+FUfd2UnW%FeKZD6Vz?grBrS3VspjkKb{XT%XIW5}gvM}K%39MI z!S`|YcXYb!??}>e4<<pvNwIu2Z?HeGBKJHupXH0;V?yY|cGmo?#=c_Ez6+NT_2V2g zRo$U4VwNU_zK9JD4#yw34LXbq$9DjmlRlES(dKQk<Je09$lmgKV4byd6cU?(q$eZk z@#bYmkFbmgx<L)Jj0B&62q;E^Ka`4*RJgBG*tC5^SOzq7c-O~^)u7s2&?@JO#RR^Y ztJoej_dab=D&bKXj?K?_-4}m0!D5U{q!xrhJJZgV^#x|R*<u%qkIKxumUv8WC0)@A zW|`jK!t7Vnq0>;E5g)goy=Tqgyo_NzZ;q7;Q}mrUtz)}YKhQ(&b4S#dx6gePanZG2 zit_Ks3;(e&Y?^1Slw$~=7;%NoL5^1J3!Y@=YMPX1x)0I))uobsGrix{-cIY0TP86O z_jSyYXZf4CY^!(GSh1Ukj$3}q#SU-u%G_f#-^nc%`n-+#q-IvaMF!?u*XGJMEF-W4 z<Am9qo>f_*sq<vmx`9Eif(XWkcE&_FGxAMVu#fef>|HBog9n*&Bt749Wx9SSM(O3s z%Q13$gyHl)F0~ZNY0O<@BsJ#F6CbDe9PfQRS)i05IhZb?g99ZLha=_%!Qyge`&(iP z!`F+@JmEz;Uhn?T**p+*IjkCYj(1;c9J)}hC!Y_sXGf0l?r#-!Q{&{8ygS8nO2(D3 z%mqW6o<=#pVQ^@t)63O;#|GnapIJC8v@=dlvmL{!7tg+J&R_;_`L4XTS?avN>$?Bz z*e`4{{D`L1xr{Jz!QuRM1Sf~Lh1y~aCsw0StG*JF1y4ZrcC@*i?Yr$tq#+5%fil$Z zl02)nWyb8=GqiL6JF(yBs?Kk|NCLzdG5g;+!tN#G!iX-G@Z_*HD!ZHA+eg-UG?p^u z@_^`e;?<l@d#~#-v$VYlt$E=c2%VaL!!JyVAG(I)Dj0-M8vi4R&JjTKyl<rSY5Sh+ zi&{GVn9|r~eoSK!S-`k}K5)w~VR31MvMq?>*~X2yg9*7`1c&eQlyGd_e1hOwL6;85 zd_dx|v^Iit)`?pLhLOe5ZR+P|$qJinQ}bPv?h7~rgIK}sZrs~ElHPeX`T4_%&lIv@ zK5d&X!zl`Hi43^&e{SuG%YnCU(Lu&46sS3u!{Vw_s}WLscI<7fhD2g%Y2m#!(P14% z(nr%QVc}+qlRJFtIuRCD;nu>!d-<EbMyuhJZFqMH3%(Cj54DB|Ne?}P)m_Q<9=g}w zY2jN6?jxWC!U8E+dJX;YyY3)@_JPO%GrubdOFZ}~fwd|_k(I@XUEh0Wai*1pkfTI| zgDRO9Sv$*?Tp*gFNCn2RIGhGXM)Q-+`LHS1E$+u243uQh=bA^%Y=|T#_qc{WM$U*& zYJw7$J;S2V)R-Sbm`VujF)A5icJPWu^TA-E`9go8SkeZ|hy5>>tNA9~muSZLWJlLy zsr+@OWmEYwgJ~vAXzFin(01Tf^3s|1a1mYy76q>f9d{G{_<VJql~9*HASyumtQ1Y* zFl|8L^3Jq$i4sma(MHBVx;z9CKTExxX}1!JZf;PeG^$9-_V`g`NWY;XpK#<vQeZ1U zbZeSrYzRG771ihNdG@hLR0cYt7eK#a3`F~%n~J!(k#kxo{a4Bv0J~neYAPzZp^l)( zAIu?}=a9T;_GgP`KQ_fhU*5H$Z)J0==*#zN^;&5%a$naTxdR1k6#SZQ2X8?*+ZS#Y zBP?EyQ!UN*=Kf_#7Uo(}&&+)b{arQ{AL~a*8Nc+(eP>!R1lJMKVi@QzTP~6PxgGUm zJUMj^<JhqF(1^I2Cei~+*sg8z(Ri3Q{7f3uNhEs&e5H+jBMiRPsw)c*<Q`VzwrezG zq|&&A{c-4tpGzy;>RRC-<;XfFUns-0H<3VeKG`jkN@K@Rt-i4Pbwrlx+@!ugXNk5H zEgh6v2jOPh4>ev<!11HOOYgZCo}ALRGdMLg^_=C@cJKtI_32!fXe2_gV1~B!5lMU$ z69Ju(_(w58fZ|p&I9YL<hp{J!K!4}$(LTg{2xrJGx35^85z3X!XheyTcEqZ8H@+HG z@NCFUx?~M_UQXWxo|ofhLqR&dO`YJ$l{R7DH}nsp<a0LYrgs{i(A3)+1>F-5L3ij8 z&=s+1&rFT*HxxE8R+MiBo1fg)g>lT0FxJS*cp=R>&3v2Sl*-)D6)kcRsE^A{T6ZU? zpXe`RBQ5Cx+}M=vala-jxtsR+xQ~d{mT+7$w-4NCr&I$xTwD}pG?&Xho)A!vL1D3D z#J*B5+m<p-EeJ>Z<I~C6R;HQ}Ha@UU(1(^xNL0ZIE$8+#&!KO--g?iVp-r%_?5W$_ zDc1qLIQq*@--JX<Y#hnJz**Ad8R3EtL@3Ni?o9js4C#683YCKqDDrv45~E*g6-$iB zpqc{r-EkxekV-PgnvV06j9veS-KF5km%B*9AEWsz7l9|5_tU$}#ssP~?N8GPAEify zHehGnvXF_Q;F)9>>h!o;ZX-ZJS?4)n%%F%0uk>4zQ#PvQ2mJa9E37TKLeG=NzUde? zU2!+A(ACf<*DCfHNmzRz)<&;1I(L)Cp}&vg)uJ#vCKAi#MplIVcZ%-kzMu}yxtepV zlo3jZ&i*3r5x*`JfzIUiB}YLsrwil5Oh{*Bf#=3wgvUN+t__d%?~gEn%-{4)oal{j zGS4iCHN)FCwZ;2lO&^-f?nnj#A1W@CM-rsqXOT#|o5q-z`>|^UFP244p-Gl}k|Ra> zrmU88c9?sA3O~`eWXqJv@Rz*?7V(6_7QpUM{JV6ONKA>l*>I5?vse;oIA)v2iCqHs zHc!8VP)Q=~rj_hPG=6o{hw-wtjY&{W>P6QuE`M5d_*%DdP|tz<;zxj5(aH@IUt_{k zLR)pW^$zrdD4{hfvo$On6o7*~)&`w5Hwwq!wFE4zF?Ni|=x(nz68l&jVlk$(k7p3v z33Xu(eTN4c`)nVZw;_v3XFNuRs6SmTO-Lq6o;kCllXb6H@s?rL(i{rMdvr#kEyRNB z!w>K!FFZ=Fv)DsN*?bKYKw~KUk&nYZSQpQI232~=q-9Pz=QZ=`m{EYB;i=Fy>2Q=* z{p1_F|D9=R_UA_XbMUI|TnokvLVc%E!o83v#r)tdJcN>6d%{?zaD88d3d+>4YhSqL zX#2vuatJB=!nV4@6kFY4rYJJ3MP00Akt1?*Uidjw6KtiMT|IPesz5S)KqQYkSPAWp z?|`9szMQkMX4M0>E7`S%`;tX86^)8N6qM<cbkE9W@<>C5>OAywo;x)83q|bcNAg@R z$Mq$yrl%=WVeWndB^{BIwap9plPzN&>t`Uy+*9->kXW$~;TJ_7;vth`$!K4DGtf8b z8WlXbJ8F+;T9e4un>dNM*biV`VlKRHnc4g7W+@ZrnztL%j+lT&6?m;P?W41G-j;pp z!dpbAdB2{FaU!2x=45tHQQ}xWNhlMHH?s(#Pcao{%l>oCVqRM+{Lww<OD_JN*1eF^ z*V7W(7jv46+ThZMR%1$@YXci_o4qaG--|u-IB#f^8!ybD+di>)==JV|JO;XWU+&Y! zv%ajS(I4Bwx@qq@wG61te-2pJQplQklPD?sTl{-OuKH{dm@&1RYIfX+>&QzL@qFr< zd?5!$bqV2*WqQ9~)^eWoFXz2;*_98=1S~tWC{+bVBfr@9NDb$kmBx2_N=K0b*9Otc z5QWJYPF6&<Ct<bDt!9U`EKV+<gK0S7vp6)Rc4h79!lhfvLQmJ8>XeAtiJmefLXjS` zr{;;Q929e@!4pi!(Th9y$J`etMTrcTy^NRH0M-S2)|^KV8gU|RnK$FI`V!J+z$@pN zH-E;U@J}fyP*M>Ky@Y&>H}nKF6D>H4FU|2Az7GgJ<=69vG05P*)E-zjMd$Pj?&jlO zD+w7+62m%Tzo7d=jC=@*Ju`dEjGmheO+DXQy&XQ1X2GF7>=vWOG=f#f5qMybCyNOr z-Q)QfSooR_PulG{QgL~rMzm@R<q<B?_uh;*uafuN?F-ZKX`C`?YS3j>rTG@cgH72d z+Tx6`iWbX6BgZmKrRSMQbsY8Vu}+PY(slQZ+%uM~rvjoC{b*lkV?M<|bUorfU7tQX zcf477gT3LxVc%X1X<qdsP6TWa3d?mp!V<QHHclVu=%dXO{zmj%qDQWh0zV-YsMlS! zsuwf09p(xoAKhgYv}DGJD%F8n0%?0G+`6=jxb_jpr*MYT#aIu=BVLxMPktby+Yu}W z{``j|0iLl8^b_8&iu{78lWdV8&m&T>UnHj@h$dHKQLjv$q}2wrh|cuNEDSOU)n>OF z=F2@FMWM%J2I5$nE+b))rLwcj9LScI{w&L}*Ln!Sy3ZoahJjczKC*@C+7Or1ZbCoW zkfnvi4b^sg=Dzkn3T0`&MbY)J)5D)i<1E_rjoAKt-rUft%Q@1s^4`ow0*isq<v<L4 zUJFo<(PCA^ZLYoECZ#>;Ay^|{2qvM)gL1KKC`dB*U7gto4143aKLQ_Gi@uWLdOT%q zQMV`=6WD%nhtEruvAxKg{s%$D)ij>QDJSYSSb8@`l54~2Oc^3JwK@B5>MAEU;Y3y5 z!`3lqC>{{2G`1{l+3XO?m&ln{ZXdGx$ow!S&Gwi(P=b&amBAeVhgl+Rzn}bQOu@<K zda3YUY-=z1KEbjl_*hCnLgY0&i1v-u*964s$|nEvuXJCtQ7GgOEk@&iPyr*LunX7W zq3_oR`i_HCn4A+jc!XFY1Qu|$_C^QNkgR)*!N+a(BP?~lI@EfwD_bbnL+P%>Qo8GD zB~|8<rZf(cV2`QBnm&4@NE~ZqeP0$kX!b&SEiZFLA>X1a4>-rrILlenU^yN2PPwnP zGwp5<vC2fO(4#l2Sek3iTA>z2C=xOBs-6iIhzjcS61&GRTt+ekJX>=B#uuK|C0v}Q z`APO}`<oBIc{Z|Q{LjL4#RX8+T4R_e<3kB`?~%F}Mp{aY@Ycw?>}?++7s}#}RyhpE zXVrtgRx_l(equef=0i<)jtZy!22S(-PPkrl4!`g<=b_p87qk<dc`ap~xi4u&@^mCq z#33n+ZD_?B4=4?*e+l03%Xvs^jz~sl+8@rKA*9XiN|kjUWagJdS-3gPgSRi-vPSaH zeRk;uT9<sgH|sg>z2oABe)+Laq3ZZ)cqfMdHu*4f*KCCiuMj!bm%ByO&v&q!MwIUG zpGCuC-9`tDq>>&gkJoHN{QD)X&zHMx30Ep&!S8-bD)84pZ|=*%w|(K?i0tOejff89 z0AILT^mdJYWae6N4`1?fcgTEgOZ$Z+l$ZO|QayP)SHC>BG(iuS?H*ncp_8?k{O75f zETJAH9Ur<TIi~)loQt?TC2z3tjNHJ%625D)vp#;Z-?5MdIk{~k^1()_iFP?gJn3gr z=A~IW=IUt75HUH-2{&{{e%6lsZlS&M0~RoUbn#~{HBwO4;miH2tLbAJMt)Q<cP%YP zgHkKVTiW4sP~1GdOF-{dk{7FTq9lLXDU?zqb3-&XN$zJPx4n<8CH~hZVO&NeIKmYb zvA1cZ&A;lv0Rr130a17cH1+&bFX(or-LJ{!YWiHNBitgTk1k~$TA=F)7}Y}EE;PC{ zT8z(G$d0L>cZmM!xTDQ8E<M>U4FbF9T`seAPY0PN>XK;P)2@<qtDhR@cVU<3v}Xtu zgnmP>*m7^w6kY!#!gJ!ng|r(~-M97pemeLgAEJ2LC2#+3HMDD)+3j&R9`Kw=@mM!1 z2uFN0#s2wW&Qlbj);<Rc{nFyw_k?fpE<v;X8S@8!5h8bRl(k7QVfAA3sG^`nw<3rh z-i^X(7i*Xg6Ig^Mv1a+=*Ve3uz(RR%_|-##t|BM~0tqTph+Sp^__g1m<KW*Kq0`87 z+RfBz;8y8n)Dzn~ZgOXS31x&szLN2Lm${XVzWng><`cm1Hl`s=bFqzHBebZ<={4Cn zR9@_%<7(@9n?w@@@AY6Gw)D33_|m20Dm#C-2t5TS+}Gnq(Ysr@`$<c=`&;O^_QEAP z+%lRmCy~MSds2p@4z`;G3kKV%W-eQT)?mZ1#SshXVeP@T==(<>Y}*@k3Y{`(vBq0H zY4L=MlF`*klf`&evZ6!o-Jc;eo)PvqH9Z(-A%GrodyltrBRvv!vbm1DEi~Gh`E?$7 z{1y2xAoAZL1|v)NSLl+CkdxfQ#)F8=oVnA=1m5sla?~!<oK6PaCDuo^>|$SV9gOvn zu9{JWxgWTiUc&ttEruEMbLNB00fb{IK>#Demd>~wLTEzKgA;94T+4CV+pK`(ahTV2 zBNq>zwuiSMc>bAHntU#@r4j9oa1wBvv$M5e(%9hM&ekr|glj-c&mx#qZw-!ov>%C@ zC!k;@mNl@;MYk;CbZ9&M^;X8_JnWcl4ZdH{e5#1R0S4wp{^rvzCP#9zwm!VMpBR%0 zCY^Eto<_D=x!*cYcA4p+pjMgnvhwYjjbx^UXnj{H7ALXKlb8FAA?oGtXgiYTjl^LB z_RZCj!B%5iLGu`rKFBMp+D<{X-U<=1L#!hN6nTzUC;(E%4P4$XliGtEZ!ah_Mdmn@ zZECGIfNf?L!{LBq{NcXd#wGD;s;g-&$$E1xj91v8&=^v9eVdA0(R^CHq|C8C%r)<S zhiaCC)2mk#u3*vvVq7aR%Jw6t>{aHgQt1?^vS3opUS$l29ru!!1B;QO$J8tf_nq7H z$Dqk7N7N{oSi{@x3h5Oj?5vWbccU)sHxyRruq4s|Dj#0eg-UxpT#Ko<y{fQzY~&&` zb*&J=9PF-PBev!27?xpH%Z@`qS!;JT1)Q=9)#7V01k&nlRt~NvnK`qlRnVNd18&{n zBwZ@PAWI*1Bo<*|n34*IIv%zs4oKfI=D900LkW^K^7XxkPys+-XA`ugD8}^fvA7|% zS6eW%*e=on^RE1?m;JHDTxPfOB$iMp3H#QZfcx@vDb3d4fY7t(LxhBtP7+$vtJZ<D zkQqjQ&YaH+xH6Rdl;J>piY%Y@U-5ouKb9>@#_+>g<`mGBp`25E=CDU}5k$U4#pQgl znI~<b<uyH#I^5KJfMpcXce0l=Jk|`6$zk_Ci9P2pB0rg>u%RUfg-^H?5qF<I_wAt1 z98HP3X`%%LyMLGjWjr}dI(u)F+bgivzNl=yG11JKRPPLql!*uT#6lh`;wvIHN4K{k znA7ZEiBZ1^t_`xQF+2{&#C~SZ1mhOhhFI4lPjC98v;Piuz?0<Aa^!K>Bb&HLLmSH6 zs@<*?boNKW3AMQPN<LX<k`=B<-^rWNf9>3~in~gKe?==2Q_p(YtMj<*39NS?cdh>0 z#9#VNTc>8QFoT|vbd$uUMwSqp{v$F{)MH<f<(}RCaEw&ej>a5iY++0>uN^3<$-1%V z|0T=T`RqeG=y~49;cpmxlNWmkh%yuD$a4@Lf*IyUve0|#Kg40F%C(PV<%11%+R&#= zU~=P)70k>-@8O1PIOKw1@Grcu8+&qWsLu$m{!1fAjl^8QD&IKgdL-CK2x|>p3x}9< zNSWRBu{r}$erdm(&*4w8L(sGe*Lo~%Tq}v^zGl4WTeW0d4#qbLmKW3M-QDSRJ-JIZ z_tN;o)e~E^rJj32?;T|SAyRI?-}XYpo4d#Bnzjd4C?q2-%xn)1H8(a&u@Xtnd|o@H zYiXY<2&~RrgIh0hI?M-NB~nY$D9VMF*^F?LE)%z*W_zM97%%W{OdyKv`}?i^+EoSF z{k)TRa2p%`QXrPZFs)LkqLI9zXF9#HujjYSad=y*_WM@)vitcacN+7f0Z3sIDH!LW zk5;%cA?i&WIs~E|kSLS9jc9C)jeaD~WQjAJI2qk>tO#EaRpLyJR*c9C>?zY^635vx z?Aq~Q%To0&8F0&3-Q?Wv>dm|miq81^kKkm-WsnC0BOj4#hg7f>yV2FOm~Wti?QNOO zP-g?Yjn}AzVBbc}M8rkn8_TnuU-`>WRC}v1`~fG3WjOZ~<eIL~WIAbWjmNtxE^`Xz zF%t0baL7GLUwN9}`BZxZ`pFWH$KSbwk-uSRK5Ix=olOY#!%A&TyCv4OwLd{P3aAm& z1;k8<KIkW<w3HM`&MxkQ<D|G^S|KA_yRM$ZtiT9T#OyOWJ9`$;ZyekBxK1d+IKi_r zE1JhD>loom-?)B}v-5M`3c8}fg7Mp86Cx9AcCxbeQ|snMFC*gFX_3>mGdepBm)xTl z|2v$dO-EFaTb}80T`Lo}2ra3b&>oAPF_C^kD@~qo#GCbrFoJ7^tUTv_>S{89UTuml zKkJ=+v5lOGihZa3x59(r*CNTGFXNV_gKYgEK6_(dqsN<;^SDZ$=upOcbd1wnPc}K^ z4dSGlE!RZH8816_?LQ*z&eq(`K@2Q!#=vsq;-2{Vja;${eHpWo7O*5`Rcw?{_(G&f zp)X^DhxtyHl(P0jQf*@Ge?1RjrR+s>{7Xy`5L*kvk826voAuTUCP&neTST0n@S?UL zV{evJoC=?Edtq>JXIlPP+&j#HpstaAABOU=MK>`Q<&5~*Q#;vTwTS9*-LyUSljbGa z{&pc)?rV=pQ#J-vdMC|MM`7NXEmOu6Lg&!cU5v|`WoBjQ0KA)rUnL`dGFl!iH;awu z80(6Fma`9bv2IM|q-4#yaqXMQk7Kp%Uml5dWwvLrE@bBv-BU3(@9w9BlyyL7+C|LI zX|yZuBY^O)t7#oB*r{epZyr8N7p`*Bjrw4$F{83M3kH@vqSYjfjF+hR^zfP#t>Tr% z*^?u4h0jwDNh%m$**u8ZhShiaw{Mn#g<Yapv+e~XBOxgWy^+fSv}opOk;JI~7V&S! zP#~&+xgWZ&y-(Qw*l3>8zjU#EBKKH8X^XU)^L4dG8H8Gq<HXOKCA#LnK8QVo57>5( zRClJGb~4+WT--3!{2ePP)|h7Q*3NkFYaj8AtjI3l07&@5$bE3n%Y18>OED3}Pc(nU z8^hJIuDIR9vaS;ICMHdms>8hQN$f?UZ^f{B6uoz@1=sd@wC$N;<}?zY@CHX<GP-gh z#r8B<YQh^FfnEJBh~`fH>KYk%UlpQ;KP(9Ex9#(Mjkh=S{>Z}1-`56uXvPI@ZHQ*9 zX@VT-ZURIV-&t$zE`s^mB8`3fU8ITu25a-kb#p6I|19%vD|Sf7mZ4gT)HC)^t=N%T zB+<0D*%}f1KG<?`qb`zyu`V(2v&(E?8iZzGnmM@(4f9-`H1aIpL&RiD>_q(?YzK7( z>z&_;R(>M=Rf(u6TknS$__5Z<lM9+X>3%NE>M8he{WT?EGxwoJudJBAzTLAv9iNsu zNAsfFWouxMF5#jF@|vFGob{rO-VMo-zN{$+e5<%qtRS=4yla58IirUJZ}C9&Lab3d z_9s_;+Wu|I(-$Sm<x4V)6&V__c?qA(VmE7sN?Kg2ck~X~W^2sdWfW&UZ%js~Y@F$# zV9hz9{+;GvT)j-r=sciH)|Eo1_OFmue5e;@pla$goaCs;@e}XwN!1f!9r{b!V;e8t z$EEWKwI_4S1%F1%pA7lq3Vq=ThJCqThIhGc+{C@s;T@6wtN=y&grASZgm;CvJw}pZ zzrsIyvvJl`nN1lvQx(Y>Crwop#TYSFG4RV9jmS8DssbrvK<;K^X#1)30p9S(k(4K- zeMJ(UARx9QIAj2coZcrIc@?FQqJ|Nx;`=T@fZBa*Q>KaU`bKX{-g4TmRvIayd>&&k zrZGM_hCiPsho0t+bm9qKB$e2ZAm1=<fFEJqMqha!8tKnVG7Htb4AURY{5K(QtQ=|? zWxhgPS){%P*LEd5V6MR#=Bg1emX)JcL6H&2?}wDTd66o>W-Z$?jHHt0nC(Iog^T_6 zX(vhuOf-sWt!stMh@~fO^@g{P-h|1E=~~Cn)6`*1Iy_a-+|N}VB(2jWeJjyV#`H)u znCma=kJf6kOnVQpFP$IuZB=sg=3r;qIVb4hZxDqscd`u^&S`%R;xmKmOndcsJ#Z9S z>Fikix6+Bx>9Df(G>ORkX<ldA>7c{i8NW7z_-$87lrM6tOd9%l8+Upl{Xz#~gK;>S z<74xZOO1}(BXbNv`g>iO=>=3#x$z}@rV;m}cjH@WI1wr^<I&S@cC=hMjb8Mu{VRRg zZ(MO5x#nT>vUxMC=xzGkSQPHh=^PQSe#P<)Rp66K&M-R+HX(CD1UHJnW$%l0>Fo?J z>=<{et$J3X17^O$f*B)fI-5?OW4Lq_`PWC3CusnpD7}dsWU0=~BLnexKo>$|A=YRf zmG-{kFTrHkrFirvIqdQ00g;&g9pP=GH*pgO7@RYe?N5}~c>^5BTZ}TYcmrhe7N_)` z9dRl+X622#7mAF0)IlqgBw(L`zLo1NZ)dcdvKqasNpOKReO{W1YsJ01!E?t^>{ilM z9#@mx=q%1gV~GG1WxkIOLd<o`ByjG>3kQV0iCdTx`UY!}HF&w6T&?r6B-ik#-Yljw zZXI@qYlR$UWs}p_d61D)PRnZgL!D)EN`tPkHA=2p@sQ@ww4{sfSP!LC%AC*ovi>Ai znq<}5E!=ZCeWvfz-~FDOUwti}gT9qb8j<!liQ?kwMBmhdoveKwBfN!lVSdcIkM1d( z)3Lkq9>`1;w1T5G3T!!;H&}J(YWjlFJW9lNVWKFO0V_l#H}}(pS3nKdbzg%L6mfn3 zBaJrPMd^ONLzm9g^tR=x8Dh0~QjB1ZUTzVx2=?B`rHn9I*;XRMZgD<e)>d;S$7pq# z7k~>|ak(EXd&8a`l=b(lx>uLgY670d50*u5IqYr*9%qd+$6v<UWKZ=>?yB1gpEQ=I z<Sg4{Cbzcrb^20r<ZwYjaFiY(h90G96*!&lp3DMkh$fh~3A02u<FMQP8JQG@EziR{ zE)m7MJ1>gwmV(oNb*7CYk|qsiN*+Fz1a_E9uaNb(q1XV>rvc~#<QRZ1-n7Q@bmu{; zbuCk*_Gzqf>ta5mwNSr6f%Zkh6+BND8<!xfnYU-|5d4-u)hPM(SU^R0Cj3-$kskgF zn*DBV&3#^og||@2o9MToxAC+W%?q(CJjT2?ARU<&YkIA>n49V>sYtIvwlrl*M(n#e zePPc5!e%pmQFtk`hcDa{Du<k;V-YdIXD$?hr-LB=5G<{XNvzO}@t4uT$XXypp!CSa z(+zqQF0{0D4|OLVi4(<CgreG45Qg;&S}%!aCm1zn%i>QA@k39|6U%+w=bKpv+H5W8 zaV+a4!X9M_$rK$CNo9_#8olCYD0R!&Gf#9g*w4Vm$_{gv)9UG7#gYMEsD1E$NuLxk zKhz^6D{68g<TL72vxzA;^2)(b#4#ja>Oo{**$PVUDT3+EfqjLRamsKzJ1P0OJE@6d zLAYBc)e3a>l2?w6Z~G9sT3^mMgR9wIHFmP<m5&XUZN8jrW7A_7QU~TjM6<`33c|O~ zv#M`a@@~(C*&kbRJ74m154u*Y!QpM0JBeWCtd9k2uIC`YO8mud?47c5`kKFGUaTx6 zUM;i~wLA9M(5aBSDhp1NkS__Pg6QCQL8OO3sIfQau}WAVilPMDX@1mtlwjjz=cr|A zOe6{1SY||riCho(k&EG!mf5G8cQVkDgp~GpI-+EjuE-GE_n^z#G6J?_u$MlC3eg%d zX3ZVC1O+W6@v;Q`sF2VqWYbP!b*lkAvgs&j-Fmr1*=Zh2N(C(w`<lzy6)DX6lP{c; z-x4>4d&RQLK#S@P6o%t6x$jr5YOEqTnCkFF;u$2Tt@oJcp`A+*x$XGX`7*El*vZsb z7I*^JJRBKeW{^(-@>e5x>Z0xPG4~o`l}?ts8>Kqf*g(qIX*TG(VIk{6y(`r{5nwMx zc#z&#>z((!--h#gT5BJBkP|@4$6Zw%d)-7m${HaZv{8g#jNBw^-h;39;>`A2EL8Ye z(fh$BQ0q)<94Xu-CPP~0g3AuQ;rYgJsVlZkw+F|WGpSm8rExmWFkdc|R#PKFB_^9? z4+(h@-SbQ2SkIQn6on>Jv8L?{x3NH%pZktK{7Rmya68`juhqi`>)^Lom@FL{dBf~S z%AuV2V1M%+XlzMkauS)rk2qN*)tUCn2&r>eafcivI29ZtbFR5aIzuLBJI!s>niSI2 zR1ACL@$@dKd?dyjiMW4{e`u$F|2zK9UD~?iapuCVjLfiR6Rh^XI1DL-RSzaXO#?`U z#AW8U)2!}FT<&T>KSN*HK;K~L*;zHA536&J<Fn>W$y!F#WYeXyLFAHi7?D{h%95y@ zbp^58C`0&wgmZSLoloAf{Qz6_qeTuOUWBT*kEyrSQYA+?rY^(Cg=hj$6FE`|V$4YT zEN4L(9r^IPh{kz*FURupIloqTdFwpPN<TYomCuoLmTSX>4rffOclmqNnDV)v-0gkg zODq6+5cTE(@ioLEkjQ*v1S00S1tQ@2r!^KhoQ>%8Kg+16a+dS1&`8Yg<$taAkBOuc z%HdoVNsfL834C%IxyUovccbJLae4Q@KD6~X)vB0_frOOIDdn;E6izTVR|{RsGu@)& z2_1WEJik_j`lyV7kp%3MF&S%iz!`e~pg;x(y@@b;PL~mX^v~M}J)tw)-g0)FujNwa zoBMsMK4msLi1RkafTbxM$z0l3>(M;yC}f`MG3S#%?Kl_E8v$$nd>&Y|BMysk4{uIR z@PIdGk%Q^nHuU-}pFjPsifm<g#WXd$QfB2@q{*Iic=-D@dX;G}fCcbV#jq?F3HF*y z#I+(5Ih}CKvz^Z{k9kwf9&e$6EdS~XILH-x1h?xEOUJx&Q(J6HL3&(e^Xg1lJ!N0W ztQQ(KTdQWYa97iHM96&ytxx(Znb;R_cW{e8F2AKXHg4%$lv%{4R?F~<L90+Y$X2g? zs-_TmrZ6^ji+9yD=lbLz#;Wq!#A%L+^!2Qq<PRluQe<|Gu&?dRmtBrcJ#z3({?r)n z&3&^gC#<%=hb_&eLs;#yqf0~`AL}C@d!J-5$1V-qZ8Db?LpD@FGa8G?bkYfklp-$y z8T5Fei)!M~I<#h9kt06YT5m^$9en9fGMO>UT^(-%B~2+jJ(l@C6oRrSh&^XsPkxd5 z&^IwbxkmE%^Vk>5{WO>*!a@<Vwa&EHhDc=IWT9RX#%{lOl|8QCBK`E9Pp&BnD1_=v z+mHc|##_p#_%I_~hmY(%y3BXkc(eLieduWUQ*EHsB^b(Doac}|F#8NeINmXXB&>59 zi#Qs2)hR-qePSyZVXi8#rIIts?Np8Hk@!l!NsE|Q**wj;D*ggqVeXaFxIl$V&Go{- zJ|R@L2mm?anutKgDG5uP;I*5j32t$=Ea{8ZLM-EX&_sbtD2hlZm0%`Av;5}1^66MP zG;a3qDwgTiPN_;+7;Hz-7J&_oKg??)7I;}O7dd2P=)hptid6*bZfBN2vb~H7F(iDI zIYV%PhB@ArDRENGMTlX@m=o}iMcqPs{Mps?UEu=M9vJ;1m|bIC-7Z94OL<(h6d(G- zX}5k)gsWFsF<k#6NqRTC<=1JyZNVY=VHXN|<~B-K*!&$SSi7ts<%R$J;8b7Ecw@|} z81A5%yu}!4{`Mw`oi>B0c`Y^Zj{LH%+_jRt%Hf^7E%;VmcyE5$^N~|MIafH0?8e10 zlY=MaTo4;P&f9WU9CuCnW1letRto)e3Pzv!d<@3NK9iGSJmVFeqqi_w>x*skvFYjY zPYNpI1dAe*bTqv-z>%I-b1zaZ1IjF^G5@3q!9Vz7KZLDyb(vKa7WwA+IY+@vVg@BN zKcs?S9ZF~xmq)qLtj0;<w=1c+_I`A5G$S@xVC4s70XtjB;X@{1Lk`xFOHu_hM1zw2 z@W_I&Hf*PNpL1kc1<B!A)3H&DS*g7*s{No;&~ljzZe#>*MNEj@qjgup`UXuD>Dfll z4-cVuGCF3x<d1#TeE5;0h-|mmiMdHkry}J2!?svAx*~Ex2gQC+FqX?;=WUzbskX%; zu${@_3|EtAd*@|QSBR#&{IO|EE`U4A-j+`LkN0aT`D4E-5bDqHhTlY$3<g6?-sR7F zEkAaMISQPPC{xF2oC=j0{;?pn6_p+-<pD`5xY0L>7Ux=V1GM#*VU*iyAEX+7$=tc& zC`tZDi3qsylXXufIGATXe3YQq5mYxCX)7maqZT^CfTKm2BN1Z1ipWhMBHd$m{7f;+ z{T(i<l)vGmvU$>Mc4GMJF8D+zUeJ76VVCcZ@fEHuK)mHd*vokYTK?2ZO4!x6T}<a@ z*|@@VJ4Z!MG50~GkXxBMg<5*d@3orDLh`$y#)5m%{>@*&D?u)E+L)@Re6oiYKZq`A zhmLPHlSo)aPGFcCwccS2-?t^kNH>3s?{-=DRc4iTCJ95osO1Kxe_D>x=O{$JL(u&L zwlU~<MDJrlr+JDL1L@^-GfPnHeJhj5BBmDvk7ytvvP`C<Io?T&MAZXv@LBUbT9p;H zOi0zG>M@5MO>~{ujc}mmaU5K`s(;hd#=uSQI#K@UzdQG{Ao{sicVZU?d%*<#D$*zS zFMgNrD}pvX9c;~EnOXEsy3>@YJHl0ow52M9Bot4WXE2JkJE5ap?xUS0=NP%RKOB-? z)gs3WrrReI4^h7mi|{DVQ{7sDW&g8CM6##I@#^3dQ$djKE?pGe-S!N5@FhYjW)+93 z$k0h}+(}<bj&{)Rg%%ig@7w}8G9ZW7las~f9n1YQ*afac>xFNX{dZJ)b7v&ivkRI# zW8js2E4{HZQX?nI+u-_R1*Bg&R6LJ~q@oR@jrJ!S{ibn-AzjSOx;6}fx$!>6%HmYX z;uXoFZzW{sTV?;<Bs1H}Vz!mVY%7b|Ru;3ZEN1I0HuuQlMx8}v?hC<_D%mr^Y#vH? znH1AL%Kmd^7+O`pKB&-sJsz0GYK!UI(M6!1b*U?|rh6kvY7-i_Pb41J>!{XM4&*5B z<ksLmY*yxTbS*9?CHQ$xN`cGA#rGUv>+$PhPb~B?OCPD3Xp3Yz3&pfFS4|dV?Jjgp zd#R!zJnT4TjhrNWsbO%Xclo=jqp;;R)j_XA7m9C?ok8M?3=fATlZQucGGMCm5jwLa z<_(i6Cd(`rZPEU8$RCBCXe332)f_GBxur8<PSYcV$SC0#!cMLK((9XbyfA`%(CdT0 ztdP`^KGR;8*?u_n8FPV^IZ1byybBF0p|wXyi2J*JBH<;lCetgEN2TvD7aSf*+f_1) zkMKdq$nE-IW73TVOC-u1+V#EbgZakvXc@b)$JG@8DouELc@7<0E8AjW{`EjsDj;-C zfTel_+9&28RtZGr&hO<p2(g?Sz7bpYvKkhx1iSh?=1Vz;#1#K<VUgLm=?LB>_Wb#f z%C?SfPq7e)CNErIeHh*K;V`<e_M*(#uJ5|olK-Qufh+SP>5RMi%A<?R+U0jb*Z4(F zDw~5B)2hw(;^lRhFk<vxyo?Rc@r0i-f7`0l@?5lql>hzvKTd)5ayuKpr)>DT4LfWY zlWKiG#)jE8^xLq+hK3E7*zgB7yxoTP+3;~2?zG|CHvHIz2W>c5^e6b8WWzIT_+1+= zvf*kQuCd``Hr#2$w{7^54fokFX0Vlhq7Bn+c#;h#+wdG4&a+{q4Ffi8wBgM*Tx-Mo zZ1|)N|71fYqdLEI8;-Z3--h#TxX6ar*>H^wAF$yz8@Ac-&o(@0!(`dt<Ckf}i8egP zhTpYejSZLD@Om4rwc&j>eB6f5+3;N(erCg%3@g868y;)Ji8j2@hE+CPWW!Z9)X4sg zKUK%b{;N_`W?QiM5(}=s)PlXEn)g`#1w)VgJsQ5Uw7RCE+-=mkFRd`#6^p73cUfI| zg}bu8Zh<>cUsqPq&@dKNsP1rO^%bQ?MbB^U;~EtI^>2Dzu%_HyTPJB%l*t#{zqD37 zE30eE-9?Lys=8VoAZV1%uc;uIXj{o|^r(RTI+p0xyY^Pot@w3;idr4|l!mhU>VPpe zu-N`ySDy#+MHa?NEl>@rOx3A+Rl&cps$A9ZPpL7gRt2>iwFh~x4c63HPW|3TsXnZI zvN#^wNA-zGj?2r-i<jSN*{VoKaOV`w>+4kC$<Cfz#Ngw0i`=4|B~>N-lv)&6#Lr0x zv{0N*fRlgns(;Bj4qcBA*w7IZ8yDZFud`o5|HPyLuH=+~gHqE54@u8BX6UftBSyMM z9XmSnxZ_V4bK*%^C!aF*)a-HNCrmu;^zY<Mnw&dj>KSKxywj%p^3FQjpMTDbg2I{S z7M(Y1b}_qF^Dg-A_b$BX;!8?O=a-dNR9;$Dec9zT3u@~ESJXEc!G%{YT71>jORibE zOmD9XV)emVqk2JwyQ03nuHLOwl3gLi1?SG5ZTV`i+4(ci?(wR8=N5YNXLkF{Iz4;B z#H0jot-CZ3sHrY1HL9uVs?rAcf>PM36o130SP(FT<!b6mVZEvf_jGqO|C;Lg^`-TT z-PN^ab@lZXWk${7u?a;r6{QUoFlMb$T1HG_^ho`L26sa+5U8u?OGW7dcO?Z_P*-0; z8aNkd48}&wBlt~7N;t*s?M5R=+J&?83wm(AQB~dGE^TP2STMh4vAaB2UtN2tyOyLD z3K|roy0+S=F0HA)N++LCEaBm8DR2cb-SdN&^6p+-7p(7z>sWWb;U?&Ux(35tQ+;^_ zsY`L{D;k0|hP$rPT~=CCBbh-d!ReH;x&;B<M8}+3R#ShXyE0f?rfI5MXlXZ6wGBpn zu*{(F{MR3SH8q8$)wR0pQtt6mZrwC%>w=e7xf=qdWwdmH*VK{iAq4A5uW`NT)m8Qi ztMX<QTl6-nK)SBBtYYl9r$^6xvL&DCq$W6aXHqU<z<+#>d=J*@9s};_4&kn<C=FOC zNx1L)jdEUD-6Nu|yY6_WA2nWsQT{jLohI=DK{#$<b-fWRt?8~LsZE`M;6=MQ3jHss ztCg<zRG3G4VBINp;WciO#Op4%?gMEH4RusmdBwu&vI;A#v}5uaXVa--QGoVC=PuOg zZlMy&3a9B5BxgI^0$8xxsG@%_7mm2RXB<iQ==8B8m6sZ&-Kgk%k}Ou}(Oh+BP+xIH zu%bbb6Yig7cRp0AQBl93nuZ253J*v#2-XH0gs4}R{x^07lqXx$^@#1EqL!Mht6fl0 zYuM$H@S3hi3}0G*X;1<;bd_Gh>-JVjCuc~54%AiG8eKh=BqQBlh30Oi)YWD6bq#fu zhWq?#UE1kcSzUA~usTH{Xaa3v?AWnt3S;x7_4IbNrS#gt+RJO}uB<(SdbLTJC;j-S zgaige2{zfSYeP2KRIALTqCa*cTjQcHK$K?=d2iu8I(A90AM|?XtjHnXukZEFG5SNk zv&4DG`;U9Q_i1dru5o!I190qhjn`e<m>M6?2)ts&3J}lEZY*kCshn!e2{}b`8yR02 zgo}z+f|h$s<H|;2DTd*ysw$_m@1j89%0S?-@s}X~U;o^y_rEd7MApCFUyk(dM>6_b z|C-d{{|*hmTy_6*sBibLXA0M<?td|CPk)<#(fIEFuj}3_{Nc4)^*_x4j^$nd9N+R6 ztwDj;I=cVGIKJJ#X#B%V|DW~wdo4h6O66ZPM|taZC#!E+U^`gv@ZYYq-Jz0Ix7%_# ztcj}K5*n9Z8){l{-S<~EuL`ej`N0pb|IrOUzVW7;e{#!DZ@umIpWSiinxC)z#kybq z>euV<y8E7ce{<jc5B$e(AAIQH4UcSm^s(PP{=}2NZ{4(c%TrsoZQt?qGtWNv{LWpw zUwHAQmtT4HwLO1${f#%@di$NWKfe3k`yc%2L$m#($j6`j`O}WSeD>GR_wL(&;EON6 z`uZDmV*k+z(9tJ2-)aK%uP*<;I{$x|{(o-*di3vl0{X8mzu!N3!Gg&R(Pau%&hKP* zAwRb`7W30BrLgeS^72!ym!d*8F?r<Yt0-fRSW$1iDK)ch;UVwmG9#1Evnv8jd#!-p z;HAL^)Mw8L*675~K?axj-avh|tWgw})|XY;37%Ckzdp!>*nU;#l-BB3@|C<4=}X#* zG$lQrTH-I3v?Luxe2JrGmm0zPaz5}otG?QHDOFq*tZ(RgQ)+HSd2K}xk7C4h`CM36 zt3%BW+OX7+bR@pSQG}B)itifLvn!%&F>{#~*IhZ=(335N|D1-3`g7-B#@r;odxGw@ z3&{6^(gwrJ9Cu+wQC%Pyus+~#`B}-SLe`~9FRhqXx5$b)XLjDK3FF853JR?7-~l>d z1#;jBs!)JW&;pV`83+WOAQx1Fc+e11LQx?szv<`BJa<lUrW(uqTi&DVQDf)pWbj{5 zuKh2Rzg%OrnAyyNS#@=i$+!49MkJ~cMt?P;JVA{p?x#jfbgB{Kk7-NaJ-9VvWV}k6 zc)dz;tX6#}|9bQ_ixAQsN#Z{e|6$tSk)EK^iJwmVbmFIvPu)GRH90Vf{5#T=dY$d) zDO|-X@8Z6X?VU0Doy1=Dv*?|FsQ<7&Y8d{h_&YJEdq^B-jB*ywIwai;cONwXEu_93 z@olkzm~6o_n+@%hVex9%{PfnrfwYp;Y^7Fbi8`TDOEORyI0hO0j~0O(83`(5qDy7W zO6wTZma^N`niNPZ>0jjN6Qlan$7DNFV^r#Ile6{vc-~!c$~Cc%a*gjFNEw!(hLyY2 zu!#fIu=@0l!EILAqj|k|f>IxkVL8sut6xH#N|@MBCCus*h=zIOB<c;^ZY7LBN1Q{& zO#`|UmAgDexr>vPoAllF!#b>*NewuX`>152FXxVd;}csQ=*9FKAD`_=hyLX}#eJ!Z zK2jHfj1&8-Ars44^8T($?ikRPxI3ZM8R%Qmr^u?)9nh+uJ4v~p%1~}2ojiw--(cl- z3{)8%L)y}Ichjz9vQjlXLPzIRV82+^&+)j5fxeoKMn9E7{u$(-LH-%z(^?$~F)Cqv zpX?ODxx61ZJ5}<m#MWr}XHeEHJR58prAU1|m8de{%MAD`S}zhFR8?OeeG|_vJN(Y+ zN?pc#r~U3obE-6hr@XI91BbNnDXorFr%DB{RPaj0FLiu!Am#9IyQ4UrdzMl^<Vk<m z<`G?QPF-(SS_!1pkF-d0R&v1Mf*;EJ!xst4Ro_40NQ_a5jue%V*;frLe@G3S_@El- zctG_JSTqkXk4({N_7&Q6@xqhz=R;;HHPOyDV<fbih}>4+U2DSMIiO|H2^tyD2)br~ z3$*Gg!zr_r`j97@R*LX5{2MLfBj+piJWrvWmxWKCE_{U6tL7?o6Hlcb=5E|C@LU&- zGbm0Cn%Gwj8t>9&kT_#6Q0hXSXq+o>ujh%zv1pa7T*WTs`Yp5?;#5Pxe@HQqw1$iy z6wr0}a)0VEfjXovXQj01^7bt2__Ve`yHmRO=rMLvuP#yQP8&D7y%zPe+f%gMAC@Y0 z%zP&NgcI2N`y~9P@;E4qz?2~g;Fk<;E;XcnP)ACeYj;v>|E@Y~W7KS@RO*lK5`mvi zk9g7iKIdEPrI>x>yFkbAL^T}V9u990hlhq!zTx9D+J@|=t@PxhS<pt>f{{f1(jJPb zYxpapo^Vcwa!w<yC||-ulDDI8jOy#S&FVwI!7;E8yqBy7{&qkhsU)$;O1~d`>QpY$ zPtkoD@3^D*?hg`gp;9B?lN6Q8I2BwcUJ*OoQ5k!r{=+>K8VyZQL(2!Kp%atT&{;z| zteUZSLg;w%Ql&29nQ5n)lF~<|OiWZMvxJffCDFXkT*i(#&v)!_R{0WD!VP@_);N=_ z(&3wQ`or`atiCqml%%|oMk@IaqK*ctLDL8PHlf4W)@OHIYfO>V-p~hAR@qZ1JG}Q| z|3JpLq|-(l$!aA1_fXOsGGSo-fR4nrgx${8Xx}L9%!&uE5=QgufEYDke1bI|%!<kW zdu4z1W_aQ!-DP(SPEdm>!(h@ITtBcadG~<U#6bTNtL`4Q`6C7XNQOUL(0+g#euK>) zy1uP8nxflH5@k+QLuN@!=%#n<os6+OQ95R@j~utzq6H+e_+y}5Hu}V_@l5x<^d$y; z3H_(thwqNo&*ke-Y~!hj)}szTfbj4rc)*)_43+RP<kRv?r5@y2YKNbQ`-5L8b%*_~ z@q$mKPh*%=87K75%b1=@&zaQGzpdZyzOC_rxRTiHXgvy(>+$hgp!8?6Vv4MOoPL5n z#O^D)`h>sStJEKUqtqik`KdTXCA<hfrOKGVycim%LSx2ws~;~;gdX(e_3%h$!fAsi zq-^eujo_<!N@O4SDScLIM|Vvo6ge`W;o3vxiG=LG-%b*@DRl-<w4FFcC8$voGt{Wh zj_F8m8@xNUbzmT+BsnUZ6s4rbs?@c~0ar<PfAi^1rH1WNYIn5ENA7Pry8D~%`gg>~ zsQ8Jjh7Iedh9TeeC_zzw@Xr{{xYxUOiY%FHk<^XuzmlLIG`xZSOVb$I7AHaDM3s6& zav(iLdIak?Q}&%ZqHl-8f9pk9wEDMRghhvcwO+(*$JrIN74>WkO}BQwrW^G&c?;Qd zK`otchV1@NXJ@uc1E4-`ZfUh~R$cvUc3)~LtQjZ!8`HJ^f*s7O)I+heD~PGL(<D)U zX>EB8GxoibYGGY@u%_ZHHehG6&qC-oR9-E6RMYF({$+D-HnUhZxRv^IOhHBI!ivNE zzwA!MN*EdL)VSF-70lU>jUfj?#9Lm@1~6+7eH=ZN7_N}G)9V&20HcEHTC%?*c9u~y zr}j#w)Om~4=YqMFDry%(i8Ca{*+#kLNe?V32=>K`0~KnD^|h2e%79G0y{eV<i<$~( z+N(IZamCSnxGs9$qp=CHDPJ3%+N*-NIki=qUf@&45(l&(I|zg(M;zE4_4DqS{03hI zyX2Qv)E7~BsmME}bmv=Js8%7Bx<&j7>gp~J2F|i~zNr9N5BZUNnO+)TT|;<+ol`@7 zC^*Xcf!_X7>Q^y-_CC+5uRu~<tKHrjb~e>Tx-3OP1XV0<@AM+2QiVR}<`s(jb?`f% z{rz&yQ>-+o*Qj~f`Y)1wJPP=zto`(O_c+d~X&?b&u@>T$Hwa+8ohfe`jRR6=Jutk# z2UUyp)@yz_^(f&jRMl;9bEzH8gQ_E@fIUNdI}mPsEG9pyhtRtYy|v}D1J$(_V-z?f z^Stg|&Dn-%G&FeCCdvQs532AeG3Kh3adWH7E2dYK))&_m%8v20#YTnNa^!U2_PaIR zDRqz49;Mc4U#l%L`;I*?SW&;YsG?qLY@kA*@rKHmNu3l|mtAgi_`N;oWwRy(o2@xp zFToU}#o}$yJdaD=rSq9pVG(nMj%~MfYWXKU-f8M^$#f_mY^aj>(}I<i74@{rwwQwH zg{1+DW>7sNwyWI5bx~rdcYB7S+#aj737w_&5pVjTK7?tP{0p@5h1DR{$HE_ydz8)8 zJr@0{uL3)tnqE`aP+>Rk>n+Z(`!27#tw(9j4H|)<A)I{cA))4~1ZkH&`iQIS9#Jy& zs@aMTCs0~n(N)^>5A^}-w*<!?Jac|&eYGfMc-4%&Su^trScfaGVIi|Bb{47xk}mDZ zic@}WrS*Qi(88`jX`@O#E7)r!4489%5Iq`b_Rs#c<yrbz(R`xshwPFhN538&ip=de z`sc&GNO*bv{rfis{!M}ZIt9kBedm;)GUt8%BKM1xSYRnQ(b9MAYKxy+?;U@&AV+TW zuhG_T{IBPH<d~B0V4i6Ej<wx!z;vE?o+O?=JYpaK4N`5<)oDZVOXLys<XeB9=r>7M z;tF)}NFLHPiC+p2%L@7t|4}^RkGT&W&TGF<x8E5UbR3o`b-39!q<h!tvuvpIrW@Da z7XaNnbkvF?=jhd1_)9qipGF?RdASX*1xi^$Jo3GXNAN)(NQt`b9rpXrfr9Tk9x3au zc_iE;JW?j6)cX5tK>3~yQG`D72wkE-N7P}%-tWCWAJ$j@qv8Lv@&B{<{Abhe9lrN_ z@BIJ${?DL5@=<?QZtkQ0{u$W(&!>5G<qQj#qbmpe&*S>f%JHZyU`v%pWdZj;3!{H& zy8qi*VvIFkaKyyv;b$EKe95(ouN`F*^;hp$j-UV1g3Ir0`&wL{rHvY{C;X;gy#5Qf z_4%;B%MV&!9veRVEyH{5@EZufYwi1Mk5M12HP>QEqSvo0{iQ$GG0sCEIq&t0Uw5lZ zUcc=1@x4Mbp1-u`?Y1wJ8n@Jn`T0Rhj^dbcrv#qfE5`rSIO93x(0N-gG}OQPyU^ip z(V}Slk@4^N+M;ix!~Py?!QI&wEV9cTO*{IoY`zrXwkIt_wvyjGOgu@PsLV9Reis={ zeh0p=zDLF468qimq|_MuU1T!(9XMcx7nxIjyY2Tu)~i}$zl+Q(zbgAZ!+KR7`yF)< z{d3yyY-#G>?)_H!B5TTTz5PDIdQ~g!ceaD{&uzcE?RRsZ6@Qfd-m%wuKh}OPvfpLz zM1CIoorOjH%eLRIvfthIyKcnzrQ7dOVms~koLjAY{<|Q}S<eI30HtoC^?_6WqWtoi z-7bsbEj}r*q2Go+8+vRw#fCXH%(mee8@g?nY(r(k&*QB0O&h*%!!{efX~R7>eA$M( zZTOrGci8YL8@Af;aT{*5;R7~YW5XM5xY~x%^qcJWB{no{SY^W!8y4BnW5XO9PPE|| z8z$RO*{~lIxM-Ub!bjWVSgRVk{(9_oT{F$1(?1HA*}rIiAvj2$QCx&SqHSD|Xk>yW z-#Y$c^#et-i^coD{44VPWAWQ;dblT8^yu9`^?sLeMSf8zZfWzmJm2M!_WBc^hk0J+ z`74iXYi9Gz<XIqv=NFBK%9N71?3Fw>^E|}!63=Hm$%H+Xr;tai2mfFA{XOmSm|nkF z`xh;HP9LkDvTZoVhHe}7<h5v=|J9HV^+TRTeH^L-cmV_2jkrsI_b`}={{z66c@ok6 zX#+aZt-KfiWZ)+}k4s!&RNu0v-lXVURxk)A_H}6ZFz(L@FYpPT_i+n+gXd-3Ch#H# z#bUy9=3AY^fVd7f=eSh^kKkYcU$XsQ2BI#Y!^8o<%Ohbf1cq#P6L2e!q~l}2{56lb zMVDeLkA&X={FJ8%16Uovn;0mu_NHzD9zR;C9W<5_V82W&ZX$3M&y9px4Lt5RrEbT4 z0C?Q-R+ursQrle)yvlap2;9zdFX49p9VeiJG5|dp;DfgNA>bJ-6m2BTBH%kbf^!@2 zO4j>K@dvKr5&T8(<&;y{!^52obkIp=<BkJP;_={~0u1p;I!(Y=c>MV90iKWb-I9I| zH4iwIPUAxSJ-}1YwQR(l4Xor5`UHSCodIt6-vS(dCS@UR6>uew;3IIo?H2fF9?7=@ zc%jG2OW->^PZ7QiSmCwYRlp7&%~!xvrYZHN-~epnd0)Z<FPIL0QZE+*f59W^uLIuV z0|)R~2OOKHQ~~a6;DbC;#^-<!orTRE+yW2q2>k{A`fR1v;J+St&~KGX<)h!n(<=VJ z$9aSf0{hHhEX3alyp>1Nza6-&P^mq*8-Y`1!t=NVKF1?GBXIh8$WdII<O5>YKuyFg zu$)I|DDZ8DA1R~zeCnM?%D4#l2~RoU6X!BF;gRqYfq&wWtC&n+%{;4I0<Y(hxB|B_ zAZ#Se4q*OwE&l@GobRDCjQ>2~2Nx>!wWI?~x`eT!KkXejn@94({(`!hN7B3n__GqF zG6}N=_y~`L*$C|55!z~4YPrV%FSgxnz)|zz3F2k~&*oWz+Yc<~k#wqnr<Yr_EeF0* zNn0aK2k^K{p(*Zc;CvpzryTf89*K*62-Rx41%6s()oBOt_m@##;<f@eTu#46oo)nP zwt#xUT?5?6lP&(h%WKhp#oY*8$K%KSK5%xO#Sg{6pYllk-VS`vcDEvv?5<}HLU@7i z^9cWZ3|!k_)$cmsm4@YJBVP>+GG`!6D)47K!jo%&gBKD8|8(HOYoG(}MZmk3Qcm3W z0)M{@y5nvIUe!ohl4$S1tPpjC`($ACN_Y-;4KSt|TH}rb)`n>pxC6j1cy7n-`yuV< zN6-y-HgFM-v`2wSH(373z@PFwM3~!wSNzy=8^8~2_sW~-D{i)Uzzv-H6WS8t=K=5G zk-EDVxaOzS3;qH-c!X90Pruc2`+y(t#KBi4@Uov#*SKqdxARDNf%ERL@)8)hllDaz zfxqUFyw(FBUjtv^FYuJLv{~Ak2ly$EwB-)q?Z2SRgc0aoXQeN28_!DoJAjG5hF5S4 zyoBcf?h@b!cfnUK+V$PYS@&4!7Xk0#5j^h&e#mn&VNBrYdo8}r1a9S#w!Z`T)o-XT z!h8*^xgXxZE%53Gs4v`2z=i(-KDZYFXKkP##9a)0i%06Q4Y>Ca%Y6X2{&(O^7=c3` zxA-j`IN%9uyz>En!XtRz0vxgxJ|=uRaMd=(Al$2gt9HU;;JF&Oco%I1_Yz>rZi@#} zfj7NqkEg)wmuc^W5x9*<ml1gLE8vg+Ex^}!B;P&2U+kg(!hapG@h$MiEin0QD}90A z@W>eLe21O%HjB>5f25z`2}oT4<t)TRa26<M9*SxE0yo%hfxB$Cz`eFx^!r60U&0F% zy>@X66diVP3lzO`aSL2#yRQS@X}bkJXuDg1qPH#K1&WTg;3iP?pT%FG=+TP5K+(+< nw?NT@6}Ldqah31_e`34u06t>71&U6lgcmsMed+*O$?yLG6?YM| literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/cli.exe b/mongo_mac/lib/python3.6/site-packages/setuptools/cli.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/mongo_mac/lib/python3.6/site-packages/setuptools/command/__init__.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__init__.py new file mode 100644 index 0000000..fe619e2 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__init__.py @@ -0,0 +1,18 @@ +__all__ = [ + 'alias', 'bdist_egg', 'bdist_rpm', 'build_ext', 'build_py', 'develop', + 'easy_install', 'egg_info', 'install', 'install_lib', 'rotate', 'saveopts', + 'sdist', 'setopt', 'test', 'install_egg_info', 'install_scripts', + 'register', 'bdist_wininst', 'upload_docs', 'upload', 'build_clib', + 'dist_info', +] + +from distutils.command.bdist import bdist +import sys + +from setuptools.command import install_scripts + +if 'egg' not in bdist.format_commands: + bdist.format_command['egg'] = ('bdist_egg', "Python .egg file") + bdist.format_commands.append('egg') + +del bdist, sys diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..972406f0b81a6bb333253459cc26d6ca6b9265dc GIT binary patch literal 753 zcmY*W%We}f6rD%rkz~?@LL1r&)NK~cP_>9nh4=!5fYlVqn#^^A8_#%TJI^gY!j>=L zAG}2@_=T>x&Vv?@#y<DxKF+=Os?%xx{{HjJN6&G7Igd^s@jLw08ZU6b1rK~^KmZ{` z5JMAM(1rv$Z~$HC!4o)yr|=Ap;CRx{9O%Py?v`HWxfY*rKlAZD<&84P0_4u9cNb10 zDd7d82+nRC%iP6q_RV#jTkqC~lTXgzr3rG*a%Gw$U`i7@ne3sgON2AVfzYKk@fOxA z69Ju5E^3p|T&)PJl+HOfF~*`X7AD$L?HwSTjZ7$o&Na<qmCvcDwK9RSHM3ArjkalM zs<i3tWB#S<?ip1`X5(T>Cm2Yj>1<UmSY>^(_N?Y22Lhr{CfpjPwH02VhOD`1(u(|p zb9V-=2{swt4_w(rBJ;88eec6ce-+jF5RLOO<8<IjT%aS5ZA{ZdgkZyjWPO`%rWsem zLX>4*!ElpK9-*W0)k<ZD*xanvLOl3vD|N?0mboUoK$RW*Pna;TYg)k%N1oc+_PSrB zwPbUgVmi-dIu;zLRB16yHNPB>mUFmPZ^-Lnw3=RCjn|8^c!g(DrJvK9)fc-tUR;-S w4Qi><2W^kxPEks5n@kfj#GS`CrGOcyZ|xkEokQX#ZVSKAPu$o`Jc|?WFYMg%ApigX literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/alias.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/alias.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04ab23750d6f07cf350a3a7837c3c5265f63fca5 GIT binary patch literal 2446 zcmZuz+j87Q5S`I&wHIFqCXSsz2||JetT(Bcf(M`iF@YBhlv9-|l_`~0GrN|p%X((k zS*zAB+3*K^0I&Q3f4~p$q*scE{DPn89<3ecGF#JXwdT@u`gG6UTUcoQ_s8FRWs{J9 z$)#q2ejmF083ZGYrX-^QrKlUJk(q(1bu+axJFqh+aI!|w0Gq|^XC!dHC(L1uXM{Dl zGc$uGb6FGYE!Ns4e)~DBN_<+aY$sBURg%h|Mk*=t?}R7>*v%{&`DWGTEKy-x<bz~b zwF^BY>_?JU?b;X)l9b03SA%9iN5>yPmtTOG++g-L`E})#PU(~!I>J$8N@jGI9666c zJD@X=Lwab6t@AHa0uDOm)-U5iaWBffNDRjr&y_bQgqKE&3vUz&ndC#Sf8xpglutJ0 zC{5Ice?~tzqaU5oy)$~#w?qS65H1RUmxvY!->59XN20Rz6nHgZ{ffqa60ro|&s1+D zl4IDVcN~e{phy`PvKJrrRC;&NpB%F-`FZ$R+&?+Idv8!a$>KZEhI#K%Z<LI>NiJ2C zrroWKmrPD%PjWRLsiH_<QsW}aqMY@jG>PQq=%i}M{UbatIx9OMh|!`h?a)P#;w^ZO z(RkiWQ0_yQKY-vQpo|0tqk+kcz+z@#v&A9h&Ou|91Q7oNmsvv!y2~2O1r{_}leIJ( z+N=Z5Hd_GDmnvI3RNmX>gCqy=0o_8Vc&t3NA1N=%kBdVty#l^LEV4pyZ+;Y6-eIp# zD&|w(IO9>}2%Z(kyrSalTCI8;;~XIKVL#X&(YYWOk_-u^$+ZrO0{S4CFb}3AG_*7s z(ueLq^lcbZT}kppC9qP-!<xUcvLND8ybYg$>6YZ_K!?5-%U~8)LA(cDIv@ybQHPe- z>R`RT-kUxA7$&~(5U6g5+scHeHKPm(e_Pqin9-*YJMh@td5#AxAO1L&%9A4=Cxa7@ zPoh|*CmOzsG}ySn#>=CO``(j%o_k}R5Z!K#qwmzmUxqloba;L2%1n7KR$)JZi277q zLml~l2?WIWCUl9UL=aY}LCdQ(46m+x0RrYfqNc<24=8YC2o$3;3RM7LklPAqieZDN ziO<Q6Db-cN0E?xpsWGK9V`fltwDA~%yGxXfGXXgJ&=9|)zDG|DcsgRh$f<es7tVqD z^7Pde^lXzkQ{(EKD!U~A5LaN0HF9b&_n@I%)zlW7k>89p0(;X_Q?<a>W)xO76Plp! zotcSbgK#x>s)h!F%W~;Koz31i$X7IUUvA~1t^$zfHKoNGz*2fUMg8jO!~vETIh43@ z&UB%>B?J=UjC%e;)nQPkMbd{#UF6l$kgGYFLzcu!N3yb^Zsn@#K$XlQ6>9Iqby%Vf zxphz^xiIk^%Zb1^RW6oqBvI91;v^K~9P&nU;RcSmf@2!<41a|ll?kIifdTS12tqrC z1EtE<G_edUTMqnOx=byjLmen*>qgnE$pbTYd{g@+R$#Jt2ZZ0L+%QCE!mw(EVOFql zih3sukH%3t|I!FUR>WX#GcIG1=sPJ`pF4?nm4w?uhUe)b>qO{`B^MVJV5tuknMe7# zK_|RG!V5gjrK9Sc&@}<Uz%Eg^a4L&hrbS(&W4N~KYOrEVCv1o=Vy&|v00r;AHL_=% z8mH#eP;jBoC~)~b2A2F&ZGl_>%N=HcWnEirZTXftV1d$&90t|{?^g+PSIN{|opaF{ zrbRzW%jIsj*1Gle>{S+?yIkyc@p)mj(;|-2ij)i8?l}d%0>-@yo<cRi{PnHMLdXR& zp>kv~7BLsM;N=oJ8kqON_7J)T28aMZ=e!$md*SyTzg;aOiS>VtO^$yvq%J<e^%qy< zCZE9Vo^Q%zvWXXi)O-!rE{&MSc@s=f&NYj5fVIyxvoSt;(@TzCgt2nJtcmqCW|zdj O1RaRris`nNxBdsBMPu^- literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7de24963f58b94ab7902ab7d837d9021e8fed34 GIT binary patch literal 14332 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a01f16fc2a1ba04f755c664695fa720e2172c588 GIT binary patch literal 1789 zcma)6L2uhO6s9OyR#azgF>J-U0V4)vtq-!3CdGgv2s&)QPRoXNCu0L4i?kz$mQ+%5 zY}G!wK)d7q!LIuy`wzNqJM=H)v`0#g(`5rjf#d`A^xntsy-$a`yZ&Fl{{G{iErk9+ z*M<Z3Q<&;ASQuiKKoe_%2lh9JVP?NV%;xq4uk8V5)^pT#-hv-Gjr6)17>uVd6@i7L zfyI#a9@uq+fx{fudW8lp=0b#awKHU~%Bjqz;mAVBCosO7aVcZQNq)u&<D;+;Il1y9 zLw**{;#876B`h^gqg06WB2LCnd=ufIN1hc4;o~ullM(o&geR(yb;u-~auOztKpqvR z2?^mvCew^du^>?>qC$i@XFU_^QIC8nF2aQ(5<)(R6P1TTJRpUFd?X0;CV0@q3iv$d zG69c8Fb$J%%o$`if#7Cv*KjDf2Bt`ykZ0e2tIu*74~ra-s5<2#z~`9=Be;I3&d5ca zpOGSA05?hjD}1S`*}zYV=@4F#5pXi(Ipo)YH#wtpnuU2hj76L;>i7{bZHC@;#lC{6 z?!&S~6R7*zvQQ3{pV&*JZHAy$__Xpigm#_k7O+7fHe8ZbPAcQE)R8J1&bwCSC@x07 zA?d-{<-DKCcm|aAXQAvvvGh&)(Rn`?2czM9#*Wk%^l>y?oF5#H%8O~V4`ZD4f9Pj% z7Bq|pM^j!hHCKJb^CHXBRJ>z0So&9u(#saoh4i;!D&5-%`?%cQz6YdNOlU{DnM#16 znV48>w6d1K1hW`k;}y>Bi8E<wR#rB%m)1S>GpJ&TVYgnR*VYJ|{`Qvk*T!dQPuw@a zCv)$imBZTli&YCw+e>HJT4M_>ZQ#~By|jYLqUD`E==V6;*7gdZCKm*Y-iN97VHpF& zpB@@`MyzWLr30Co9Ym)0HwcpBU+@bDlDOrk&(lIieE$jAd#OdR3ie($O|<Iep)9-q z;!q?|V(4&2-*LTbssJ2AHyTBd^6`zM|D%r5-80{npVvDHl56m8W{2i#%UT^>T;bk+ z<p^L5Y*+7(4x9bR^q$-SsxJLw0V>l<IQc~Lr^$5vGT8P4ordR}s*Fc;6bs%v7AgD) z)Cm}yFW+jll=n9kx`B*zy{dCv&DE_j&o`{e4ty<j1#6w${zt~D6@$R%l?!xonRi{; z2H&dPkUsF?7unb#F2FhPYflPD2X}9vF}Lqxsk>j^(Tiq6egKP}>O)wN<y#$iJj=r! z-^1^L)v?Nt{*#u|u3LGO>fWKW@+qCBtPtAnQ2L?>Mf0XjDN7?tjs8r|x)}Ozuq}%r zLJL!A^?5rE_FQw;bp{`6BH^DXRId?s?+R7bZjOv|&FMC>vGiRl@3@9{q6=qg-m(7% Dz&ZMW literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28049a1490a8d461135e5f524e85a297b42f1950 GIT binary patch literal 990 zcmZuvOK;RL5Vqs&L;FAlaYV4Hxa^^umKO04LY0u<wwG1{t&prF&Tg~oJg}WUqV&}M z5U%_Z{)4ZG1Al=NGucqOs1wbXFV4*P8+-PL!`{!Y-#=eEg!~}4%msc3uD1aM5mb^T zT{<)Nfe1&iYa&?0md+KMIf5RMvHJ_+$TUR!YYfOCxPA-}kr@>PqC0gyoiX8x)-{>A zq7C_7I}Aju4L^(1IMqf`$O*9m8mdA54qT4_DzXGU6|I~r=aN-axU05$Bv{3`Q!%L5 zDwn-cV@E}v%P5IbGg1+hH?c3{GU8#DBz`JJCL5h)YBlmzR;1!4?ZlY;wdV!JLQnDw zbCRW#Of9@v>mqu#`*QEqO{DFhWM4|#ZwQxhFdaJzMJrT4W_E!6sW>Q1oTc{RT~gMe zu61=J=eE-bv=7#?To*yJq%8{*@r|fH)c#$0xr$GH6M3h;^5&Tok<wnc@{HV@2j{2a zK)>M6!{B1Iw?8k>l5iJnk$T5o9_Kra<eh^gDuq7Ro{mhBn=F$XwAtC)xF$Fl)dmSI zaNPqStv2n#)28M2X5?M{hIq?p_{LW13w{bj(28(UZW$Q5C9B94rQ{<HqJ!(7fWalR z>GAuqJL~gUb5*1;I1B4$DqbiUXJQ$wjj8GYug_@>1N^)Pum!HW00h)JbjvC4|EIV} zr;v}@#x2|BJoS@^bKB!Q$wVQM4><o)_;UTHK8m{bt^KeqRd0%-a27N|m-hO#OlaT< nP6mvH)RX3vCmTu>s;q<65LsRFA7F9YeY4i|7UgQ(YQX*gqsRK- literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/build_clib.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/build_clib.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46929c6b22eea522e6aeea295c934cb482bb49bf GIT binary patch literal 2461 zcma)8OOM<{5N<!l<MqyNHV+^|0rdq<CSqp@2||hx3L=2G1SCK~R)X=k+q0f+yPfX# z?#{}?fyp&eegX$B@JIL$z9NwL3!JEK&ub$N>5<#j<$8QwT~$4I_V$9me);3^v&#tm ziMECd^nG~b=P(gOEQY4m)D9h>ZRX~kuw!Yy!@Rs3b`9+^Ki>&=Ec68;9pXJh#G}sC zUO1smtZ&eu`w!Sc4+mCr^+6_8r7|YJp{goB6M_q1JB&}@b*-SMR77Q*iPKEdXd-x3 zCR%qjY#{E#Bd^0mQD_mQeE>R}IL}b%5*Pe+nqXXIj6?~`#_<U#1sKLxCsc@xP^^w9 zCNzyJrtn4(kLgi-lJQDl#WCSVEai;x)2x`>3yh81L;Pi4GMdvu;TVgGWSWe{3@f0d ziu3Yt97{^TLrDuli)4o7Oe&fi1As$v+)sF3W{ln(^uZIAMPGrf0#kt4S{fSZ_lNis zLU7In#m96eH8PF9-@?v{l!JjRQ5i1)!@ZRYd<*mOGy(_`A7WY3Bui%-L>ZMh<pR?< zInshOQFw`nw2pPWE(~>)Ni2_e#Rvonw!ZO-^SCS_M8E`$YX}$APcwC7kV}YfLU9V4 zFX9}|f`b}^tiU||f7Nvy0re1nC&4)cDlZkpRSE4^Z)L*xIA*V4VJ&hCCn<|35^!!p zw8nyCLNXIphFdW}TE<cz!P>-yE$VYw22r#@Omw>HaRAQ_JfFfNf3gsIVV#}S)&qDy zVUO*(J$Gtn3dOdt=5Fm0bnMH!%Bo#uD<`!Vb`OdB$|ZJfzm68x&z7=lSIer-)FVy} z5*9KRT-9Bmg+1?pb_Zx%o`GIxr8hxyukL^+PuWJU3v%6+7y0Y9?AiCV`v5)pdhXZ$ z#G3EaJ5#^zE-df_7HWTKApi@(+QQ%47K}z<G`uP3YwGFmk5G-K!F0EF;oT$M=k|P8 z?bTkryRau{f>Qg~d0~kk%zk{>WzSHcJ>N4FSe)-08~d$|x>xVjnsbTlKKJIA%(sJj zx3+=0Z1}zBF8KBzLF<ABvG=g)wuvau)2zUK=o2CqkYIhxOMUA2X3Lu4{yVZico+AV z@_n3FkgQMwrJ&MufdUG2$=jsQOL;EOUo$1E(^Xr9l-C|-jlZhX^T)3UWTmh{a-kS` ziq))y7SSTOXNs%eAn30FuT)v7h-9Mi@;DJ(HodG!SVgF2%EoI;V$cyfT}7a$U6{gs zdZt7il^i;pn8>C>=(w5;>{f0ML<UzHXF^pIWHKv2sz_+#>cVb1(CHZ!x)_85Q{(Es z)wsHYG#(g+HraU4L-gBUl~8!lHl}FRD&(rGLn|$XzNeb*N>~F3FDHV=ibmjEWl5wX z+yVaJpm8N-X|uCF<<JK*()}k~-V_><@IYF0wW;2A(+PLm=3?4u<F#=OeJK*d34=B^ zy4i*Y^bDG<q9kh3%S{YLPh0LT`M)7?1J?h}My1G30QTr479+TB2o-Xa9FG*cosQ2= z$X)qi^g%M79pAo_o}cE)doU)&=-W}5m4_zMj2+(1={b>SawPS&syJsCNC;CN7i6@# z?1ts6xzsM#QF#OK$RA-s))gzTu3NTc+rH)7z0N+Y+m-9?Tl+2T29^i>^;*-m2j2qc z8hq0~y>hj*=6ZUi*XM6;0eK0;L%6;D$ec|SH9-{RoK%bg-HW29Rm}9M!KxcYgeOrX z-UhrTlv~qVny1fRAEwl);_th5n+-vDgRK6943~i!Zt$3#(!ny)jmt$gX%03T@E3v$ wX_C3wS+h-EhgUbzA3`=n`j3uD)GcWG(1pg=_#d@f`xx#6Bz>5AmiamV0c8ZZ1poj5 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/build_ext.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/build_ext.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44313113e7bcd4c209620e6ffbc96468b42e17e4 GIT binary patch literal 9734 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%0AEL4)J_zR%Yt9P#D|iKOTshb83u zlp`NW65f{twItyfIiO^plFO7#cAF}HzIb{Yjck!|qw2a#?xLG@Pq`=Dj637zUE3|X zS$#n@gO2p0cNq`sc5*q%GT{Lvp%4RtaT(~y9PUc;qr#{-Djo7aSZJt*8zMS1udJ`L z{Tpw+e)G!B_iHn3bX6{Km{mDB%>?JlPcaXpO?JrTA5)Pcxhf-q&B3;sA#l*}`_O`N zJ0ic6i#^;(Q@Nn29|v@iNmb<IlQTA<3Ry!LAUOqd6%~*%G87c1Kdwh?8KLl2vpFV2 z1zpG|WkOJ#0O5aQ*NsZC@gs(PaEV~nfO71E8OCnTXokz>1B#qv*sWyKC*K^E0Sooj zKpAa05VH(ox*%UBF$zvynR~K>iN3Uv)Ld1*5=8(yh#T|&OiT$M$({TjCGQ|n1)@V7 zJ!m0jajXd<@!bvWhQ+v|oyyOs|IaD;I&#ZDrPe>A<QJ6uIVFEV$u&w?gkPuJ6X<%L z=t_)Z6ybc*pIt)Oy;i8xPhUJD^H}*=y)B})d_V~yBk#mSIV4wP6Bm~G)tm9fV1oJ7 z{Nw}H(5zC3j?*p8L}y42K25hkjq86`;eV*mHzAeDkOBSAO2isY<<n}`j-HO0G929i zUnb6do_2AJLobsi+2y+z?|AY*F4s~Gn5qx$>p)RxBMe1Re2dMoW`Pn>h+HL(lF2p7 zaj^AW${nMGBTAMCRc@yd@#W5ssk%l93Bc6hrK$q|_MjEhB?76@T_jpGw3?#>g}Sro vv8<BK5hp0ZlI<>#;&c#?qL>5S$IYQ{)`DiqSAJ-Gf6f7t#a}7!*gE(B<kf(F literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/build_py.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/build_py.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40269565ffdca73e07c6fc0457c232323c427fb0 GIT binary patch literal 8585 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 E1B0}9$^ZZW literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/develop.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/develop.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28fef7fc160b550f42226d100bf63ff0228b039e GIT binary patch literal 6496 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 GUj07_sJIXS literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/dist_info.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/dist_info.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..465382b3efad6f7aafdf4888f27e64e55f40114b GIT binary patch literal 1406 zcmZux&5q<W5VqrVC!OwI7Nix!pOo9uhv~5FA`k)u8YC`gE^vyFtaR-3q&JC!?Vg<p zJ*QdTgDY>rjd$=Bao`o^L{<7{wign)TwSiXzR&f!pH8RI-@pC&(;tkGzsM_(5B}FM z%x7Q(Nr|Ast7uALW|dd7lu?ZNm0u6i0VUrNF%ZL-L<}XnW$93OKag3_eH)!=nOPZU zu_%q@Wm72dw9Kv2*U>j77P2TCDdMt;?S+hATu52Prj>bFlzC=L)kOaQ268^5E;v(l zoizenR;gu<@%;k~wutB8NCHSn>Is@MF<H{o-=a$gA`szA0{BKEf;kXlz&UlJ1G?^m ze2;jJ!P8^NcO$u6o-Q&YzjRdIeShE*=c=(;*_6#Po@36@ccnD(hd?!3SN8MRsy0?d z&)2B6&Sh-1l(U@f$l&b3ID=s#FoJ9d2Mbs!9z+NQID!D*H?k^zCmQqau98-lmvG?8 zWu}utRYGc$<j)gZJt-Dfm*ScElz);huAe`7T68b!{3CdlP4Z*XmMuUwHmj=BXSM8v zxiX27cHLT~sv|ewb|E>O*}T1WZvk~%W>wiqu3GGyd4%wh2cg~j_sRcFJR*+dd*Z0U z9p#?fjOr1DdVg!i@Y6j6{T!7&f#|;MyZ2>ZPdgOFIym~G4LBRJ0&U;Y8wwuXP!40| z-4aS*X1m!J#14daOUL9_?;Rr8+vLWx!&M;sRcJ@6Xf@uzD!%X??l^!Q*@mqqu!|3C z9^4@8=<s~oPZUfyI%ubh?)BGAdr_jc9{+Ol*o_xGul}-tdLJ#N<$HdD@A{)d;G(Bs z9MkJYKj^(mHX84W^Rb>A7E0Hdb)GWLZ!>%0f^1>XNl|1UW1X45J$T$8ogPk<gZA|s z5PPj7`b~(v2g5uBLuf?9{ym{5UPQb54d#IAe8%(uvh)y50A?1tkn<+1CFd^UyjEge zp+DjL=XF-?R>ne_T$jDl++=N}-pfu;a4Y29BY6cKUJ;F=(b#WH>u*=+`E2NiEM$Fr z7Px?Op>obOO4vO>%4=IzW}Yi8HA;H>kI@JF<LtluzfvyzV$0wwtZA?(z888EI${3; D5Fu~} literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/easy_install.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/easy_install.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2aee02d1e30a0f4dd5121fe2171305a5591ca193 GIT binary patch literal 65235 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/egg_info.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/egg_info.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97f483fff5a3b393cc9df407c35c4201397f11a0 GIT binary patch literal 21606 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/install.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/install.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0452ae8568988314e850932f69791fc64a99d38e GIT binary patch literal 3986 zcmai1OK%&=5uO*xAvK~XtzYsci!p*greKja)*A<gVc1!(7mEdiAXb26u)$==Zc;-H zXSm%%No1%?r~tX-kbjVCeo6jAUxOTc%vGm+)k9MB3mKx{-PKjqRbLgq+}y1F=O6$2 z;rkuK__wk4Iq1JYk*BDb!OX-Mnt^Fj-%6~&(yblXx^)6ax22$@+w!0?aD%Gu*Mb_a zVzlwC!EEMS8qA^b+zwn;V&zMNMg#AaF*mt8*t~6UH}shG#%NaF;%=j9s_j>?%*T10 z$d{u3jS!hQ?9$TmE1~lOMP8!fMqn}n44Q$>ok3|(W_Q?b-@0uCWj(Gii<R`a!Ya&V z)k~viu^QVbdVMQ!d6m0!GpI3-ZC)C|2CK6zv>t1)ZM2(ghkb^&&bQbNcJmUf2Mu<M z-NxKDv%&gZRf$uXM@ce$@>|J$9?40#nDO(>Uv-bUKZ?31QJ+8X&)STSc*=O%jk&zK zktOUPO4-3U9Y!g3M4f~mUfnnn6F<#zA~Oc*{5Y2PuI|Y=?I--;lnWVW=>b2_xkz#U z<e)gruD-%<=65E(oXDIHm-qUeahxz5BZ6JQqn!JDy(G%_eBSR%)mZQvVgwO-S=WS? z>7$m)*C>(<hM5rEIz0L(J(?qV(i2ro>+0&XJreOLsJBle(e6Pw+}ZA)wDaUquXBFN z9?K`;SKZF!<k6SC>DjRR5MMuSAGJsE=wQLb!Q&yHGI=iBlIP=5o@L29-EKC7xU9X{ z-WpAm`z(ou9Tq+RoY+J$rc04p%O$n76jF9YJj&(&mr)DVG(~MGU?J)T4LwvpLD9Fp zL(0OeRu?Vj#=sm{GguF~)yxRtOsL^XP@{R+EGZ`wabMWjt9Ifv&f_SFr##F?Io?<* zvXBtshU*rh7N!s`Od-5Bg>YdCpJ00n_xLEXjLI-QvusZ9E;ae#^&c1P8IG<CHZumc zxXVluEd2r_NBolJJVUo7YV$I)=H{Q_wh-JtJet1zeKz)oW10JM#Jh2C;vXCc-pvH_ zGeP|f_J4NF)53UR`tKRFY*s`aoD{li^kTTey5=0BAhxkXl?%dxp5_yZ0XP~zN0CIb zP>c)ZG)&8!-dQT>{X0Icp8FsG@eS#rHpQLX8rTDeY~W2{10}7hvQ~w4sDOgvGn~=9 zu8FjLjCW5sJ+6qtQIsF6D%D{xPPnQS(<~P96C&LL&4(z`MFo*8&%tZ&E`|Ak`p2bt zfwP~I2J@vHfnW~V<l}2OO(S)&=FWi~OG~ec1}MERqb<g%+6lWrG0wuC$cCZzdX25H zi(Gl#u@F4Xdm<WgRcF}(q%`t=Lh@bQ^b|#s=Ngs=+3WaCH<q&F)|Is63FLm-XQ$}Q z0CFd;c+9K|lgxZ(lJ}BybA-1OOFU%G`U)$(F>*v9dSO=HH7=|fA``3p#o9G~FfVMZ zm1p+cyl`eV1x<=abL*lsE3w*%m7UL=L6vQsP&o9W{{n4m{^EO?1H?x<3^1NU8{`oA zF&91rxZm{8BIy^Z^GS8SRvqTyK!^bmA_(@bs4alA<@?|Dmd7Ym5X#<fK0uVAKt;MP zR)v2SCyC#o_`_FJ_HcE$AhqWY!A`~y>-;^o4B##5?LEN#%-@f5x&I!y6)C!Kot#|K zdxym+o%mW1h&$0-t_Z}#A!ji~Gpz;T?+@etalTJHuM-9{opJ8R&|jAB<^FMW%CU#1 zD@qG3LLKYp<X+4F4b&r2|458EiJ2cqq#guiC^_!=k-pl8HFi%{)MDw6)95sc6N=|6 z8n2^-&e5Zs#geyH`wyp&zlH}CRCM59JKQ04hEQS=_oP3JCVmgJTdMY*$kJa=@C51f z7q98nIq+0)IZkr<0FNo9fAG7fugP_E?B^*lw8nDl=q-WbTZ-|@4Z{>W!%*DBa9V%& zMU}Vq^0HY|?pY*K;IdQ>^^`k8M$yZ}P~9A9p2B!IO85{46;Ut~6rEMQ&+}}I%tbr2 zR365<OL>Q?_QHOWb)YC^V?nt+cq$!kmV+wYU%-GplznAG(4btrymIJxuvv`4VaCP@ zzs^jAj@fr{|2HU-I>v@;I%W+akZQ-Q<5x55mb(@ZKg6XKYEUjj$e~f=ujmj)4on8D zxBz0%h#~G%>>t?7{+mOnFmUFCh|bIkOBew;a~F6}nrno?&MGSt*3juejrxO)J|T!V z*c2n6N1auuKew>Q29+&PX=s{8?uDBgYu!WTt>>c3Ja5{{i9}x(Vde(7Rc32i+HWD> z3#x^Ip)1G=n%l~whZiwi28vhPc!#CKhus7=wMM4FQ#lqKA*qPIENDat{8Zw^Xrci< z*j!}4$SfH@N7C4hQsvMytBp02Qd{d6Wt{>3R3IINt&GOGs$D08!L1G=J2;F+%Y0j3 zq{@JIE^_e*VhD->O{d7++9a{v9kOC+m9Q3O@l&k+5v4E-%d;%=2F##r?^rdnVU-a% z$|lU>)-rm$7lUj;#&9U;FG|xEWEF>^LW3P~4~?pY3xf<p<%Qvo<0vWoOjW{=WnDPj zbt2;-g%_*zZwsO(JW5v+UdqpwuK~wnF+!vrrd>gqouDj6P~6wzD-W=g$K3*?1zEiy zVb}aZt3o@6jRm41eN=D_$P6npU9>e@JBH<!+zq$pZg`*ToNMI^gdn5>?F(O^(}xBB z;THJ;Gj?^Vcv2D0%>29cqeFRbVQ7}7B3|J@(^6LJp`gTajXC1$s`e~_H3Ixb&;Nw6 zq|3^N_!dpGt{T@E#pzF@)H$9;8u0{M#LuXr#7^yAZ(T;h#e=HKVxnM3zr|BJ;x6qA pnjCjlY8SsEqSscmQX>9{6v*?OJV}zHd9a+~=UJ`;n@Sqy{{UT?93KDx literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7081098ab82b62cbb6666157fbd9f2bc05c19882 GIT binary patch literal 2451 zcmZ`*Uys{F5Z|>O$N6_nOWSLqDya~tDKw#K5ig~xxC+#ld!VRDR*~iNZgNf>JKeR@ zyXYz&QVCx81W1TiJ_+B!uZRb}!aebuO?<ufN}`>e9q-P}&TnSyyPZz+pFjS3_M6Ap z-|W<{2L2(2eg-0#;0c>?pU*7c;<UCB+qW^>i8HJDH6wGtyS{7qT2h~RzPH)i@EhMU z;fnezChF3iG-Yk&_$^^QVSVpkSYUmtw3BRHdLmXqk;lnypO^KWY&Hv10k)ZjGpXlc zBsErBMGAHrgeuyP7cwFZ)z1d=5JP_rBAL$x^DV*QE%zPK9do}XYQlZReE1_g%yrQa zP0XHXi8khj=!h-MO>qwXoiDp_s`D^O0y!QBaXQMDgU4%0FHCy_NN<z02iIkkXX>yw z%2Y4kmpyVa9LwYOM#F7v`KsjNc>DF<JnL<q_VO&^aGHKJTNpbSx(OoK5eq=!5vSO+ zDyN_cOGnFO^e0mtY(4&II9Kr^%;j(qs^KV0gj9MMO^11MXS8>)5cl+#!57iq;q=bk z(elMC`W(M;I{bb(kLS3Hx$W(HGr1J{Ko7Odi+P@9$s266#%5UgQ3Yo(KP)fAX`IJl z5-(+t&GR@*^?P&?x)I~ckItMqyZ<B-gePUAiNsSdM{I(86txvH5j+?6iofK!HKBZD zM||R7AipNgiV0_%y|l1)5xsiuO&XIX&a{rKl?6$AOi}HasJgqaW17T!ss&S}SKVsa zIKjDZnP-Odx5`ThPf(;nj^b2`>bm8nF~ks=Ac$ZSt+F$pjsqoiRw$%$*?tu3T*Z6H z_$*ypqeS;xWOo77AXewe6L)>2v@%^f^Dy5pok<p_Yd76IRIpdpvm&1tx$fJljYGaG z;~<)e(%TEQB*i8_)?|ycb}J7nzb`|oFMu%a;@{*Bzkt~TUEVkY+uNs4K%?|^F$`$G zgIR;N;+*At0;sTdR$SdTtJ-?iW>~wEI;}7~Vf_k-)0<{bV{<}aZbH(c^$6h8yv<g& zNd`|Z^7f>&-fJWT_tprBfcYHBN7m(PcXx$4GvL>DO_Whcb)gOeRiw+tcXF03;&j|w zc6YM*A#opT)F>#LLJNB;RMi#SP+bKnYq3T_st<^FW1Yn5R8a<FKdF;JuB22Sn#b}0 z;Onw34`fv2vUH2o?7v7)yE4^<lEF!%D7^??nB&{n;G@RYUFmdZG_b!7vJF>n;D{#0 z447W$7x@-{AGo%G?-gr#vC>tg`v6DY0FwYUU=pebW7UV$HLUymopxJP0-KB+U|UuG z*UnfwweiF%^$G`rqNjTxKQqA1h4soqwX<JP`535eg5H2=??$G<Y!1<3({;W9bMT3% zJz_szM>Bx)D1WYd$Q^4NmzlcCB?ZsjAB<X~lrq(xIFvVQ6Gt4a*WEp?4fG-%9y>cv zpA3)r@EyrvsZU{1eFoC6l}(_ea{VIC_f4=$H=NI9Dirxz)`Z+E#(lfAwTenx=p3zl z8qePdsVUVu#4}XzT^!R?-OOq7%c#sYuw33c6VobN2KSRJ3KRWcuu*{KKp-m0B9o|S zXrxcwBSJ5b$~f6oH$m=TXo@GZ+O6f)|FyLX-T0DVszHQaTm4q)1p%dK5R}azm}R0! zh;IkM^CC<(PwGJ+vIydqkUCPad1sXELQ7S3CUuT<UMJEga*GH#cPib<d1bt=gCqO8 z3*vFda%|W3Y_H{YJX_Jze!FZ46d-+UXaj~RR8z|U?c|-O=-!InK>qe?>0tBeVZK$? l@ib-Ic)YGksf>|#`Br-O*HL&tMP;Dua?ff5$Ts)v{{U|hb(#PG literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/install_lib.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/install_lib.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11d44744f333b10658236fbf9deb0affaeb12ce2 GIT binary patch literal 4096 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 Hylej#_`o7u literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/install_scripts.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/install_scripts.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b25b58da88a6bd82f8a864cc1bd4732afd04fee GIT binary patch literal 2291 zcmZuyOOG2x5T2g5$9A&WJPAQDK>-<(H6cM9h)^V=L>yQlK#DX1wZ_wJ@666C-R<4A zHO>J?;>K^_z=b>if&b74E{FqnPF$d>?cF2`V|7nWb-B8_>ieqi_WRKvKmPj7_Z`dn z-FoS9L4E*3ehCw^7%8lh#Dt)17k2LCZtNM^kA3qF;sD-G5tf~}Q$}%AcH=Iw9$U<1 z-gAq2+{@jS6T8g*${PBAf?sP$v{Tg6-Jzp<4>PGmHlC@hu5|B<MD2afRl*XL=q+B! znc$RVf~Tq$^A!Jl{5T*yfFa+7iCZyYR%|m8JIrRza|<>!0YJDB3t0G^K)@Xcp{vhk zl~hSlP??IXQF8I|!+KEFqD+dxS~b{M+!{2+Ob(K2KH$?S&8kT~I21|KaIvwJDS_?r z!M6?LQyB6ROv=hhZnxG7(??p1I?RIo?cGO1SG%>yrosm^y`5E=%90{ma9TH*2dTZP zro4eXxsn%?pDob^%fFwE8j&3&ijNKwF`Co`<3f(o{gEo}OvXnC?4JCHewdEu`*-e6 z7Kdf}K0MQE^!2F8n%kQ*-M&}y1(Qc|B)OV3s;-My#I!EUq++8}N!n@VB7`7%FeJjn zB0aLWaoXy?XE{j_9>IfQ67&}c3`$m*BrPF5ITQ|41(KV4;+FFBAP?8+tNbbGX$RIK zaUatNQWx!)w(7NZ-dAUEhH-Xf!@LFK+{#@##?ApdS8cZl32WsnJ)`wN>x0&3J_|q_ zv?M>j4BJ5b#6qwk`33m$)W!VLzAb)fy(s~0m|tF5pbzsaDCMuU=%;gZ12k7#r|smg zudJ2*(E9ewGJ<`swb2iNji<jo0S-a=JG%mrqQhfA>Hc_@73>&{I^st>ovCD8a9CnM z4|)h$1<1x-nn@~V6?{z}Euv<w_UdW}?1yjY>o2Ogvnk;YPvjgxYrw99jaK(wQFp-~ zJz2u-PS_Z1_#pxac#TyDtaVt=)Fdmo6wp2_eR0Yaon)0kFgx}oke{(R<v5XCAY?=z z?TxNVN*;GH2M2&*<bD8d5~W1k`^wPriO3We@%blN#p*-(vQj&8F2z}N=8iceW_xo0 zDjS~Cv`D1X(L~fGZ4!}`afl%%Vk+ZKBIzDafH=B$h&ycZKJ1DJ{n<Q=eV);@WZK1S z#Qs>~S8VFC@#l{Z*E*=jra0O+?u2&CUvV=-+VzC25tm`wf+0VE3Fu=-BqV2SpZK;5 zvQ4&(u16xEmQP&x`6P0DJA{=>WO4p9*{~QyrG|~*5f6a!V;J%~n1En5Ht?la+Do5U z3febwS|ppda^QPIu^hm@vVj0r-pQjjFf{ZH%z<X|8BomVRKE?F+d7v4;L8p`9Y|+v zJ3u=CdF#PCP~-}%L(lU8?!n@YDJ1mJ!3$sy5IzG{57Zt%Zlr^gHg5<rw6&M+l{M4- zbS4C^6rGic++SS%Yz=7Oz~H7lZrI@Krqtvx`v=&yJKPfI;QZokoZi6+JF|ANf$Q#Z z8ev0i*HXI;+&bFL>#P!2(9XvWUojmpF-N`$Y+KN>L8(1cW{9n*B_Bp>)O6QOp@?c7 zrgfztUT_TI^Ek++aJg{yA{y;0zz0`g04LI9avCYuVZXaD%spb+TlSX01|S6y1NaEZ z;@a^sHZ0wF8P2;yB5s0%VW2~5!lG11ltMtWf`i<n^yw@qFktu!C}nj@sp;?rrvgKG zDJ*Q>!k`%MEabh!+aM&a9lGILraKIKx`UK~yS$Jl<MEp(-zQD!RM=u0J)_fgn|TkV uYcT14vp=PR%X%hK=r!0+)?Eav@qeM|@c#OIpJ0cTNQWLUDI}qN!TA?_Wqz&z literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/py36compat.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/py36compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..261373e649a70ead0f70736af3a8e10f400b6683 GIT binary patch literal 4636 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/register.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/register.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3cf1702d33d1c58f386b70a24822cc9d016ad157 GIT binary patch literal 787 zcmZ8f&2AGh5VrRxS<+PE#G&G_M<TUxs}><u2!S|MTyiK#trjF}yLOh{dhM;fn>0~x z>4R|PNq7fe5eHs@6XQ)%6)ern=dnHCHzObK?hbx^`|;(OhtN;-Xa#`Zf|)Tmh8Py8 z!U@I>d%`RIGDyNR#C#UqBNp(m3|4*;Fz+K8g}>nq8e!`Tl}|Fa*)E`2mwgU^qXaXQ zcpQqAVG=UTynB@Nm=8q)8)=>wrr|ono98YL!QO+JLvYKzJ5++W6$oo^39{~x!xtbE zPC!l*mc5mS(IsS{sz0$2&vRPHsak%%cy~VeFgZJo&o@kk%;UnujMtiHX~Wrm+!`J? z^Fo4Gaa#+Ovbc~S3*w8fO;ejwLh40bjFrwwO}e{eH0s+O-AbCNs!AoZfzm~;eb8)u z$lEBDQnfPU+Kt2pP6|vcFkDQ(BfSI3KXX#+Vg@qEEY)PH1moI}?3y&<XnJ)!V<+Yn zeVJV?u8)qV%XyU@!pbH2MCzhGa3WJ74o)h*Waico!<)8lloJ2IjX<&;_PAc?KCnk% z#tj=`&l}*UUI1}9e7FWpOrXh#QkhnqQahluQmhpY4=KHAQ?WkLJt(qny-z7q8KoUV z*W@GT$hvDG0OLMjgd?xZjC%G7gTK%=g)rU3lD&uhc+<jotIhT|neOeH-VO9WE*rgG O3x4DNRYy3)L;o+QGRiLi literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/rotate.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/rotate.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9fead58db319ef8e6dc2fa8b23c3c47aae649d7 GIT binary patch literal 2592 zcmZ`*&2Jk;6rb4-d%boN$4#3C3fe<UV%pd(Eg+##Rca6?0;q_B)oQUlV`rWH%FH-T zEc=3s#DNR{0aq@ZIdSD5;51jnfq%g#-W$hBQ`%k4o40Si-u&Kg-t66_CI6pa{(Pc5 zLjEQ%JPzm&pvdn)Fv4g|6565^bt|?KyJZ{Qj-AA9xkh*5LaPAnPF!pip>|_0DYZ(b ztq}W3xmBj*Q^JbOdrp|g%Tv2mVa_8`FZ~OvkUG_sZk8T#p~Aea_Tk%(vp!U7yOC5w z6~*%NTt!*>i4d9C!*&@RLsfj3B}qGFU7Tj|xS%|MB0mDbNsBVlvKVdI%xXF85?f=J z`*zFi6L7l1mYx%EdYP?2?XfCbg}TIQ;M^5m5SeN#K6+!9$6WCsiy0RI1D{0H0k^VL zj^1OhZMzj5aGpnLKiCUW{)|f%^rD!{Ss`hw?*7M`CbMg>VZ}u%1C<5F9Bc`GIE(~m z^;rqm+Gde}zHD{_6y8;tI0>HZbHM|(&o6otv<08JxGD@dm~ExQqyrvjz4_GW$_4Ln zQS9BN02Mx1TTmWCkyk)4GA7|%0*;_ti~u%tuWoDC_^UmfG6dhWgL6Sx9LeL}uS8si z31-7)E}|oVv3b-M&7Q$fHoFH+72oM~j*r+q`C<5ew{voE=WcKGEa~2cr=K>zYUWYC z9i>vW<9PdC!beOV%ckUNn5!&{FR0x)51R9UHS!Z(i_%C%?Km3oFf-(lS8-DX5QG-s z9c`TU{(sL4cvN73!Q)3z#$*6!9C)IpD5F#QJp~J30+#DwvCwi-RW@3u&=y*cNqWs8 z$~o}G7Zd=d1p3+7?^}{u-w@^EoT@M=PAzfF9OgbZs|-9=n9^NhW<g5{4p3=o;jw}U z_<N%-KN|w2WX`)$?<B}lAgBnE42ZF1@Yt3-Zwo-4)laE)Mz$^9=r@AR#wf}+anxpm z_xqdm(e(>cp3}$hcEOg>#`ZQwI!JK+4iDOC5T%Ouxi|w3NrbuN5flS_AGYwcI-!b; z>3~jQTR&TekOK@!>XyI(+QpNV*DY-|ZflyGwz)tq&itJis0Mq>@886EaZG`XZl1=m z7o`{C-Pnn<ZabFuL0OEO(OcT>m_ty5(XcR9M$~<=iaNS2E`iWC>`MDzx8or<nMeDP zG=xmMTwt2f6?8c5hw3Ef65P+@Na@SK(QueD4i0g)U|*ezHJlj_#rd9e^<}T$f_8%# zp+2=}!S<;Kb(JpTYhATQ>#y1G8TiO?bkDH%FHn$S$X4Kv#q5|SbOQSE@5s_!^7OZf z1)4o@rjW$f$=F&aV4=z#04t%z8(ULg^TcK@D*!ufWaY#j+k?^+_zbm=wJHxPtf-d8 zz-|~}V+)L4X5<HJgG}t>T^#vz=ZQ6OCa&r2ja_6k^jeWWnf0n*q2dp<I;f#W$syV= zE%e9a@a@O*6HwaI9<Vly(q1Moabf1^$5}_ych8`>z{6|M$?$Luc{rd0*d(}0d)A9w zw6&E<?chzMy*^ioiV_Y)*?`fS_Ff90coWPYKv}Ty?bGOpVfrcpj;`Eb<{H?Nr>7FL z@(npEn@eW?QD4(#7$2UdHSrG2Z^)@DFXnIKUYNEMF1D~o9fWoUS(F+=LmtkA(nZ1H zYL#5rrWxUa`<172ju)9Y31KbmMiO&)LGI&)3wK|l1n0UiOyej$s2Aq!MNf3`G>>T4 z<ONNY!1MSLGTMe|n_!m#2xN1`s?Zu;10H+SvucLX70ARDXc_tExWVNj;KziB5(*y# z7|N()E*493!!qhCD5_}iwHF#J!chBRm}G1ibI>bccsOjwh!T7i!;ocNP|A$UE+iYg z#dT!}@GK6hUg^N~!rSS>Al7k_>nL_moS$H$VQLaZ5a^u5bmCFRaxBZ7UdQrWuV&io zOL`f@XMSiJDCb$v-15da4^j2J6UQGOIZsI@#K^SP>iH$u;K%s;FwaK*xm{omFsr`G XUG446@wt!ZMk10B19&km5GDIR0NJle literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/saveopts.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/saveopts.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1cafd543e20f157187e72b9fbdecb0ba4e5bc47 GIT binary patch literal 937 zcmY*X&2G~`5Z)i>hc;DF0STlYEYV92ja#+QONEd?aI27tRLLq@Io@^H)PLDsr)lJz z(kI{vxbh^t!(I^wUV#&{sS9DH8Bb;=-^_e7M_XGPKfivz{6Y}=f!3Y}_G=Km2Z|$( zQ<UKlXCx#Ty+@pIdW$#}WJyEHy>rxW{en!?Cw5bCX;@t3i5%I@qBOF|*)Y-~b_w?n z3f>ji1w)_^a}*Me0gQwm2gq9#ws;GG+qSEtsQ@57e|`>@9~W5`<$OPtx$y4_Xx|im z<R>x}^Anfu>#8hMDfoJV7N#l(aWe7?<rn6&P=Mw7T>UY|O>-Uiwn5&2=n_<o#%O^h zT9Da?8jtZ?^y%G#)|BHbqWsCu>?L?fO_z8~mk6SJmt^6Av=;5U#R+5`)a{y#y_!n2 zB(-;nCI=U2vU7n<3(z43y0fGh$cCBenQ|ML_nJ|CH)_9Ydt7Rx<gjw2+U+LF8V>CC zNSNja<1#k3C5_0m-GITlNTMn=$`Nn7j;K7!gza#3!&H^`JJ!=8O|0ii0Oi6MnUA!k zamFo$3YKaWTRM%>Z%91?l;77uspK>=BA7-hNQ#sTrGxk?FzI13oK5+$K4CB7;my_I zQ8K^I;sbc2Jop%tvfP)sHc^`HA7^6D^-Kq=?U<rS|1+BzgZmp8lsA?_!w;YXy#os2 zHugx5bTJ{jxQm~XdGBvBB%ZkoV$4m;nB8D3D|nSUyT{n1iqa<1VT>0sxHq}bv68F9 zRZpP6YT7mR*!kRkoM?9`UFg6gE8kh)3!nWPWzh6L02h$BqF>Q_fHhFZsB*}*dwSR5 MD|e6D?du`^0|g%jX#fBK literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/sdist.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/sdist.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e5d19ed8cd3d9900bc0e7884bbef59e16fd5f8a GIT binary patch literal 6890 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/setopt.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/setopt.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1910cd3ef28f7726ef3963edc41d01be8994a313 GIT binary patch literal 4615 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/test.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/test.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d00fd682b4dc0e8b6c2e4292438752adc0f1933 GIT binary patch literal 8252 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 F^8f51Jm~-c literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/upload.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/upload.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5f5470225301f9bf3dd2d2674e0a9c6fd793215 GIT binary patch literal 5150 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 Yln+TTC4o))Pxhe--Nz5*3YE@(0l>hp(*OVf literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/upload_docs.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/command/__pycache__/upload_docs.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8e7293073e52bf4533eddbfe9cd42bf1a878bd5 GIT binary patch literal 6113 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 KtwnUxwf`4*kbLq0 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/alias.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/alias.py new file mode 100644 index 0000000..4532b1c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/alias.py @@ -0,0 +1,80 @@ +from distutils.errors import DistutilsOptionError + +from setuptools.extern.six.moves import map + +from setuptools.command.setopt import edit_config, option_base, config_file + + +def shquote(arg): + """Quote an argument for later parsing by shlex.split()""" + for c in '"', "'", "\\", "#": + if c in arg: + return repr(arg) + if arg.split() != [arg]: + return repr(arg) + return arg + + +class alias(option_base): + """Define a shortcut that invokes one or more commands""" + + description = "define a shortcut to invoke one or more commands" + command_consumes_arguments = True + + user_options = [ + ('remove', 'r', 'remove (unset) the alias'), + ] + option_base.user_options + + boolean_options = option_base.boolean_options + ['remove'] + + def initialize_options(self): + option_base.initialize_options(self) + self.args = None + self.remove = None + + def finalize_options(self): + option_base.finalize_options(self) + if self.remove and len(self.args) != 1: + raise DistutilsOptionError( + "Must specify exactly one argument (the alias name) when " + "using --remove" + ) + + def run(self): + aliases = self.distribution.get_option_dict('aliases') + + if not self.args: + print("Command Aliases") + print("---------------") + for alias in aliases: + print("setup.py alias", format_alias(alias, aliases)) + return + + elif len(self.args) == 1: + alias, = self.args + if self.remove: + command = None + elif alias in aliases: + print("setup.py alias", format_alias(alias, aliases)) + return + else: + print("No alias definition found for %r" % alias) + return + else: + alias = self.args[0] + command = ' '.join(map(shquote, self.args[1:])) + + edit_config(self.filename, {'aliases': {alias: command}}, self.dry_run) + + +def format_alias(name, aliases): + source, command = aliases[name] + if source == config_file('global'): + source = '--global-config ' + elif source == config_file('user'): + source = '--user-config ' + elif source == config_file('local'): + source = '' + else: + source = '--filename=%r' % source + return source + name + ' ' + command diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/bdist_egg.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/bdist_egg.py new file mode 100644 index 0000000..9f8df91 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/bdist_egg.py @@ -0,0 +1,502 @@ +"""setuptools.command.bdist_egg + +Build .egg distributions""" + +from distutils.errors import DistutilsSetupError +from distutils.dir_util import remove_tree, mkpath +from distutils import log +from types import CodeType +import sys +import os +import re +import textwrap +import marshal + +from setuptools.extern import six + +from pkg_resources import get_build_platform, Distribution, ensure_directory +from pkg_resources import EntryPoint +from setuptools.extension import Library +from setuptools import Command + +try: + # Python 2.7 or >=3.2 + from sysconfig import get_path, get_python_version + + def _get_purelib(): + return get_path("purelib") +except ImportError: + from distutils.sysconfig import get_python_lib, get_python_version + + def _get_purelib(): + return get_python_lib(False) + + +def strip_module(filename): + if '.' in filename: + filename = os.path.splitext(filename)[0] + if filename.endswith('module'): + filename = filename[:-6] + return filename + + +def sorted_walk(dir): + """Do os.walk in a reproducible way, + independent of indeterministic filesystem readdir order + """ + for base, dirs, files in os.walk(dir): + dirs.sort() + files.sort() + yield base, dirs, files + + +def write_stub(resource, pyfile): + _stub_template = textwrap.dedent(""" + def __bootstrap__(): + global __bootstrap__, __loader__, __file__ + import sys, pkg_resources, imp + __file__ = pkg_resources.resource_filename(__name__, %r) + __loader__ = None; del __bootstrap__, __loader__ + imp.load_dynamic(__name__,__file__) + __bootstrap__() + """).lstrip() + with open(pyfile, 'w') as f: + f.write(_stub_template % resource) + + +class bdist_egg(Command): + description = "create an \"egg\" distribution" + + user_options = [ + ('bdist-dir=', 'b', + "temporary directory for creating the distribution"), + ('plat-name=', 'p', "platform name to embed in generated filenames " + "(default: %s)" % get_build_platform()), + ('exclude-source-files', None, + "remove all .py files from the generated egg"), + ('keep-temp', 'k', + "keep the pseudo-installation tree around after " + + "creating the distribution archive"), + ('dist-dir=', 'd', + "directory to put final built distributions in"), + ('skip-build', None, + "skip rebuilding everything (for testing/debugging)"), + ] + + boolean_options = [ + 'keep-temp', 'skip-build', 'exclude-source-files' + ] + + def initialize_options(self): + self.bdist_dir = None + self.plat_name = None + self.keep_temp = 0 + self.dist_dir = None + self.skip_build = 0 + self.egg_output = None + self.exclude_source_files = None + + def finalize_options(self): + ei_cmd = self.ei_cmd = self.get_finalized_command("egg_info") + self.egg_info = ei_cmd.egg_info + + if self.bdist_dir is None: + bdist_base = self.get_finalized_command('bdist').bdist_base + self.bdist_dir = os.path.join(bdist_base, 'egg') + + if self.plat_name is None: + self.plat_name = get_build_platform() + + self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) + + if self.egg_output is None: + + # Compute filename of the output egg + basename = Distribution( + None, None, ei_cmd.egg_name, ei_cmd.egg_version, + get_python_version(), + self.distribution.has_ext_modules() and self.plat_name + ).egg_name() + + self.egg_output = os.path.join(self.dist_dir, basename + '.egg') + + def do_install_data(self): + # Hack for packages that install data to install's --install-lib + self.get_finalized_command('install').install_lib = self.bdist_dir + + site_packages = os.path.normcase(os.path.realpath(_get_purelib())) + old, self.distribution.data_files = self.distribution.data_files, [] + + for item in old: + if isinstance(item, tuple) and len(item) == 2: + if os.path.isabs(item[0]): + realpath = os.path.realpath(item[0]) + normalized = os.path.normcase(realpath) + if normalized == site_packages or normalized.startswith( + site_packages + os.sep + ): + item = realpath[len(site_packages) + 1:], item[1] + # XXX else: raise ??? + self.distribution.data_files.append(item) + + try: + log.info("installing package data to %s", self.bdist_dir) + self.call_command('install_data', force=0, root=None) + finally: + self.distribution.data_files = old + + def get_outputs(self): + return [self.egg_output] + + def call_command(self, cmdname, **kw): + """Invoke reinitialized command `cmdname` with keyword args""" + for dirname in INSTALL_DIRECTORY_ATTRS: + kw.setdefault(dirname, self.bdist_dir) + kw.setdefault('skip_build', self.skip_build) + kw.setdefault('dry_run', self.dry_run) + cmd = self.reinitialize_command(cmdname, **kw) + self.run_command(cmdname) + return cmd + + def run(self): + # Generate metadata first + self.run_command("egg_info") + # We run install_lib before install_data, because some data hacks + # pull their data path from the install_lib command. + log.info("installing library code to %s", self.bdist_dir) + instcmd = self.get_finalized_command('install') + old_root = instcmd.root + instcmd.root = None + if self.distribution.has_c_libraries() and not self.skip_build: + self.run_command('build_clib') + cmd = self.call_command('install_lib', warn_dir=0) + instcmd.root = old_root + + all_outputs, ext_outputs = self.get_ext_outputs() + self.stubs = [] + to_compile = [] + for (p, ext_name) in enumerate(ext_outputs): + filename, ext = os.path.splitext(ext_name) + pyfile = os.path.join(self.bdist_dir, strip_module(filename) + + '.py') + self.stubs.append(pyfile) + log.info("creating stub loader for %s", ext_name) + if not self.dry_run: + write_stub(os.path.basename(ext_name), pyfile) + to_compile.append(pyfile) + ext_outputs[p] = ext_name.replace(os.sep, '/') + + if to_compile: + cmd.byte_compile(to_compile) + if self.distribution.data_files: + self.do_install_data() + + # Make the EGG-INFO directory + archive_root = self.bdist_dir + egg_info = os.path.join(archive_root, 'EGG-INFO') + self.mkpath(egg_info) + if self.distribution.scripts: + script_dir = os.path.join(egg_info, 'scripts') + log.info("installing scripts to %s", script_dir) + self.call_command('install_scripts', install_dir=script_dir, + no_ep=1) + + self.copy_metadata_to(egg_info) + native_libs = os.path.join(egg_info, "native_libs.txt") + if all_outputs: + log.info("writing %s", native_libs) + if not self.dry_run: + ensure_directory(native_libs) + libs_file = open(native_libs, 'wt') + libs_file.write('\n'.join(all_outputs)) + libs_file.write('\n') + libs_file.close() + elif os.path.isfile(native_libs): + log.info("removing %s", native_libs) + if not self.dry_run: + os.unlink(native_libs) + + write_safety_flag( + os.path.join(archive_root, 'EGG-INFO'), self.zip_safe() + ) + + if os.path.exists(os.path.join(self.egg_info, 'depends.txt')): + log.warn( + "WARNING: 'depends.txt' will not be used by setuptools 0.6!\n" + "Use the install_requires/extras_require setup() args instead." + ) + + if self.exclude_source_files: + self.zap_pyfiles() + + # Make the archive + make_zipfile(self.egg_output, archive_root, verbose=self.verbose, + dry_run=self.dry_run, mode=self.gen_header()) + if not self.keep_temp: + remove_tree(self.bdist_dir, dry_run=self.dry_run) + + # Add to 'Distribution.dist_files' so that the "upload" command works + getattr(self.distribution, 'dist_files', []).append( + ('bdist_egg', get_python_version(), self.egg_output)) + + def zap_pyfiles(self): + log.info("Removing .py files from temporary directory") + for base, dirs, files in walk_egg(self.bdist_dir): + for name in files: + path = os.path.join(base, name) + + if name.endswith('.py'): + log.debug("Deleting %s", path) + os.unlink(path) + + if base.endswith('__pycache__'): + path_old = path + + pattern = r'(?P<name>.+)\.(?P<magic>[^.]+)\.pyc' + m = re.match(pattern, name) + path_new = os.path.join( + base, os.pardir, m.group('name') + '.pyc') + log.info( + "Renaming file from [%s] to [%s]" + % (path_old, path_new)) + try: + os.remove(path_new) + except OSError: + pass + os.rename(path_old, path_new) + + def zip_safe(self): + safe = getattr(self.distribution, 'zip_safe', None) + if safe is not None: + return safe + log.warn("zip_safe flag not set; analyzing archive contents...") + return analyze_egg(self.bdist_dir, self.stubs) + + def gen_header(self): + epm = EntryPoint.parse_map(self.distribution.entry_points or '') + ep = epm.get('setuptools.installation', {}).get('eggsecutable') + if ep is None: + return 'w' # not an eggsecutable, do it the usual way. + + if not ep.attrs or ep.extras: + raise DistutilsSetupError( + "eggsecutable entry point (%r) cannot have 'extras' " + "or refer to a module" % (ep,) + ) + + pyver = sys.version[:3] + pkg = ep.module_name + full = '.'.join(ep.attrs) + base = ep.attrs[0] + basename = os.path.basename(self.egg_output) + + header = ( + "#!/bin/sh\n" + 'if [ `basename $0` = "%(basename)s" ]\n' + 'then exec python%(pyver)s -c "' + "import sys, os; sys.path.insert(0, os.path.abspath('$0')); " + "from %(pkg)s import %(base)s; sys.exit(%(full)s())" + '" "$@"\n' + 'else\n' + ' echo $0 is not the correct name for this egg file.\n' + ' echo Please rename it back to %(basename)s and try again.\n' + ' exec false\n' + 'fi\n' + ) % locals() + + if not self.dry_run: + mkpath(os.path.dirname(self.egg_output), dry_run=self.dry_run) + f = open(self.egg_output, 'w') + f.write(header) + f.close() + return 'a' + + def copy_metadata_to(self, target_dir): + "Copy metadata (egg info) to the target_dir" + # normalize the path (so that a forward-slash in egg_info will + # match using startswith below) + norm_egg_info = os.path.normpath(self.egg_info) + prefix = os.path.join(norm_egg_info, '') + for path in self.ei_cmd.filelist.files: + if path.startswith(prefix): + target = os.path.join(target_dir, path[len(prefix):]) + ensure_directory(target) + self.copy_file(path, target) + + def get_ext_outputs(self): + """Get a list of relative paths to C extensions in the output distro""" + + all_outputs = [] + ext_outputs = [] + + paths = {self.bdist_dir: ''} + for base, dirs, files in sorted_walk(self.bdist_dir): + for filename in files: + if os.path.splitext(filename)[1].lower() in NATIVE_EXTENSIONS: + all_outputs.append(paths[base] + filename) + for filename in dirs: + paths[os.path.join(base, filename)] = (paths[base] + + filename + '/') + + if self.distribution.has_ext_modules(): + build_cmd = self.get_finalized_command('build_ext') + for ext in build_cmd.extensions: + if isinstance(ext, Library): + continue + fullname = build_cmd.get_ext_fullname(ext.name) + filename = build_cmd.get_ext_filename(fullname) + if not os.path.basename(filename).startswith('dl-'): + if os.path.exists(os.path.join(self.bdist_dir, filename)): + ext_outputs.append(filename) + + return all_outputs, ext_outputs + + +NATIVE_EXTENSIONS = dict.fromkeys('.dll .so .dylib .pyd'.split()) + + +def walk_egg(egg_dir): + """Walk an unpacked egg's contents, skipping the metadata directory""" + walker = sorted_walk(egg_dir) + base, dirs, files = next(walker) + if 'EGG-INFO' in dirs: + dirs.remove('EGG-INFO') + yield base, dirs, files + for bdf in walker: + yield bdf + + +def analyze_egg(egg_dir, stubs): + # check for existing flag in EGG-INFO + for flag, fn in safety_flags.items(): + if os.path.exists(os.path.join(egg_dir, 'EGG-INFO', fn)): + return flag + if not can_scan(): + return False + safe = True + for base, dirs, files in walk_egg(egg_dir): + for name in files: + if name.endswith('.py') or name.endswith('.pyw'): + continue + elif name.endswith('.pyc') or name.endswith('.pyo'): + # always scan, even if we already know we're not safe + safe = scan_module(egg_dir, base, name, stubs) and safe + return safe + + +def write_safety_flag(egg_dir, safe): + # Write or remove zip safety flag file(s) + for flag, fn in safety_flags.items(): + fn = os.path.join(egg_dir, fn) + if os.path.exists(fn): + if safe is None or bool(safe) != flag: + os.unlink(fn) + elif safe is not None and bool(safe) == flag: + f = open(fn, 'wt') + f.write('\n') + f.close() + + +safety_flags = { + True: 'zip-safe', + False: 'not-zip-safe', +} + + +def scan_module(egg_dir, base, name, stubs): + """Check whether module possibly uses unsafe-for-zipfile stuff""" + + filename = os.path.join(base, name) + if filename[:-1] in stubs: + return True # Extension module + pkg = base[len(egg_dir) + 1:].replace(os.sep, '.') + module = pkg + (pkg and '.' or '') + os.path.splitext(name)[0] + if six.PY2: + skip = 8 # skip magic & date + elif sys.version_info < (3, 7): + skip = 12 # skip magic & date & file size + else: + skip = 16 # skip magic & reserved? & date & file size + f = open(filename, 'rb') + f.read(skip) + code = marshal.load(f) + f.close() + safe = True + symbols = dict.fromkeys(iter_symbols(code)) + for bad in ['__file__', '__path__']: + if bad in symbols: + log.warn("%s: module references %s", module, bad) + safe = False + if 'inspect' in symbols: + for bad in [ + 'getsource', 'getabsfile', 'getsourcefile', 'getfile' + 'getsourcelines', 'findsource', 'getcomments', 'getframeinfo', + 'getinnerframes', 'getouterframes', 'stack', 'trace' + ]: + if bad in symbols: + log.warn("%s: module MAY be using inspect.%s", module, bad) + safe = False + return safe + + +def iter_symbols(code): + """Yield names and strings used by `code` and its nested code objects""" + for name in code.co_names: + yield name + for const in code.co_consts: + if isinstance(const, six.string_types): + yield const + elif isinstance(const, CodeType): + for name in iter_symbols(const): + yield name + + +def can_scan(): + if not sys.platform.startswith('java') and sys.platform != 'cli': + # CPython, PyPy, etc. + return True + log.warn("Unable to analyze compiled code on this platform.") + log.warn("Please ask the author to include a 'zip_safe'" + " setting (either True or False) in the package's setup.py") + + +# Attribute names of options for commands that might need to be convinced to +# install to the egg build directory + +INSTALL_DIRECTORY_ATTRS = [ + 'install_lib', 'install_dir', 'install_data', 'install_base' +] + + +def make_zipfile(zip_filename, base_dir, verbose=0, dry_run=0, compress=True, + mode='w'): + """Create a zip file from all the files under 'base_dir'. The output + zip file will be named 'base_dir' + ".zip". Uses either the "zipfile" + Python module (if available) or the InfoZIP "zip" utility (if installed + and found on the default search path). If neither tool is available, + raises DistutilsExecError. Returns the name of the output zip file. + """ + import zipfile + + mkpath(os.path.dirname(zip_filename), dry_run=dry_run) + log.info("creating '%s' and adding '%s' to it", zip_filename, base_dir) + + def visit(z, dirname, names): + for name in names: + path = os.path.normpath(os.path.join(dirname, name)) + if os.path.isfile(path): + p = path[len(base_dir) + 1:] + if not dry_run: + z.write(path, p) + log.debug("adding '%s'", p) + + compression = zipfile.ZIP_DEFLATED if compress else zipfile.ZIP_STORED + if not dry_run: + z = zipfile.ZipFile(zip_filename, mode, compression=compression) + for dirname, dirs, files in sorted_walk(base_dir): + visit(z, dirname, files) + z.close() + else: + for dirname, dirs, files in sorted_walk(base_dir): + visit(None, dirname, files) + return zip_filename diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/bdist_rpm.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/bdist_rpm.py new file mode 100644 index 0000000..7073092 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/bdist_rpm.py @@ -0,0 +1,43 @@ +import distutils.command.bdist_rpm as orig + + +class bdist_rpm(orig.bdist_rpm): + """ + Override the default bdist_rpm behavior to do the following: + + 1. Run egg_info to ensure the name and version are properly calculated. + 2. Always run 'install' using --single-version-externally-managed to + disable eggs in RPM distributions. + 3. Replace dash with underscore in the version numbers for better RPM + compatibility. + """ + + def run(self): + # ensure distro name is up-to-date + self.run_command('egg_info') + + orig.bdist_rpm.run(self) + + def _make_spec_file(self): + version = self.distribution.get_version() + rpmversion = version.replace('-', '_') + spec = orig.bdist_rpm._make_spec_file(self) + line23 = '%define version ' + version + line24 = '%define version ' + rpmversion + spec = [ + line.replace( + "Source0: %{name}-%{version}.tar", + "Source0: %{name}-%{unmangled_version}.tar" + ).replace( + "setup.py install ", + "setup.py install --single-version-externally-managed " + ).replace( + "%setup", + "%setup -n %{name}-%{unmangled_version}" + ).replace(line23, line24) + for line in spec + ] + insert_loc = spec.index(line24) + 1 + unmangled_version = "%define unmangled_version " + version + spec.insert(insert_loc, unmangled_version) + return spec diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/bdist_wininst.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/bdist_wininst.py new file mode 100644 index 0000000..073de97 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/bdist_wininst.py @@ -0,0 +1,21 @@ +import distutils.command.bdist_wininst as orig + + +class bdist_wininst(orig.bdist_wininst): + def reinitialize_command(self, command, reinit_subcommands=0): + """ + Supplement reinitialize_command to work around + http://bugs.python.org/issue20819 + """ + cmd = self.distribution.reinitialize_command( + command, reinit_subcommands) + if command in ('install', 'install_lib'): + cmd.install_lib = None + return cmd + + def run(self): + self._is_running = True + try: + orig.bdist_wininst.run(self) + finally: + self._is_running = False diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/build_clib.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/build_clib.py new file mode 100644 index 0000000..09caff6 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/build_clib.py @@ -0,0 +1,98 @@ +import distutils.command.build_clib as orig +from distutils.errors import DistutilsSetupError +from distutils import log +from setuptools.dep_util import newer_pairwise_group + + +class build_clib(orig.build_clib): + """ + Override the default build_clib behaviour to do the following: + + 1. Implement a rudimentary timestamp-based dependency system + so 'compile()' doesn't run every time. + 2. Add more keys to the 'build_info' dictionary: + * obj_deps - specify dependencies for each object compiled. + this should be a dictionary mapping a key + with the source filename to a list of + dependencies. Use an empty string for global + dependencies. + * cflags - specify a list of additional flags to pass to + the compiler. + """ + + def build_libraries(self, libraries): + for (lib_name, build_info) in libraries: + sources = build_info.get('sources') + if sources is None or not isinstance(sources, (list, tuple)): + raise DistutilsSetupError( + "in 'libraries' option (library '%s'), " + "'sources' must be present and must be " + "a list of source filenames" % lib_name) + sources = list(sources) + + log.info("building '%s' library", lib_name) + + # Make sure everything is the correct type. + # obj_deps should be a dictionary of keys as sources + # and a list/tuple of files that are its dependencies. + obj_deps = build_info.get('obj_deps', dict()) + if not isinstance(obj_deps, dict): + raise DistutilsSetupError( + "in 'libraries' option (library '%s'), " + "'obj_deps' must be a dictionary of " + "type 'source: list'" % lib_name) + dependencies = [] + + # Get the global dependencies that are specified by the '' key. + # These will go into every source's dependency list. + global_deps = obj_deps.get('', list()) + if not isinstance(global_deps, (list, tuple)): + raise DistutilsSetupError( + "in 'libraries' option (library '%s'), " + "'obj_deps' must be a dictionary of " + "type 'source: list'" % lib_name) + + # Build the list to be used by newer_pairwise_group + # each source will be auto-added to its dependencies. + for source in sources: + src_deps = [source] + src_deps.extend(global_deps) + extra_deps = obj_deps.get(source, list()) + if not isinstance(extra_deps, (list, tuple)): + raise DistutilsSetupError( + "in 'libraries' option (library '%s'), " + "'obj_deps' must be a dictionary of " + "type 'source: list'" % lib_name) + src_deps.extend(extra_deps) + dependencies.append(src_deps) + + expected_objects = self.compiler.object_filenames( + sources, + output_dir=self.build_temp + ) + + if newer_pairwise_group(dependencies, expected_objects) != ([], []): + # First, compile the source code to object files in the library + # directory. (This should probably change to putting object + # files in a temporary build directory.) + macros = build_info.get('macros') + include_dirs = build_info.get('include_dirs') + cflags = build_info.get('cflags') + objects = self.compiler.compile( + sources, + output_dir=self.build_temp, + macros=macros, + include_dirs=include_dirs, + extra_postargs=cflags, + debug=self.debug + ) + + # Now "link" the object files together into a static library. + # (On Unix at least, this isn't really linking -- it just + # builds an archive. Whatever.) + self.compiler.create_static_lib( + expected_objects, + lib_name, + output_dir=self.build_clib, + debug=self.debug + ) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/build_ext.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/build_ext.py new file mode 100644 index 0000000..60a8a32 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/build_ext.py @@ -0,0 +1,321 @@ +import os +import sys +import itertools +import imp +from distutils.command.build_ext import build_ext as _du_build_ext +from distutils.file_util import copy_file +from distutils.ccompiler import new_compiler +from distutils.sysconfig import customize_compiler, get_config_var +from distutils.errors import DistutilsError +from distutils import log + +from setuptools.extension import Library +from setuptools.extern import six + +try: + # Attempt to use Cython for building extensions, if available + from Cython.Distutils.build_ext import build_ext as _build_ext + # Additionally, assert that the compiler module will load + # also. Ref #1229. + __import__('Cython.Compiler.Main') +except ImportError: + _build_ext = _du_build_ext + +# make sure _config_vars is initialized +get_config_var("LDSHARED") +from distutils.sysconfig import _config_vars as _CONFIG_VARS + + +def _customize_compiler_for_shlib(compiler): + if sys.platform == "darwin": + # building .dylib requires additional compiler flags on OSX; here we + # temporarily substitute the pyconfig.h variables so that distutils' + # 'customize_compiler' uses them before we build the shared libraries. + tmp = _CONFIG_VARS.copy() + try: + # XXX Help! I don't have any idea whether these are right... + _CONFIG_VARS['LDSHARED'] = ( + "gcc -Wl,-x -dynamiclib -undefined dynamic_lookup") + _CONFIG_VARS['CCSHARED'] = " -dynamiclib" + _CONFIG_VARS['SO'] = ".dylib" + customize_compiler(compiler) + finally: + _CONFIG_VARS.clear() + _CONFIG_VARS.update(tmp) + else: + customize_compiler(compiler) + + +have_rtld = False +use_stubs = False +libtype = 'shared' + +if sys.platform == "darwin": + use_stubs = True +elif os.name != 'nt': + try: + import dl + use_stubs = have_rtld = hasattr(dl, 'RTLD_NOW') + except ImportError: + pass + +if_dl = lambda s: s if have_rtld else '' + + +def get_abi3_suffix(): + """Return the file extension for an abi3-compliant Extension()""" + for suffix, _, _ in (s for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION): + if '.abi3' in suffix: # Unix + return suffix + elif suffix == '.pyd': # Windows + return suffix + + +class build_ext(_build_ext): + def run(self): + """Build extensions in build directory, then copy if --inplace""" + old_inplace, self.inplace = self.inplace, 0 + _build_ext.run(self) + self.inplace = old_inplace + if old_inplace: + self.copy_extensions_to_source() + + def copy_extensions_to_source(self): + build_py = self.get_finalized_command('build_py') + for ext in self.extensions: + fullname = self.get_ext_fullname(ext.name) + filename = self.get_ext_filename(fullname) + modpath = fullname.split('.') + package = '.'.join(modpath[:-1]) + package_dir = build_py.get_package_dir(package) + dest_filename = os.path.join(package_dir, + os.path.basename(filename)) + src_filename = os.path.join(self.build_lib, filename) + + # Always copy, even if source is older than destination, to ensure + # that the right extensions for the current Python/platform are + # used. + copy_file( + src_filename, dest_filename, verbose=self.verbose, + dry_run=self.dry_run + ) + if ext._needs_stub: + self.write_stub(package_dir or os.curdir, ext, True) + + def get_ext_filename(self, fullname): + filename = _build_ext.get_ext_filename(self, fullname) + if fullname in self.ext_map: + ext = self.ext_map[fullname] + use_abi3 = ( + six.PY3 + and getattr(ext, 'py_limited_api') + and get_abi3_suffix() + ) + if use_abi3: + so_ext = get_config_var('EXT_SUFFIX') + filename = filename[:-len(so_ext)] + filename = filename + get_abi3_suffix() + if isinstance(ext, Library): + fn, ext = os.path.splitext(filename) + return self.shlib_compiler.library_filename(fn, libtype) + elif use_stubs and ext._links_to_dynamic: + d, fn = os.path.split(filename) + return os.path.join(d, 'dl-' + fn) + return filename + + def initialize_options(self): + _build_ext.initialize_options(self) + self.shlib_compiler = None + self.shlibs = [] + self.ext_map = {} + + def finalize_options(self): + _build_ext.finalize_options(self) + self.extensions = self.extensions or [] + self.check_extensions_list(self.extensions) + self.shlibs = [ext for ext in self.extensions + if isinstance(ext, Library)] + if self.shlibs: + self.setup_shlib_compiler() + for ext in self.extensions: + ext._full_name = self.get_ext_fullname(ext.name) + for ext in self.extensions: + fullname = ext._full_name + self.ext_map[fullname] = ext + + # distutils 3.1 will also ask for module names + # XXX what to do with conflicts? + self.ext_map[fullname.split('.')[-1]] = ext + + ltd = self.shlibs and self.links_to_dynamic(ext) or False + ns = ltd and use_stubs and not isinstance(ext, Library) + ext._links_to_dynamic = ltd + ext._needs_stub = ns + filename = ext._file_name = self.get_ext_filename(fullname) + libdir = os.path.dirname(os.path.join(self.build_lib, filename)) + if ltd and libdir not in ext.library_dirs: + ext.library_dirs.append(libdir) + if ltd and use_stubs and os.curdir not in ext.runtime_library_dirs: + ext.runtime_library_dirs.append(os.curdir) + + def setup_shlib_compiler(self): + compiler = self.shlib_compiler = new_compiler( + compiler=self.compiler, dry_run=self.dry_run, force=self.force + ) + _customize_compiler_for_shlib(compiler) + + if self.include_dirs is not None: + compiler.set_include_dirs(self.include_dirs) + if self.define is not None: + # 'define' option is a list of (name,value) tuples + for (name, value) in self.define: + compiler.define_macro(name, value) + if self.undef is not None: + for macro in self.undef: + compiler.undefine_macro(macro) + if self.libraries is not None: + compiler.set_libraries(self.libraries) + if self.library_dirs is not None: + compiler.set_library_dirs(self.library_dirs) + if self.rpath is not None: + compiler.set_runtime_library_dirs(self.rpath) + if self.link_objects is not None: + compiler.set_link_objects(self.link_objects) + + # hack so distutils' build_extension() builds a library instead + compiler.link_shared_object = link_shared_object.__get__(compiler) + + def get_export_symbols(self, ext): + if isinstance(ext, Library): + return ext.export_symbols + return _build_ext.get_export_symbols(self, ext) + + def build_extension(self, ext): + ext._convert_pyx_sources_to_lang() + _compiler = self.compiler + try: + if isinstance(ext, Library): + self.compiler = self.shlib_compiler + _build_ext.build_extension(self, ext) + if ext._needs_stub: + cmd = self.get_finalized_command('build_py').build_lib + self.write_stub(cmd, ext) + finally: + self.compiler = _compiler + + def links_to_dynamic(self, ext): + """Return true if 'ext' links to a dynamic lib in the same package""" + # XXX this should check to ensure the lib is actually being built + # XXX as dynamic, and not just using a locally-found version or a + # XXX static-compiled version + libnames = dict.fromkeys([lib._full_name for lib in self.shlibs]) + pkg = '.'.join(ext._full_name.split('.')[:-1] + ['']) + return any(pkg + libname in libnames for libname in ext.libraries) + + def get_outputs(self): + return _build_ext.get_outputs(self) + self.__get_stubs_outputs() + + def __get_stubs_outputs(self): + # assemble the base name for each extension that needs a stub + ns_ext_bases = ( + os.path.join(self.build_lib, *ext._full_name.split('.')) + for ext in self.extensions + if ext._needs_stub + ) + # pair each base with the extension + pairs = itertools.product(ns_ext_bases, self.__get_output_extensions()) + return list(base + fnext for base, fnext in pairs) + + def __get_output_extensions(self): + yield '.py' + yield '.pyc' + if self.get_finalized_command('build_py').optimize: + yield '.pyo' + + def write_stub(self, output_dir, ext, compile=False): + log.info("writing stub loader for %s to %s", ext._full_name, + output_dir) + stub_file = (os.path.join(output_dir, *ext._full_name.split('.')) + + '.py') + if compile and os.path.exists(stub_file): + raise DistutilsError(stub_file + " already exists! Please delete.") + if not self.dry_run: + f = open(stub_file, 'w') + f.write( + '\n'.join([ + "def __bootstrap__():", + " global __bootstrap__, __file__, __loader__", + " import sys, os, pkg_resources, imp" + if_dl(", dl"), + " __file__ = pkg_resources.resource_filename" + "(__name__,%r)" + % os.path.basename(ext._file_name), + " del __bootstrap__", + " if '__loader__' in globals():", + " del __loader__", + if_dl(" old_flags = sys.getdlopenflags()"), + " old_dir = os.getcwd()", + " try:", + " os.chdir(os.path.dirname(__file__))", + if_dl(" sys.setdlopenflags(dl.RTLD_NOW)"), + " imp.load_dynamic(__name__,__file__)", + " finally:", + if_dl(" sys.setdlopenflags(old_flags)"), + " os.chdir(old_dir)", + "__bootstrap__()", + "" # terminal \n + ]) + ) + f.close() + if compile: + from distutils.util import byte_compile + + byte_compile([stub_file], optimize=0, + force=True, dry_run=self.dry_run) + optimize = self.get_finalized_command('install_lib').optimize + if optimize > 0: + byte_compile([stub_file], optimize=optimize, + force=True, dry_run=self.dry_run) + if os.path.exists(stub_file) and not self.dry_run: + os.unlink(stub_file) + + +if use_stubs or os.name == 'nt': + # Build shared libraries + # + def link_shared_object( + self, objects, output_libname, output_dir=None, libraries=None, + library_dirs=None, runtime_library_dirs=None, export_symbols=None, + debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, + target_lang=None): + self.link( + self.SHARED_LIBRARY, objects, output_libname, + output_dir, libraries, library_dirs, runtime_library_dirs, + export_symbols, debug, extra_preargs, extra_postargs, + build_temp, target_lang + ) +else: + # Build static libraries everywhere else + libtype = 'static' + + def link_shared_object( + self, objects, output_libname, output_dir=None, libraries=None, + library_dirs=None, runtime_library_dirs=None, export_symbols=None, + debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, + target_lang=None): + # XXX we need to either disallow these attrs on Library instances, + # or warn/abort here if set, or something... + # libraries=None, library_dirs=None, runtime_library_dirs=None, + # export_symbols=None, extra_preargs=None, extra_postargs=None, + # build_temp=None + + assert output_dir is None # distutils build_ext doesn't pass this + output_dir, filename = os.path.split(output_libname) + basename, ext = os.path.splitext(filename) + if self.library_filename("x").startswith('lib'): + # strip 'lib' prefix; this is kludgy if some platform uses + # a different prefix + basename = basename[3:] + + self.create_static_lib( + objects, basename, output_dir, debug, target_lang + ) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/build_py.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/build_py.py new file mode 100644 index 0000000..b0314fd --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/build_py.py @@ -0,0 +1,270 @@ +from glob import glob +from distutils.util import convert_path +import distutils.command.build_py as orig +import os +import fnmatch +import textwrap +import io +import distutils.errors +import itertools + +from setuptools.extern import six +from setuptools.extern.six.moves import map, filter, filterfalse + +try: + from setuptools.lib2to3_ex import Mixin2to3 +except ImportError: + + class Mixin2to3: + def run_2to3(self, files, doctests=True): + "do nothing" + + +class build_py(orig.build_py, Mixin2to3): + """Enhanced 'build_py' command that includes data files with packages + + The data files are specified via a 'package_data' argument to 'setup()'. + See 'setuptools.dist.Distribution' for more details. + + Also, this version of the 'build_py' command allows you to specify both + 'py_modules' and 'packages' in the same setup operation. + """ + + def finalize_options(self): + orig.build_py.finalize_options(self) + self.package_data = self.distribution.package_data + self.exclude_package_data = (self.distribution.exclude_package_data or + {}) + if 'data_files' in self.__dict__: + del self.__dict__['data_files'] + self.__updated_files = [] + self.__doctests_2to3 = [] + + def run(self): + """Build modules, packages, and copy data files to build directory""" + if not self.py_modules and not self.packages: + return + + if self.py_modules: + self.build_modules() + + if self.packages: + self.build_packages() + self.build_package_data() + + self.run_2to3(self.__updated_files, False) + self.run_2to3(self.__updated_files, True) + self.run_2to3(self.__doctests_2to3, True) + + # Only compile actual .py files, using our base class' idea of what our + # output files are. + self.byte_compile(orig.build_py.get_outputs(self, include_bytecode=0)) + + def __getattr__(self, attr): + "lazily compute data files" + if attr == 'data_files': + self.data_files = self._get_data_files() + return self.data_files + return orig.build_py.__getattr__(self, attr) + + def build_module(self, module, module_file, package): + if six.PY2 and isinstance(package, six.string_types): + # avoid errors on Python 2 when unicode is passed (#190) + package = package.split('.') + outfile, copied = orig.build_py.build_module(self, module, module_file, + package) + if copied: + self.__updated_files.append(outfile) + return outfile, copied + + def _get_data_files(self): + """Generate list of '(package,src_dir,build_dir,filenames)' tuples""" + self.analyze_manifest() + return list(map(self._get_pkg_data_files, self.packages or ())) + + def _get_pkg_data_files(self, package): + # Locate package source directory + src_dir = self.get_package_dir(package) + + # Compute package build directory + build_dir = os.path.join(*([self.build_lib] + package.split('.'))) + + # Strip directory from globbed filenames + filenames = [ + os.path.relpath(file, src_dir) + for file in self.find_data_files(package, src_dir) + ] + return package, src_dir, build_dir, filenames + + def find_data_files(self, package, src_dir): + """Return filenames for package's data files in 'src_dir'""" + patterns = self._get_platform_patterns( + self.package_data, + package, + src_dir, + ) + globs_expanded = map(glob, patterns) + # flatten the expanded globs into an iterable of matches + globs_matches = itertools.chain.from_iterable(globs_expanded) + glob_files = filter(os.path.isfile, globs_matches) + files = itertools.chain( + self.manifest_files.get(package, []), + glob_files, + ) + return self.exclude_data_files(package, src_dir, files) + + def build_package_data(self): + """Copy data files into build directory""" + for package, src_dir, build_dir, filenames in self.data_files: + for filename in filenames: + target = os.path.join(build_dir, filename) + self.mkpath(os.path.dirname(target)) + srcfile = os.path.join(src_dir, filename) + outf, copied = self.copy_file(srcfile, target) + srcfile = os.path.abspath(srcfile) + if (copied and + srcfile in self.distribution.convert_2to3_doctests): + self.__doctests_2to3.append(outf) + + def analyze_manifest(self): + self.manifest_files = mf = {} + if not self.distribution.include_package_data: + return + src_dirs = {} + for package in self.packages or (): + # Locate package source directory + src_dirs[assert_relative(self.get_package_dir(package))] = package + + self.run_command('egg_info') + ei_cmd = self.get_finalized_command('egg_info') + for path in ei_cmd.filelist.files: + d, f = os.path.split(assert_relative(path)) + prev = None + oldf = f + while d and d != prev and d not in src_dirs: + prev = d + d, df = os.path.split(d) + f = os.path.join(df, f) + if d in src_dirs: + if path.endswith('.py') and f == oldf: + continue # it's a module, not data + mf.setdefault(src_dirs[d], []).append(path) + + def get_data_files(self): + pass # Lazily compute data files in _get_data_files() function. + + def check_package(self, package, package_dir): + """Check namespace packages' __init__ for declare_namespace""" + try: + return self.packages_checked[package] + except KeyError: + pass + + init_py = orig.build_py.check_package(self, package, package_dir) + self.packages_checked[package] = init_py + + if not init_py or not self.distribution.namespace_packages: + return init_py + + for pkg in self.distribution.namespace_packages: + if pkg == package or pkg.startswith(package + '.'): + break + else: + return init_py + + with io.open(init_py, 'rb') as f: + contents = f.read() + if b'declare_namespace' not in contents: + raise distutils.errors.DistutilsError( + "Namespace package problem: %s is a namespace package, but " + "its\n__init__.py does not call declare_namespace()! Please " + 'fix it.\n(See the setuptools manual under ' + '"Namespace Packages" for details.)\n"' % (package,) + ) + return init_py + + def initialize_options(self): + self.packages_checked = {} + orig.build_py.initialize_options(self) + + def get_package_dir(self, package): + res = orig.build_py.get_package_dir(self, package) + if self.distribution.src_root is not None: + return os.path.join(self.distribution.src_root, res) + return res + + def exclude_data_files(self, package, src_dir, files): + """Filter filenames for package's data files in 'src_dir'""" + files = list(files) + patterns = self._get_platform_patterns( + self.exclude_package_data, + package, + src_dir, + ) + match_groups = ( + fnmatch.filter(files, pattern) + for pattern in patterns + ) + # flatten the groups of matches into an iterable of matches + matches = itertools.chain.from_iterable(match_groups) + bad = set(matches) + keepers = ( + fn + for fn in files + if fn not in bad + ) + # ditch dupes + return list(_unique_everseen(keepers)) + + @staticmethod + def _get_platform_patterns(spec, package, src_dir): + """ + yield platform-specific path patterns (suitable for glob + or fn_match) from a glob-based spec (such as + self.package_data or self.exclude_package_data) + matching package in src_dir. + """ + raw_patterns = itertools.chain( + spec.get('', []), + spec.get(package, []), + ) + return ( + # Each pattern has to be converted to a platform-specific path + os.path.join(src_dir, convert_path(pattern)) + for pattern in raw_patterns + ) + + +# from Python docs +def _unique_everseen(iterable, key=None): + "List unique elements, preserving order. Remember all elements ever seen." + # unique_everseen('AAAABBBCCDAABBB') --> A B C D + # unique_everseen('ABBCcAD', str.lower) --> A B C D + seen = set() + seen_add = seen.add + if key is None: + for element in filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element + + +def assert_relative(path): + if not os.path.isabs(path): + return path + from distutils.errors import DistutilsSetupError + + msg = textwrap.dedent(""" + Error: setup script specifies an absolute path: + + %s + + setup() arguments must *always* be /-separated paths relative to the + setup.py directory, *never* absolute paths. + """).lstrip() % path + raise DistutilsSetupError(msg) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/develop.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/develop.py new file mode 100644 index 0000000..009e4f9 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/develop.py @@ -0,0 +1,221 @@ +from distutils.util import convert_path +from distutils import log +from distutils.errors import DistutilsError, DistutilsOptionError +import os +import glob +import io + +from setuptools.extern import six + +import pkg_resources +from setuptools.command.easy_install import easy_install +from setuptools import namespaces +import setuptools + +__metaclass__ = type + + +class develop(namespaces.DevelopInstaller, easy_install): + """Set up package for development""" + + description = "install package in 'development mode'" + + user_options = easy_install.user_options + [ + ("uninstall", "u", "Uninstall this source package"), + ("egg-path=", None, "Set the path to be used in the .egg-link file"), + ] + + boolean_options = easy_install.boolean_options + ['uninstall'] + + command_consumes_arguments = False # override base + + def run(self): + if self.uninstall: + self.multi_version = True + self.uninstall_link() + self.uninstall_namespaces() + else: + self.install_for_development() + self.warn_deprecated_options() + + def initialize_options(self): + self.uninstall = None + self.egg_path = None + easy_install.initialize_options(self) + self.setup_path = None + self.always_copy_from = '.' # always copy eggs installed in curdir + + def finalize_options(self): + ei = self.get_finalized_command("egg_info") + if ei.broken_egg_info: + template = "Please rename %r to %r before using 'develop'" + args = ei.egg_info, ei.broken_egg_info + raise DistutilsError(template % args) + self.args = [ei.egg_name] + + easy_install.finalize_options(self) + self.expand_basedirs() + self.expand_dirs() + # pick up setup-dir .egg files only: no .egg-info + self.package_index.scan(glob.glob('*.egg')) + + egg_link_fn = ei.egg_name + '.egg-link' + self.egg_link = os.path.join(self.install_dir, egg_link_fn) + self.egg_base = ei.egg_base + if self.egg_path is None: + self.egg_path = os.path.abspath(ei.egg_base) + + target = pkg_resources.normalize_path(self.egg_base) + egg_path = pkg_resources.normalize_path( + os.path.join(self.install_dir, self.egg_path)) + if egg_path != target: + raise DistutilsOptionError( + "--egg-path must be a relative path from the install" + " directory to " + target + ) + + # Make a distribution for the package's source + self.dist = pkg_resources.Distribution( + target, + pkg_resources.PathMetadata(target, os.path.abspath(ei.egg_info)), + project_name=ei.egg_name + ) + + self.setup_path = self._resolve_setup_path( + self.egg_base, + self.install_dir, + self.egg_path, + ) + + @staticmethod + def _resolve_setup_path(egg_base, install_dir, egg_path): + """ + Generate a path from egg_base back to '.' where the + setup script resides and ensure that path points to the + setup path from $install_dir/$egg_path. + """ + path_to_setup = egg_base.replace(os.sep, '/').rstrip('/') + if path_to_setup != os.curdir: + path_to_setup = '../' * (path_to_setup.count('/') + 1) + resolved = pkg_resources.normalize_path( + os.path.join(install_dir, egg_path, path_to_setup) + ) + if resolved != pkg_resources.normalize_path(os.curdir): + raise DistutilsOptionError( + "Can't get a consistent path to setup script from" + " installation directory", resolved, + pkg_resources.normalize_path(os.curdir)) + return path_to_setup + + def install_for_development(self): + if six.PY3 and getattr(self.distribution, 'use_2to3', False): + # If we run 2to3 we can not do this inplace: + + # Ensure metadata is up-to-date + self.reinitialize_command('build_py', inplace=0) + self.run_command('build_py') + bpy_cmd = self.get_finalized_command("build_py") + build_path = pkg_resources.normalize_path(bpy_cmd.build_lib) + + # Build extensions + self.reinitialize_command('egg_info', egg_base=build_path) + self.run_command('egg_info') + + self.reinitialize_command('build_ext', inplace=0) + self.run_command('build_ext') + + # Fixup egg-link and easy-install.pth + ei_cmd = self.get_finalized_command("egg_info") + self.egg_path = build_path + self.dist.location = build_path + # XXX + self.dist._provider = pkg_resources.PathMetadata( + build_path, ei_cmd.egg_info) + else: + # Without 2to3 inplace works fine: + self.run_command('egg_info') + + # Build extensions in-place + self.reinitialize_command('build_ext', inplace=1) + self.run_command('build_ext') + + self.install_site_py() # ensure that target dir is site-safe + if setuptools.bootstrap_install_from: + self.easy_install(setuptools.bootstrap_install_from) + setuptools.bootstrap_install_from = None + + self.install_namespaces() + + # create an .egg-link in the installation dir, pointing to our egg + log.info("Creating %s (link to %s)", self.egg_link, self.egg_base) + if not self.dry_run: + with open(self.egg_link, "w") as f: + f.write(self.egg_path + "\n" + self.setup_path) + # postprocess the installed distro, fixing up .pth, installing scripts, + # and handling requirements + self.process_distribution(None, self.dist, not self.no_deps) + + def uninstall_link(self): + if os.path.exists(self.egg_link): + log.info("Removing %s (link to %s)", self.egg_link, self.egg_base) + egg_link_file = open(self.egg_link) + contents = [line.rstrip() for line in egg_link_file] + egg_link_file.close() + if contents not in ([self.egg_path], + [self.egg_path, self.setup_path]): + log.warn("Link points to %s: uninstall aborted", contents) + return + if not self.dry_run: + os.unlink(self.egg_link) + if not self.dry_run: + self.update_pth(self.dist) # remove any .pth link to us + if self.distribution.scripts: + # XXX should also check for entry point scripts! + log.warn("Note: you must uninstall or replace scripts manually!") + + def install_egg_scripts(self, dist): + if dist is not self.dist: + # Installing a dependency, so fall back to normal behavior + return easy_install.install_egg_scripts(self, dist) + + # create wrapper scripts in the script dir, pointing to dist.scripts + + # new-style... + self.install_wrapper_scripts(dist) + + # ...and old-style + for script_name in self.distribution.scripts or []: + script_path = os.path.abspath(convert_path(script_name)) + script_name = os.path.basename(script_path) + with io.open(script_path) as strm: + script_text = strm.read() + self.install_script(dist, script_name, script_text, script_path) + + def install_wrapper_scripts(self, dist): + dist = VersionlessRequirement(dist) + return easy_install.install_wrapper_scripts(self, dist) + + +class VersionlessRequirement: + """ + Adapt a pkg_resources.Distribution to simply return the project + name as the 'requirement' so that scripts will work across + multiple versions. + + >>> from pkg_resources import Distribution + >>> dist = Distribution(project_name='foo', version='1.0') + >>> str(dist.as_requirement()) + 'foo==1.0' + >>> adapted_dist = VersionlessRequirement(dist) + >>> str(adapted_dist.as_requirement()) + 'foo' + """ + + def __init__(self, dist): + self.__dist = dist + + def __getattr__(self, name): + return getattr(self.__dist, name) + + def as_requirement(self): + return self.project_name diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/dist_info.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/dist_info.py new file mode 100644 index 0000000..c45258f --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/dist_info.py @@ -0,0 +1,36 @@ +""" +Create a dist_info directory +As defined in the wheel specification +""" + +import os + +from distutils.core import Command +from distutils import log + + +class dist_info(Command): + + description = 'create a .dist-info directory' + + user_options = [ + ('egg-base=', 'e', "directory containing .egg-info directories" + " (default: top of the source tree)"), + ] + + def initialize_options(self): + self.egg_base = None + + def finalize_options(self): + pass + + def run(self): + egg_info = self.get_finalized_command('egg_info') + egg_info.egg_base = self.egg_base + egg_info.finalize_options() + egg_info.run() + dist_info_dir = egg_info.egg_info[:-len('.egg-info')] + '.dist-info' + log.info("creating '{}'".format(os.path.abspath(dist_info_dir))) + + bdist_wheel = self.get_finalized_command('bdist_wheel') + bdist_wheel.egg2dist(egg_info.egg_info, dist_info_dir) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/easy_install.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/easy_install.py new file mode 100644 index 0000000..06c9827 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/easy_install.py @@ -0,0 +1,2342 @@ +#!/usr/bin/env python +""" +Easy Install +------------ + +A tool for doing automatic download/extract/build of distutils-based Python +packages. For detailed documentation, see the accompanying EasyInstall.txt +file, or visit the `EasyInstall home page`__. + +__ https://setuptools.readthedocs.io/en/latest/easy_install.html + +""" + +from glob import glob +from distutils.util import get_platform +from distutils.util import convert_path, subst_vars +from distutils.errors import ( + DistutilsArgError, DistutilsOptionError, + DistutilsError, DistutilsPlatformError, +) +from distutils.command.install import INSTALL_SCHEMES, SCHEME_KEYS +from distutils import log, dir_util +from distutils.command.build_scripts import first_line_re +from distutils.spawn import find_executable +import sys +import os +import zipimport +import shutil +import tempfile +import zipfile +import re +import stat +import random +import textwrap +import warnings +import site +import struct +import contextlib +import subprocess +import shlex +import io + + +from sysconfig import get_config_vars, get_path + +from setuptools import SetuptoolsDeprecationWarning + +from setuptools.extern import six +from setuptools.extern.six.moves import configparser, map + +from setuptools import Command +from setuptools.sandbox import run_setup +from setuptools.py27compat import rmtree_safe +from setuptools.command import setopt +from setuptools.archive_util import unpack_archive +from setuptools.package_index import ( + PackageIndex, parse_requirement_arg, URL_SCHEME, +) +from setuptools.command import bdist_egg, egg_info +from setuptools.wheel import Wheel +from pkg_resources import ( + yield_lines, normalize_path, resource_string, ensure_directory, + get_distribution, find_distributions, Environment, Requirement, + Distribution, PathMetadata, EggMetadata, WorkingSet, DistributionNotFound, + VersionConflict, DEVELOP_DIST, +) +import pkg_resources.py31compat + +__metaclass__ = type + +# Turn on PEP440Warnings +warnings.filterwarnings("default", category=pkg_resources.PEP440Warning) + +__all__ = [ + 'samefile', 'easy_install', 'PthDistributions', 'extract_wininst_cfg', + 'main', 'get_exe_prefixes', +] + + +def is_64bit(): + return struct.calcsize("P") == 8 + + +def samefile(p1, p2): + """ + Determine if two paths reference the same file. + + Augments os.path.samefile to work on Windows and + suppresses errors if the path doesn't exist. + """ + both_exist = os.path.exists(p1) and os.path.exists(p2) + use_samefile = hasattr(os.path, 'samefile') and both_exist + if use_samefile: + return os.path.samefile(p1, p2) + norm_p1 = os.path.normpath(os.path.normcase(p1)) + norm_p2 = os.path.normpath(os.path.normcase(p2)) + return norm_p1 == norm_p2 + + +if six.PY2: + + def _to_bytes(s): + return s + + def isascii(s): + try: + six.text_type(s, 'ascii') + return True + except UnicodeError: + return False +else: + + def _to_bytes(s): + return s.encode('utf8') + + def isascii(s): + try: + s.encode('ascii') + return True + except UnicodeError: + return False + + +_one_liner = lambda text: textwrap.dedent(text).strip().replace('\n', '; ') + + +class easy_install(Command): + """Manage a download/build/install process""" + description = "Find/get/install Python packages" + command_consumes_arguments = True + + user_options = [ + ('prefix=', None, "installation prefix"), + ("zip-ok", "z", "install package as a zipfile"), + ("multi-version", "m", "make apps have to require() a version"), + ("upgrade", "U", "force upgrade (searches PyPI for latest versions)"), + ("install-dir=", "d", "install package to DIR"), + ("script-dir=", "s", "install scripts to DIR"), + ("exclude-scripts", "x", "Don't install scripts"), + ("always-copy", "a", "Copy all needed packages to install dir"), + ("index-url=", "i", "base URL of Python Package Index"), + ("find-links=", "f", "additional URL(s) to search for packages"), + ("build-directory=", "b", + "download/extract/build in DIR; keep the results"), + ('optimize=', 'O', + "also compile with optimization: -O1 for \"python -O\", " + "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"), + ('record=', None, + "filename in which to record list of installed files"), + ('always-unzip', 'Z', "don't install as a zipfile, no matter what"), + ('site-dirs=', 'S', "list of directories where .pth files work"), + ('editable', 'e', "Install specified packages in editable form"), + ('no-deps', 'N', "don't install dependencies"), + ('allow-hosts=', 'H', "pattern(s) that hostnames must match"), + ('local-snapshots-ok', 'l', + "allow building eggs from local checkouts"), + ('version', None, "print version information and exit"), + ('no-find-links', None, + "Don't load find-links defined in packages being installed") + ] + boolean_options = [ + 'zip-ok', 'multi-version', 'exclude-scripts', 'upgrade', 'always-copy', + 'editable', + 'no-deps', 'local-snapshots-ok', 'version' + ] + + if site.ENABLE_USER_SITE: + help_msg = "install in user site-package '%s'" % site.USER_SITE + user_options.append(('user', None, help_msg)) + boolean_options.append('user') + + negative_opt = {'always-unzip': 'zip-ok'} + create_index = PackageIndex + + def initialize_options(self): + # the --user option seems to be an opt-in one, + # so the default should be False. + self.user = 0 + self.zip_ok = self.local_snapshots_ok = None + self.install_dir = self.script_dir = self.exclude_scripts = None + self.index_url = None + self.find_links = None + self.build_directory = None + self.args = None + self.optimize = self.record = None + self.upgrade = self.always_copy = self.multi_version = None + self.editable = self.no_deps = self.allow_hosts = None + self.root = self.prefix = self.no_report = None + self.version = None + self.install_purelib = None # for pure module distributions + self.install_platlib = None # non-pure (dists w/ extensions) + self.install_headers = None # for C/C++ headers + self.install_lib = None # set to either purelib or platlib + self.install_scripts = None + self.install_data = None + self.install_base = None + self.install_platbase = None + if site.ENABLE_USER_SITE: + self.install_userbase = site.USER_BASE + self.install_usersite = site.USER_SITE + else: + self.install_userbase = None + self.install_usersite = None + self.no_find_links = None + + # Options not specifiable via command line + self.package_index = None + self.pth_file = self.always_copy_from = None + self.site_dirs = None + self.installed_projects = {} + self.sitepy_installed = False + # Always read easy_install options, even if we are subclassed, or have + # an independent instance created. This ensures that defaults will + # always come from the standard configuration file(s)' "easy_install" + # section, even if this is a "develop" or "install" command, or some + # other embedding. + self._dry_run = None + self.verbose = self.distribution.verbose + self.distribution._set_command_options( + self, self.distribution.get_option_dict('easy_install') + ) + + def delete_blockers(self, blockers): + extant_blockers = ( + filename for filename in blockers + if os.path.exists(filename) or os.path.islink(filename) + ) + list(map(self._delete_path, extant_blockers)) + + def _delete_path(self, path): + log.info("Deleting %s", path) + if self.dry_run: + return + + is_tree = os.path.isdir(path) and not os.path.islink(path) + remover = rmtree if is_tree else os.unlink + remover(path) + + @staticmethod + def _render_version(): + """ + Render the Setuptools version and installation details, then exit. + """ + ver = sys.version[:3] + dist = get_distribution('setuptools') + tmpl = 'setuptools {dist.version} from {dist.location} (Python {ver})' + print(tmpl.format(**locals())) + raise SystemExit() + + def finalize_options(self): + self.version and self._render_version() + + py_version = sys.version.split()[0] + prefix, exec_prefix = get_config_vars('prefix', 'exec_prefix') + + self.config_vars = { + 'dist_name': self.distribution.get_name(), + 'dist_version': self.distribution.get_version(), + 'dist_fullname': self.distribution.get_fullname(), + 'py_version': py_version, + 'py_version_short': py_version[0:3], + 'py_version_nodot': py_version[0] + py_version[2], + 'sys_prefix': prefix, + 'prefix': prefix, + 'sys_exec_prefix': exec_prefix, + 'exec_prefix': exec_prefix, + # Only python 3.2+ has abiflags + 'abiflags': getattr(sys, 'abiflags', ''), + } + + if site.ENABLE_USER_SITE: + self.config_vars['userbase'] = self.install_userbase + self.config_vars['usersite'] = self.install_usersite + + self._fix_install_dir_for_user_site() + + self.expand_basedirs() + self.expand_dirs() + + self._expand( + 'install_dir', 'script_dir', 'build_directory', + 'site_dirs', + ) + # If a non-default installation directory was specified, default the + # script directory to match it. + if self.script_dir is None: + self.script_dir = self.install_dir + + if self.no_find_links is None: + self.no_find_links = False + + # Let install_dir get set by install_lib command, which in turn + # gets its info from the install command, and takes into account + # --prefix and --home and all that other crud. + self.set_undefined_options( + 'install_lib', ('install_dir', 'install_dir') + ) + # Likewise, set default script_dir from 'install_scripts.install_dir' + self.set_undefined_options( + 'install_scripts', ('install_dir', 'script_dir') + ) + + if self.user and self.install_purelib: + self.install_dir = self.install_purelib + self.script_dir = self.install_scripts + # default --record from the install command + self.set_undefined_options('install', ('record', 'record')) + # Should this be moved to the if statement below? It's not used + # elsewhere + normpath = map(normalize_path, sys.path) + self.all_site_dirs = get_site_dirs() + if self.site_dirs is not None: + site_dirs = [ + os.path.expanduser(s.strip()) for s in + self.site_dirs.split(',') + ] + for d in site_dirs: + if not os.path.isdir(d): + log.warn("%s (in --site-dirs) does not exist", d) + elif normalize_path(d) not in normpath: + raise DistutilsOptionError( + d + " (in --site-dirs) is not on sys.path" + ) + else: + self.all_site_dirs.append(normalize_path(d)) + if not self.editable: + self.check_site_dir() + self.index_url = self.index_url or "https://pypi.org/simple/" + self.shadow_path = self.all_site_dirs[:] + for path_item in self.install_dir, normalize_path(self.script_dir): + if path_item not in self.shadow_path: + self.shadow_path.insert(0, path_item) + + if self.allow_hosts is not None: + hosts = [s.strip() for s in self.allow_hosts.split(',')] + else: + hosts = ['*'] + if self.package_index is None: + self.package_index = self.create_index( + self.index_url, search_path=self.shadow_path, hosts=hosts, + ) + self.local_index = Environment(self.shadow_path + sys.path) + + if self.find_links is not None: + if isinstance(self.find_links, six.string_types): + self.find_links = self.find_links.split() + else: + self.find_links = [] + if self.local_snapshots_ok: + self.package_index.scan_egg_links(self.shadow_path + sys.path) + if not self.no_find_links: + self.package_index.add_find_links(self.find_links) + self.set_undefined_options('install_lib', ('optimize', 'optimize')) + if not isinstance(self.optimize, int): + try: + self.optimize = int(self.optimize) + if not (0 <= self.optimize <= 2): + raise ValueError + except ValueError: + raise DistutilsOptionError("--optimize must be 0, 1, or 2") + + if self.editable and not self.build_directory: + raise DistutilsArgError( + "Must specify a build directory (-b) when using --editable" + ) + if not self.args: + raise DistutilsArgError( + "No urls, filenames, or requirements specified (see --help)") + + self.outputs = [] + + def _fix_install_dir_for_user_site(self): + """ + Fix the install_dir if "--user" was used. + """ + if not self.user or not site.ENABLE_USER_SITE: + return + + self.create_home_path() + if self.install_userbase is None: + msg = "User base directory is not specified" + raise DistutilsPlatformError(msg) + self.install_base = self.install_platbase = self.install_userbase + scheme_name = os.name.replace('posix', 'unix') + '_user' + self.select_scheme(scheme_name) + + def _expand_attrs(self, attrs): + for attr in attrs: + val = getattr(self, attr) + if val is not None: + if os.name == 'posix' or os.name == 'nt': + val = os.path.expanduser(val) + val = subst_vars(val, self.config_vars) + setattr(self, attr, val) + + def expand_basedirs(self): + """Calls `os.path.expanduser` on install_base, install_platbase and + root.""" + self._expand_attrs(['install_base', 'install_platbase', 'root']) + + def expand_dirs(self): + """Calls `os.path.expanduser` on install dirs.""" + dirs = [ + 'install_purelib', + 'install_platlib', + 'install_lib', + 'install_headers', + 'install_scripts', + 'install_data', + ] + self._expand_attrs(dirs) + + def run(self): + if self.verbose != self.distribution.verbose: + log.set_verbosity(self.verbose) + try: + for spec in self.args: + self.easy_install(spec, not self.no_deps) + if self.record: + outputs = self.outputs + if self.root: # strip any package prefix + root_len = len(self.root) + for counter in range(len(outputs)): + outputs[counter] = outputs[counter][root_len:] + from distutils import file_util + + self.execute( + file_util.write_file, (self.record, outputs), + "writing list of installed files to '%s'" % + self.record + ) + self.warn_deprecated_options() + finally: + log.set_verbosity(self.distribution.verbose) + + def pseudo_tempname(self): + """Return a pseudo-tempname base in the install directory. + This code is intentionally naive; if a malicious party can write to + the target directory you're already in deep doodoo. + """ + try: + pid = os.getpid() + except Exception: + pid = random.randint(0, sys.maxsize) + return os.path.join(self.install_dir, "test-easy-install-%s" % pid) + + def warn_deprecated_options(self): + pass + + def check_site_dir(self): + """Verify that self.install_dir is .pth-capable dir, if needed""" + + instdir = normalize_path(self.install_dir) + pth_file = os.path.join(instdir, 'easy-install.pth') + + # Is it a configured, PYTHONPATH, implicit, or explicit site dir? + is_site_dir = instdir in self.all_site_dirs + + if not is_site_dir and not self.multi_version: + # No? Then directly test whether it does .pth file processing + is_site_dir = self.check_pth_processing() + else: + # make sure we can write to target dir + testfile = self.pseudo_tempname() + '.write-test' + test_exists = os.path.exists(testfile) + try: + if test_exists: + os.unlink(testfile) + open(testfile, 'w').close() + os.unlink(testfile) + except (OSError, IOError): + self.cant_write_to_target() + + if not is_site_dir and not self.multi_version: + # Can't install non-multi to non-site dir + raise DistutilsError(self.no_default_version_msg()) + + if is_site_dir: + if self.pth_file is None: + self.pth_file = PthDistributions(pth_file, self.all_site_dirs) + else: + self.pth_file = None + + if instdir not in map(normalize_path, _pythonpath()): + # only PYTHONPATH dirs need a site.py, so pretend it's there + self.sitepy_installed = True + elif self.multi_version and not os.path.exists(pth_file): + self.sitepy_installed = True # don't need site.py in this case + self.pth_file = None # and don't create a .pth file + self.install_dir = instdir + + __cant_write_msg = textwrap.dedent(""" + can't create or remove files in install directory + + The following error occurred while trying to add or remove files in the + installation directory: + + %s + + The installation directory you specified (via --install-dir, --prefix, or + the distutils default setting) was: + + %s + """).lstrip() + + __not_exists_id = textwrap.dedent(""" + This directory does not currently exist. Please create it and try again, or + choose a different installation directory (using the -d or --install-dir + option). + """).lstrip() + + __access_msg = textwrap.dedent(""" + Perhaps your account does not have write access to this directory? If the + installation directory is a system-owned directory, you may need to sign in + as the administrator or "root" account. If you do not have administrative + access to this machine, you may wish to choose a different installation + directory, preferably one that is listed in your PYTHONPATH environment + variable. + + For information on other options, you may wish to consult the + documentation at: + + https://setuptools.readthedocs.io/en/latest/easy_install.html + + Please make the appropriate changes for your system and try again. + """).lstrip() + + def cant_write_to_target(self): + msg = self.__cant_write_msg % (sys.exc_info()[1], self.install_dir,) + + if not os.path.exists(self.install_dir): + msg += '\n' + self.__not_exists_id + else: + msg += '\n' + self.__access_msg + raise DistutilsError(msg) + + def check_pth_processing(self): + """Empirically verify whether .pth files are supported in inst. dir""" + instdir = self.install_dir + log.info("Checking .pth file support in %s", instdir) + pth_file = self.pseudo_tempname() + ".pth" + ok_file = pth_file + '.ok' + ok_exists = os.path.exists(ok_file) + tmpl = _one_liner(""" + import os + f = open({ok_file!r}, 'w') + f.write('OK') + f.close() + """) + '\n' + try: + if ok_exists: + os.unlink(ok_file) + dirname = os.path.dirname(ok_file) + pkg_resources.py31compat.makedirs(dirname, exist_ok=True) + f = open(pth_file, 'w') + except (OSError, IOError): + self.cant_write_to_target() + else: + try: + f.write(tmpl.format(**locals())) + f.close() + f = None + executable = sys.executable + if os.name == 'nt': + dirname, basename = os.path.split(executable) + alt = os.path.join(dirname, 'pythonw.exe') + use_alt = ( + basename.lower() == 'python.exe' and + os.path.exists(alt) + ) + if use_alt: + # use pythonw.exe to avoid opening a console window + executable = alt + + from distutils.spawn import spawn + + spawn([executable, '-E', '-c', 'pass'], 0) + + if os.path.exists(ok_file): + log.info( + "TEST PASSED: %s appears to support .pth files", + instdir + ) + return True + finally: + if f: + f.close() + if os.path.exists(ok_file): + os.unlink(ok_file) + if os.path.exists(pth_file): + os.unlink(pth_file) + if not self.multi_version: + log.warn("TEST FAILED: %s does NOT support .pth files", instdir) + return False + + def install_egg_scripts(self, dist): + """Write all the scripts for `dist`, unless scripts are excluded""" + if not self.exclude_scripts and dist.metadata_isdir('scripts'): + for script_name in dist.metadata_listdir('scripts'): + if dist.metadata_isdir('scripts/' + script_name): + # The "script" is a directory, likely a Python 3 + # __pycache__ directory, so skip it. + continue + self.install_script( + dist, script_name, + dist.get_metadata('scripts/' + script_name) + ) + self.install_wrapper_scripts(dist) + + def add_output(self, path): + if os.path.isdir(path): + for base, dirs, files in os.walk(path): + for filename in files: + self.outputs.append(os.path.join(base, filename)) + else: + self.outputs.append(path) + + def not_editable(self, spec): + if self.editable: + raise DistutilsArgError( + "Invalid argument %r: you can't use filenames or URLs " + "with --editable (except via the --find-links option)." + % (spec,) + ) + + def check_editable(self, spec): + if not self.editable: + return + + if os.path.exists(os.path.join(self.build_directory, spec.key)): + raise DistutilsArgError( + "%r already exists in %s; can't do a checkout there" % + (spec.key, self.build_directory) + ) + + @contextlib.contextmanager + def _tmpdir(self): + tmpdir = tempfile.mkdtemp(prefix=u"easy_install-") + try: + # cast to str as workaround for #709 and #710 and #712 + yield str(tmpdir) + finally: + os.path.exists(tmpdir) and rmtree(rmtree_safe(tmpdir)) + + def easy_install(self, spec, deps=False): + if not self.editable: + self.install_site_py() + + with self._tmpdir() as tmpdir: + if not isinstance(spec, Requirement): + if URL_SCHEME(spec): + # It's a url, download it to tmpdir and process + self.not_editable(spec) + dl = self.package_index.download(spec, tmpdir) + return self.install_item(None, dl, tmpdir, deps, True) + + elif os.path.exists(spec): + # Existing file or directory, just process it directly + self.not_editable(spec) + return self.install_item(None, spec, tmpdir, deps, True) + else: + spec = parse_requirement_arg(spec) + + self.check_editable(spec) + dist = self.package_index.fetch_distribution( + spec, tmpdir, self.upgrade, self.editable, + not self.always_copy, self.local_index + ) + if dist is None: + msg = "Could not find suitable distribution for %r" % spec + if self.always_copy: + msg += " (--always-copy skips system and development eggs)" + raise DistutilsError(msg) + elif dist.precedence == DEVELOP_DIST: + # .egg-info dists don't need installing, just process deps + self.process_distribution(spec, dist, deps, "Using") + return dist + else: + return self.install_item(spec, dist.location, tmpdir, deps) + + def install_item(self, spec, download, tmpdir, deps, install_needed=False): + + # Installation is also needed if file in tmpdir or is not an egg + install_needed = install_needed or self.always_copy + install_needed = install_needed or os.path.dirname(download) == tmpdir + install_needed = install_needed or not download.endswith('.egg') + install_needed = install_needed or ( + self.always_copy_from is not None and + os.path.dirname(normalize_path(download)) == + normalize_path(self.always_copy_from) + ) + + if spec and not install_needed: + # at this point, we know it's a local .egg, we just don't know if + # it's already installed. + for dist in self.local_index[spec.project_name]: + if dist.location == download: + break + else: + install_needed = True # it's not in the local index + + log.info("Processing %s", os.path.basename(download)) + + if install_needed: + dists = self.install_eggs(spec, download, tmpdir) + for dist in dists: + self.process_distribution(spec, dist, deps) + else: + dists = [self.egg_distribution(download)] + self.process_distribution(spec, dists[0], deps, "Using") + + if spec is not None: + for dist in dists: + if dist in spec: + return dist + + def select_scheme(self, name): + """Sets the install directories by applying the install schemes.""" + # it's the caller's problem if they supply a bad name! + scheme = INSTALL_SCHEMES[name] + for key in SCHEME_KEYS: + attrname = 'install_' + key + if getattr(self, attrname) is None: + setattr(self, attrname, scheme[key]) + + def process_distribution(self, requirement, dist, deps=True, *info): + self.update_pth(dist) + self.package_index.add(dist) + if dist in self.local_index[dist.key]: + self.local_index.remove(dist) + self.local_index.add(dist) + self.install_egg_scripts(dist) + self.installed_projects[dist.key] = dist + log.info(self.installation_report(requirement, dist, *info)) + if (dist.has_metadata('dependency_links.txt') and + not self.no_find_links): + self.package_index.add_find_links( + dist.get_metadata_lines('dependency_links.txt') + ) + if not deps and not self.always_copy: + return + elif requirement is not None and dist.key != requirement.key: + log.warn("Skipping dependencies for %s", dist) + return # XXX this is not the distribution we were looking for + elif requirement is None or dist not in requirement: + # if we wound up with a different version, resolve what we've got + distreq = dist.as_requirement() + requirement = Requirement(str(distreq)) + log.info("Processing dependencies for %s", requirement) + try: + distros = WorkingSet([]).resolve( + [requirement], self.local_index, self.easy_install + ) + except DistributionNotFound as e: + raise DistutilsError(str(e)) + except VersionConflict as e: + raise DistutilsError(e.report()) + if self.always_copy or self.always_copy_from: + # Force all the relevant distros to be copied or activated + for dist in distros: + if dist.key not in self.installed_projects: + self.easy_install(dist.as_requirement()) + log.info("Finished processing dependencies for %s", requirement) + + def should_unzip(self, dist): + if self.zip_ok is not None: + return not self.zip_ok + if dist.has_metadata('not-zip-safe'): + return True + if not dist.has_metadata('zip-safe'): + return True + return False + + def maybe_move(self, spec, dist_filename, setup_base): + dst = os.path.join(self.build_directory, spec.key) + if os.path.exists(dst): + msg = ( + "%r already exists in %s; build directory %s will not be kept" + ) + log.warn(msg, spec.key, self.build_directory, setup_base) + return setup_base + if os.path.isdir(dist_filename): + setup_base = dist_filename + else: + if os.path.dirname(dist_filename) == setup_base: + os.unlink(dist_filename) # get it out of the tmp dir + contents = os.listdir(setup_base) + if len(contents) == 1: + dist_filename = os.path.join(setup_base, contents[0]) + if os.path.isdir(dist_filename): + # if the only thing there is a directory, move it instead + setup_base = dist_filename + ensure_directory(dst) + shutil.move(setup_base, dst) + return dst + + def install_wrapper_scripts(self, dist): + if self.exclude_scripts: + return + for args in ScriptWriter.best().get_args(dist): + self.write_script(*args) + + def install_script(self, dist, script_name, script_text, dev_path=None): + """Generate a legacy script wrapper and install it""" + spec = str(dist.as_requirement()) + is_script = is_python_script(script_text, script_name) + + if is_script: + body = self._load_template(dev_path) % locals() + script_text = ScriptWriter.get_header(script_text) + body + self.write_script(script_name, _to_bytes(script_text), 'b') + + @staticmethod + def _load_template(dev_path): + """ + There are a couple of template scripts in the package. This + function loads one of them and prepares it for use. + """ + # See https://github.com/pypa/setuptools/issues/134 for info + # on script file naming and downstream issues with SVR4 + name = 'script.tmpl' + if dev_path: + name = name.replace('.tmpl', ' (dev).tmpl') + + raw_bytes = resource_string('setuptools', name) + return raw_bytes.decode('utf-8') + + def write_script(self, script_name, contents, mode="t", blockers=()): + """Write an executable file to the scripts directory""" + self.delete_blockers( # clean up old .py/.pyw w/o a script + [os.path.join(self.script_dir, x) for x in blockers] + ) + log.info("Installing %s script to %s", script_name, self.script_dir) + target = os.path.join(self.script_dir, script_name) + self.add_output(target) + + if self.dry_run: + return + + mask = current_umask() + ensure_directory(target) + if os.path.exists(target): + os.unlink(target) + with open(target, "w" + mode) as f: + f.write(contents) + chmod(target, 0o777 - mask) + + def install_eggs(self, spec, dist_filename, tmpdir): + # .egg dirs or files are already built, so just return them + if dist_filename.lower().endswith('.egg'): + return [self.install_egg(dist_filename, tmpdir)] + elif dist_filename.lower().endswith('.exe'): + return [self.install_exe(dist_filename, tmpdir)] + elif dist_filename.lower().endswith('.whl'): + return [self.install_wheel(dist_filename, tmpdir)] + + # Anything else, try to extract and build + setup_base = tmpdir + if os.path.isfile(dist_filename) and not dist_filename.endswith('.py'): + unpack_archive(dist_filename, tmpdir, self.unpack_progress) + elif os.path.isdir(dist_filename): + setup_base = os.path.abspath(dist_filename) + + if (setup_base.startswith(tmpdir) # something we downloaded + and self.build_directory and spec is not None): + setup_base = self.maybe_move(spec, dist_filename, setup_base) + + # Find the setup.py file + setup_script = os.path.join(setup_base, 'setup.py') + + if not os.path.exists(setup_script): + setups = glob(os.path.join(setup_base, '*', 'setup.py')) + if not setups: + raise DistutilsError( + "Couldn't find a setup script in %s" % + os.path.abspath(dist_filename) + ) + if len(setups) > 1: + raise DistutilsError( + "Multiple setup scripts in %s" % + os.path.abspath(dist_filename) + ) + setup_script = setups[0] + + # Now run it, and return the result + if self.editable: + log.info(self.report_editable(spec, setup_script)) + return [] + else: + return self.build_and_install(setup_script, setup_base) + + def egg_distribution(self, egg_path): + if os.path.isdir(egg_path): + metadata = PathMetadata(egg_path, os.path.join(egg_path, + 'EGG-INFO')) + else: + metadata = EggMetadata(zipimport.zipimporter(egg_path)) + return Distribution.from_filename(egg_path, metadata=metadata) + + def install_egg(self, egg_path, tmpdir): + destination = os.path.join( + self.install_dir, + os.path.basename(egg_path), + ) + destination = os.path.abspath(destination) + if not self.dry_run: + ensure_directory(destination) + + dist = self.egg_distribution(egg_path) + if not samefile(egg_path, destination): + if os.path.isdir(destination) and not os.path.islink(destination): + dir_util.remove_tree(destination, dry_run=self.dry_run) + elif os.path.exists(destination): + self.execute( + os.unlink, + (destination,), + "Removing " + destination, + ) + try: + new_dist_is_zipped = False + if os.path.isdir(egg_path): + if egg_path.startswith(tmpdir): + f, m = shutil.move, "Moving" + else: + f, m = shutil.copytree, "Copying" + elif self.should_unzip(dist): + self.mkpath(destination) + f, m = self.unpack_and_compile, "Extracting" + else: + new_dist_is_zipped = True + if egg_path.startswith(tmpdir): + f, m = shutil.move, "Moving" + else: + f, m = shutil.copy2, "Copying" + self.execute( + f, + (egg_path, destination), + (m + " %s to %s") % ( + os.path.basename(egg_path), + os.path.dirname(destination) + ), + ) + update_dist_caches( + destination, + fix_zipimporter_caches=new_dist_is_zipped, + ) + except Exception: + update_dist_caches(destination, fix_zipimporter_caches=False) + raise + + self.add_output(destination) + return self.egg_distribution(destination) + + def install_exe(self, dist_filename, tmpdir): + # See if it's valid, get data + cfg = extract_wininst_cfg(dist_filename) + if cfg is None: + raise DistutilsError( + "%s is not a valid distutils Windows .exe" % dist_filename + ) + # Create a dummy distribution object until we build the real distro + dist = Distribution( + None, + project_name=cfg.get('metadata', 'name'), + version=cfg.get('metadata', 'version'), platform=get_platform(), + ) + + # Convert the .exe to an unpacked egg + egg_path = os.path.join(tmpdir, dist.egg_name() + '.egg') + dist.location = egg_path + egg_tmp = egg_path + '.tmp' + _egg_info = os.path.join(egg_tmp, 'EGG-INFO') + pkg_inf = os.path.join(_egg_info, 'PKG-INFO') + ensure_directory(pkg_inf) # make sure EGG-INFO dir exists + dist._provider = PathMetadata(egg_tmp, _egg_info) # XXX + self.exe_to_egg(dist_filename, egg_tmp) + + # Write EGG-INFO/PKG-INFO + if not os.path.exists(pkg_inf): + f = open(pkg_inf, 'w') + f.write('Metadata-Version: 1.0\n') + for k, v in cfg.items('metadata'): + if k != 'target_version': + f.write('%s: %s\n' % (k.replace('_', '-').title(), v)) + f.close() + script_dir = os.path.join(_egg_info, 'scripts') + # delete entry-point scripts to avoid duping + self.delete_blockers([ + os.path.join(script_dir, args[0]) + for args in ScriptWriter.get_args(dist) + ]) + # Build .egg file from tmpdir + bdist_egg.make_zipfile( + egg_path, egg_tmp, verbose=self.verbose, dry_run=self.dry_run, + ) + # install the .egg + return self.install_egg(egg_path, tmpdir) + + def exe_to_egg(self, dist_filename, egg_tmp): + """Extract a bdist_wininst to the directories an egg would use""" + # Check for .pth file and set up prefix translations + prefixes = get_exe_prefixes(dist_filename) + to_compile = [] + native_libs = [] + top_level = {} + + def process(src, dst): + s = src.lower() + for old, new in prefixes: + if s.startswith(old): + src = new + src[len(old):] + parts = src.split('/') + dst = os.path.join(egg_tmp, *parts) + dl = dst.lower() + if dl.endswith('.pyd') or dl.endswith('.dll'): + parts[-1] = bdist_egg.strip_module(parts[-1]) + top_level[os.path.splitext(parts[0])[0]] = 1 + native_libs.append(src) + elif dl.endswith('.py') and old != 'SCRIPTS/': + top_level[os.path.splitext(parts[0])[0]] = 1 + to_compile.append(dst) + return dst + if not src.endswith('.pth'): + log.warn("WARNING: can't process %s", src) + return None + + # extract, tracking .pyd/.dll->native_libs and .py -> to_compile + unpack_archive(dist_filename, egg_tmp, process) + stubs = [] + for res in native_libs: + if res.lower().endswith('.pyd'): # create stubs for .pyd's + parts = res.split('/') + resource = parts[-1] + parts[-1] = bdist_egg.strip_module(parts[-1]) + '.py' + pyfile = os.path.join(egg_tmp, *parts) + to_compile.append(pyfile) + stubs.append(pyfile) + bdist_egg.write_stub(resource, pyfile) + self.byte_compile(to_compile) # compile .py's + bdist_egg.write_safety_flag( + os.path.join(egg_tmp, 'EGG-INFO'), + bdist_egg.analyze_egg(egg_tmp, stubs)) # write zip-safety flag + + for name in 'top_level', 'native_libs': + if locals()[name]: + txt = os.path.join(egg_tmp, 'EGG-INFO', name + '.txt') + if not os.path.exists(txt): + f = open(txt, 'w') + f.write('\n'.join(locals()[name]) + '\n') + f.close() + + def install_wheel(self, wheel_path, tmpdir): + wheel = Wheel(wheel_path) + assert wheel.is_compatible() + destination = os.path.join(self.install_dir, wheel.egg_name()) + destination = os.path.abspath(destination) + if not self.dry_run: + ensure_directory(destination) + if os.path.isdir(destination) and not os.path.islink(destination): + dir_util.remove_tree(destination, dry_run=self.dry_run) + elif os.path.exists(destination): + self.execute( + os.unlink, + (destination,), + "Removing " + destination, + ) + try: + self.execute( + wheel.install_as_egg, + (destination,), + ("Installing %s to %s") % ( + os.path.basename(wheel_path), + os.path.dirname(destination) + ), + ) + finally: + update_dist_caches(destination, fix_zipimporter_caches=False) + self.add_output(destination) + return self.egg_distribution(destination) + + __mv_warning = textwrap.dedent(""" + Because this distribution was installed --multi-version, before you can + import modules from this package in an application, you will need to + 'import pkg_resources' and then use a 'require()' call similar to one of + these examples, in order to select the desired version: + + pkg_resources.require("%(name)s") # latest installed version + pkg_resources.require("%(name)s==%(version)s") # this exact version + pkg_resources.require("%(name)s>=%(version)s") # this version or higher + """).lstrip() + + __id_warning = textwrap.dedent(""" + Note also that the installation directory must be on sys.path at runtime for + this to work. (e.g. by being the application's script directory, by being on + PYTHONPATH, or by being added to sys.path by your code.) + """) + + def installation_report(self, req, dist, what="Installed"): + """Helpful installation message for display to package users""" + msg = "\n%(what)s %(eggloc)s%(extras)s" + if self.multi_version and not self.no_report: + msg += '\n' + self.__mv_warning + if self.install_dir not in map(normalize_path, sys.path): + msg += '\n' + self.__id_warning + + eggloc = dist.location + name = dist.project_name + version = dist.version + extras = '' # TODO: self.report_extras(req, dist) + return msg % locals() + + __editable_msg = textwrap.dedent(""" + Extracted editable version of %(spec)s to %(dirname)s + + If it uses setuptools in its setup script, you can activate it in + "development" mode by going to that directory and running:: + + %(python)s setup.py develop + + See the setuptools documentation for the "develop" command for more info. + """).lstrip() + + def report_editable(self, spec, setup_script): + dirname = os.path.dirname(setup_script) + python = sys.executable + return '\n' + self.__editable_msg % locals() + + def run_setup(self, setup_script, setup_base, args): + sys.modules.setdefault('distutils.command.bdist_egg', bdist_egg) + sys.modules.setdefault('distutils.command.egg_info', egg_info) + + args = list(args) + if self.verbose > 2: + v = 'v' * (self.verbose - 1) + args.insert(0, '-' + v) + elif self.verbose < 2: + args.insert(0, '-q') + if self.dry_run: + args.insert(0, '-n') + log.info( + "Running %s %s", setup_script[len(setup_base) + 1:], ' '.join(args) + ) + try: + run_setup(setup_script, args) + except SystemExit as v: + raise DistutilsError("Setup script exited with %s" % (v.args[0],)) + + def build_and_install(self, setup_script, setup_base): + args = ['bdist_egg', '--dist-dir'] + + dist_dir = tempfile.mkdtemp( + prefix='egg-dist-tmp-', dir=os.path.dirname(setup_script) + ) + try: + self._set_fetcher_options(os.path.dirname(setup_script)) + args.append(dist_dir) + + self.run_setup(setup_script, setup_base, args) + all_eggs = Environment([dist_dir]) + eggs = [] + for key in all_eggs: + for dist in all_eggs[key]: + eggs.append(self.install_egg(dist.location, setup_base)) + if not eggs and not self.dry_run: + log.warn("No eggs found in %s (setup script problem?)", + dist_dir) + return eggs + finally: + rmtree(dist_dir) + log.set_verbosity(self.verbose) # restore our log verbosity + + def _set_fetcher_options(self, base): + """ + When easy_install is about to run bdist_egg on a source dist, that + source dist might have 'setup_requires' directives, requiring + additional fetching. Ensure the fetcher options given to easy_install + are available to that command as well. + """ + # find the fetch options from easy_install and write them out + # to the setup.cfg file. + ei_opts = self.distribution.get_option_dict('easy_install').copy() + fetch_directives = ( + 'find_links', 'site_dirs', 'index_url', 'optimize', + 'site_dirs', 'allow_hosts', + ) + fetch_options = {} + for key, val in ei_opts.items(): + if key not in fetch_directives: + continue + fetch_options[key.replace('_', '-')] = val[1] + # create a settings dictionary suitable for `edit_config` + settings = dict(easy_install=fetch_options) + cfg_filename = os.path.join(base, 'setup.cfg') + setopt.edit_config(cfg_filename, settings) + + def update_pth(self, dist): + if self.pth_file is None: + return + + for d in self.pth_file[dist.key]: # drop old entries + if self.multi_version or d.location != dist.location: + log.info("Removing %s from easy-install.pth file", d) + self.pth_file.remove(d) + if d.location in self.shadow_path: + self.shadow_path.remove(d.location) + + if not self.multi_version: + if dist.location in self.pth_file.paths: + log.info( + "%s is already the active version in easy-install.pth", + dist, + ) + else: + log.info("Adding %s to easy-install.pth file", dist) + self.pth_file.add(dist) # add new entry + if dist.location not in self.shadow_path: + self.shadow_path.append(dist.location) + + if not self.dry_run: + + self.pth_file.save() + + if dist.key == 'setuptools': + # Ensure that setuptools itself never becomes unavailable! + # XXX should this check for latest version? + filename = os.path.join(self.install_dir, 'setuptools.pth') + if os.path.islink(filename): + os.unlink(filename) + f = open(filename, 'wt') + f.write(self.pth_file.make_relative(dist.location) + '\n') + f.close() + + def unpack_progress(self, src, dst): + # Progress filter for unpacking + log.debug("Unpacking %s to %s", src, dst) + return dst # only unpack-and-compile skips files for dry run + + def unpack_and_compile(self, egg_path, destination): + to_compile = [] + to_chmod = [] + + def pf(src, dst): + if dst.endswith('.py') and not src.startswith('EGG-INFO/'): + to_compile.append(dst) + elif dst.endswith('.dll') or dst.endswith('.so'): + to_chmod.append(dst) + self.unpack_progress(src, dst) + return not self.dry_run and dst or None + + unpack_archive(egg_path, destination, pf) + self.byte_compile(to_compile) + if not self.dry_run: + for f in to_chmod: + mode = ((os.stat(f)[stat.ST_MODE]) | 0o555) & 0o7755 + chmod(f, mode) + + def byte_compile(self, to_compile): + if sys.dont_write_bytecode: + return + + from distutils.util import byte_compile + + try: + # try to make the byte compile messages quieter + log.set_verbosity(self.verbose - 1) + + byte_compile(to_compile, optimize=0, force=1, dry_run=self.dry_run) + if self.optimize: + byte_compile( + to_compile, optimize=self.optimize, force=1, + dry_run=self.dry_run, + ) + finally: + log.set_verbosity(self.verbose) # restore original verbosity + + __no_default_msg = textwrap.dedent(""" + bad install directory or PYTHONPATH + + You are attempting to install a package to a directory that is not + on PYTHONPATH and which Python does not read ".pth" files from. The + installation directory you specified (via --install-dir, --prefix, or + the distutils default setting) was: + + %s + + and your PYTHONPATH environment variable currently contains: + + %r + + Here are some of your options for correcting the problem: + + * You can choose a different installation directory, i.e., one that is + on PYTHONPATH or supports .pth files + + * You can add the installation directory to the PYTHONPATH environment + variable. (It must then also be on PYTHONPATH whenever you run + Python and want to use the package(s) you are installing.) + + * You can set up the installation directory to support ".pth" files by + using one of the approaches described here: + + https://setuptools.readthedocs.io/en/latest/easy_install.html#custom-installation-locations + + + Please make the appropriate changes for your system and try again.""").lstrip() + + def no_default_version_msg(self): + template = self.__no_default_msg + return template % (self.install_dir, os.environ.get('PYTHONPATH', '')) + + def install_site_py(self): + """Make sure there's a site.py in the target dir, if needed""" + + if self.sitepy_installed: + return # already did it, or don't need to + + sitepy = os.path.join(self.install_dir, "site.py") + source = resource_string("setuptools", "site-patch.py") + source = source.decode('utf-8') + current = "" + + if os.path.exists(sitepy): + log.debug("Checking existing site.py in %s", self.install_dir) + with io.open(sitepy) as strm: + current = strm.read() + + if not current.startswith('def __boot():'): + raise DistutilsError( + "%s is not a setuptools-generated site.py; please" + " remove it." % sitepy + ) + + if current != source: + log.info("Creating %s", sitepy) + if not self.dry_run: + ensure_directory(sitepy) + with io.open(sitepy, 'w', encoding='utf-8') as strm: + strm.write(source) + self.byte_compile([sitepy]) + + self.sitepy_installed = True + + def create_home_path(self): + """Create directories under ~.""" + if not self.user: + return + home = convert_path(os.path.expanduser("~")) + for name, path in six.iteritems(self.config_vars): + if path.startswith(home) and not os.path.isdir(path): + self.debug_print("os.makedirs('%s', 0o700)" % path) + os.makedirs(path, 0o700) + + INSTALL_SCHEMES = dict( + posix=dict( + install_dir='$base/lib/python$py_version_short/site-packages', + script_dir='$base/bin', + ), + ) + + DEFAULT_SCHEME = dict( + install_dir='$base/Lib/site-packages', + script_dir='$base/Scripts', + ) + + def _expand(self, *attrs): + config_vars = self.get_finalized_command('install').config_vars + + if self.prefix: + # Set default install_dir/scripts from --prefix + config_vars = config_vars.copy() + config_vars['base'] = self.prefix + scheme = self.INSTALL_SCHEMES.get(os.name, self.DEFAULT_SCHEME) + for attr, val in scheme.items(): + if getattr(self, attr, None) is None: + setattr(self, attr, val) + + from distutils.util import subst_vars + + for attr in attrs: + val = getattr(self, attr) + if val is not None: + val = subst_vars(val, config_vars) + if os.name == 'posix': + val = os.path.expanduser(val) + setattr(self, attr, val) + + +def _pythonpath(): + items = os.environ.get('PYTHONPATH', '').split(os.pathsep) + return filter(None, items) + + +def get_site_dirs(): + """ + Return a list of 'site' dirs + """ + + sitedirs = [] + + # start with PYTHONPATH + sitedirs.extend(_pythonpath()) + + prefixes = [sys.prefix] + if sys.exec_prefix != sys.prefix: + prefixes.append(sys.exec_prefix) + for prefix in prefixes: + if prefix: + if sys.platform in ('os2emx', 'riscos'): + sitedirs.append(os.path.join(prefix, "Lib", "site-packages")) + elif os.sep == '/': + sitedirs.extend([ + os.path.join( + prefix, + "lib", + "python" + sys.version[:3], + "site-packages", + ), + os.path.join(prefix, "lib", "site-python"), + ]) + else: + sitedirs.extend([ + prefix, + os.path.join(prefix, "lib", "site-packages"), + ]) + if sys.platform == 'darwin': + # for framework builds *only* we add the standard Apple + # locations. Currently only per-user, but /Library and + # /Network/Library could be added too + if 'Python.framework' in prefix: + home = os.environ.get('HOME') + if home: + home_sp = os.path.join( + home, + 'Library', + 'Python', + sys.version[:3], + 'site-packages', + ) + sitedirs.append(home_sp) + lib_paths = get_path('purelib'), get_path('platlib') + for site_lib in lib_paths: + if site_lib not in sitedirs: + sitedirs.append(site_lib) + + if site.ENABLE_USER_SITE: + sitedirs.append(site.USER_SITE) + + try: + sitedirs.extend(site.getsitepackages()) + except AttributeError: + pass + + sitedirs = list(map(normalize_path, sitedirs)) + + return sitedirs + + +def expand_paths(inputs): + """Yield sys.path directories that might contain "old-style" packages""" + + seen = {} + + for dirname in inputs: + dirname = normalize_path(dirname) + if dirname in seen: + continue + + seen[dirname] = 1 + if not os.path.isdir(dirname): + continue + + files = os.listdir(dirname) + yield dirname, files + + for name in files: + if not name.endswith('.pth'): + # We only care about the .pth files + continue + if name in ('easy-install.pth', 'setuptools.pth'): + # Ignore .pth files that we control + continue + + # Read the .pth file + f = open(os.path.join(dirname, name)) + lines = list(yield_lines(f)) + f.close() + + # Yield existing non-dupe, non-import directory lines from it + for line in lines: + if not line.startswith("import"): + line = normalize_path(line.rstrip()) + if line not in seen: + seen[line] = 1 + if not os.path.isdir(line): + continue + yield line, os.listdir(line) + + +def extract_wininst_cfg(dist_filename): + """Extract configuration data from a bdist_wininst .exe + + Returns a configparser.RawConfigParser, or None + """ + f = open(dist_filename, 'rb') + try: + endrec = zipfile._EndRecData(f) + if endrec is None: + return None + + prepended = (endrec[9] - endrec[5]) - endrec[6] + if prepended < 12: # no wininst data here + return None + f.seek(prepended - 12) + + tag, cfglen, bmlen = struct.unpack("<iii", f.read(12)) + if tag not in (0x1234567A, 0x1234567B): + return None # not a valid tag + + f.seek(prepended - (12 + cfglen)) + init = {'version': '', 'target_version': ''} + cfg = configparser.RawConfigParser(init) + try: + part = f.read(cfglen) + # Read up to the first null byte. + config = part.split(b'\0', 1)[0] + # Now the config is in bytes, but for RawConfigParser, it should + # be text, so decode it. + config = config.decode(sys.getfilesystemencoding()) + cfg.readfp(six.StringIO(config)) + except configparser.Error: + return None + if not cfg.has_section('metadata') or not cfg.has_section('Setup'): + return None + return cfg + + finally: + f.close() + + +def get_exe_prefixes(exe_filename): + """Get exe->egg path translations for a given .exe file""" + + prefixes = [ + ('PURELIB/', ''), + ('PLATLIB/pywin32_system32', ''), + ('PLATLIB/', ''), + ('SCRIPTS/', 'EGG-INFO/scripts/'), + ('DATA/lib/site-packages', ''), + ] + z = zipfile.ZipFile(exe_filename) + try: + for info in z.infolist(): + name = info.filename + parts = name.split('/') + if len(parts) == 3 and parts[2] == 'PKG-INFO': + if parts[1].endswith('.egg-info'): + prefixes.insert(0, ('/'.join(parts[:2]), 'EGG-INFO/')) + break + if len(parts) != 2 or not name.endswith('.pth'): + continue + if name.endswith('-nspkg.pth'): + continue + if parts[0].upper() in ('PURELIB', 'PLATLIB'): + contents = z.read(name) + if six.PY3: + contents = contents.decode() + for pth in yield_lines(contents): + pth = pth.strip().replace('\\', '/') + if not pth.startswith('import'): + prefixes.append((('%s/%s/' % (parts[0], pth)), '')) + finally: + z.close() + prefixes = [(x.lower(), y) for x, y in prefixes] + prefixes.sort() + prefixes.reverse() + return prefixes + + +class PthDistributions(Environment): + """A .pth file with Distribution paths in it""" + + dirty = False + + def __init__(self, filename, sitedirs=()): + self.filename = filename + self.sitedirs = list(map(normalize_path, sitedirs)) + self.basedir = normalize_path(os.path.dirname(self.filename)) + self._load() + Environment.__init__(self, [], None, None) + for path in yield_lines(self.paths): + list(map(self.add, find_distributions(path, True))) + + def _load(self): + self.paths = [] + saw_import = False + seen = dict.fromkeys(self.sitedirs) + if os.path.isfile(self.filename): + f = open(self.filename, 'rt') + for line in f: + if line.startswith('import'): + saw_import = True + continue + path = line.rstrip() + self.paths.append(path) + if not path.strip() or path.strip().startswith('#'): + continue + # skip non-existent paths, in case somebody deleted a package + # manually, and duplicate paths as well + path = self.paths[-1] = normalize_path( + os.path.join(self.basedir, path) + ) + if not os.path.exists(path) or path in seen: + self.paths.pop() # skip it + self.dirty = True # we cleaned up, so we're dirty now :) + continue + seen[path] = 1 + f.close() + + if self.paths and not saw_import: + self.dirty = True # ensure anything we touch has import wrappers + while self.paths and not self.paths[-1].strip(): + self.paths.pop() + + def save(self): + """Write changed .pth file back to disk""" + if not self.dirty: + return + + rel_paths = list(map(self.make_relative, self.paths)) + if rel_paths: + log.debug("Saving %s", self.filename) + lines = self._wrap_lines(rel_paths) + data = '\n'.join(lines) + '\n' + + if os.path.islink(self.filename): + os.unlink(self.filename) + with open(self.filename, 'wt') as f: + f.write(data) + + elif os.path.exists(self.filename): + log.debug("Deleting empty %s", self.filename) + os.unlink(self.filename) + + self.dirty = False + + @staticmethod + def _wrap_lines(lines): + return lines + + def add(self, dist): + """Add `dist` to the distribution map""" + new_path = ( + dist.location not in self.paths and ( + dist.location not in self.sitedirs or + # account for '.' being in PYTHONPATH + dist.location == os.getcwd() + ) + ) + if new_path: + self.paths.append(dist.location) + self.dirty = True + Environment.add(self, dist) + + def remove(self, dist): + """Remove `dist` from the distribution map""" + while dist.location in self.paths: + self.paths.remove(dist.location) + self.dirty = True + Environment.remove(self, dist) + + def make_relative(self, path): + npath, last = os.path.split(normalize_path(path)) + baselen = len(self.basedir) + parts = [last] + sep = os.altsep == '/' and '/' or os.sep + while len(npath) >= baselen: + if npath == self.basedir: + parts.append(os.curdir) + parts.reverse() + return sep.join(parts) + npath, last = os.path.split(npath) + parts.append(last) + else: + return path + + +class RewritePthDistributions(PthDistributions): + @classmethod + def _wrap_lines(cls, lines): + yield cls.prelude + for line in lines: + yield line + yield cls.postlude + + prelude = _one_liner(""" + import sys + sys.__plen = len(sys.path) + """) + postlude = _one_liner(""" + import sys + new = sys.path[sys.__plen:] + del sys.path[sys.__plen:] + p = getattr(sys, '__egginsert', 0) + sys.path[p:p] = new + sys.__egginsert = p + len(new) + """) + + +if os.environ.get('SETUPTOOLS_SYS_PATH_TECHNIQUE', 'raw') == 'rewrite': + PthDistributions = RewritePthDistributions + + +def _first_line_re(): + """ + Return a regular expression based on first_line_re suitable for matching + strings. + """ + if isinstance(first_line_re.pattern, str): + return first_line_re + + # first_line_re in Python >=3.1.4 and >=3.2.1 is a bytes pattern. + return re.compile(first_line_re.pattern.decode()) + + +def auto_chmod(func, arg, exc): + if func in [os.unlink, os.remove] and os.name == 'nt': + chmod(arg, stat.S_IWRITE) + return func(arg) + et, ev, _ = sys.exc_info() + six.reraise(et, (ev[0], ev[1] + (" %s %s" % (func, arg)))) + + +def update_dist_caches(dist_path, fix_zipimporter_caches): + """ + Fix any globally cached `dist_path` related data + + `dist_path` should be a path of a newly installed egg distribution (zipped + or unzipped). + + sys.path_importer_cache contains finder objects that have been cached when + importing data from the original distribution. Any such finders need to be + cleared since the replacement distribution might be packaged differently, + e.g. a zipped egg distribution might get replaced with an unzipped egg + folder or vice versa. Having the old finders cached may then cause Python + to attempt loading modules from the replacement distribution using an + incorrect loader. + + zipimport.zipimporter objects are Python loaders charged with importing + data packaged inside zip archives. If stale loaders referencing the + original distribution, are left behind, they can fail to load modules from + the replacement distribution. E.g. if an old zipimport.zipimporter instance + is used to load data from a new zipped egg archive, it may cause the + operation to attempt to locate the requested data in the wrong location - + one indicated by the original distribution's zip archive directory + information. Such an operation may then fail outright, e.g. report having + read a 'bad local file header', or even worse, it may fail silently & + return invalid data. + + zipimport._zip_directory_cache contains cached zip archive directory + information for all existing zipimport.zipimporter instances and all such + instances connected to the same archive share the same cached directory + information. + + If asked, and the underlying Python implementation allows it, we can fix + all existing zipimport.zipimporter instances instead of having to track + them down and remove them one by one, by updating their shared cached zip + archive directory information. This, of course, assumes that the + replacement distribution is packaged as a zipped egg. + + If not asked to fix existing zipimport.zipimporter instances, we still do + our best to clear any remaining zipimport.zipimporter related cached data + that might somehow later get used when attempting to load data from the new + distribution and thus cause such load operations to fail. Note that when + tracking down such remaining stale data, we can not catch every conceivable + usage from here, and we clear only those that we know of and have found to + cause problems if left alive. Any remaining caches should be updated by + whomever is in charge of maintaining them, i.e. they should be ready to + handle us replacing their zip archives with new distributions at runtime. + + """ + # There are several other known sources of stale zipimport.zipimporter + # instances that we do not clear here, but might if ever given a reason to + # do so: + # * Global setuptools pkg_resources.working_set (a.k.a. 'master working + # set') may contain distributions which may in turn contain their + # zipimport.zipimporter loaders. + # * Several zipimport.zipimporter loaders held by local variables further + # up the function call stack when running the setuptools installation. + # * Already loaded modules may have their __loader__ attribute set to the + # exact loader instance used when importing them. Python 3.4 docs state + # that this information is intended mostly for introspection and so is + # not expected to cause us problems. + normalized_path = normalize_path(dist_path) + _uncache(normalized_path, sys.path_importer_cache) + if fix_zipimporter_caches: + _replace_zip_directory_cache_data(normalized_path) + else: + # Here, even though we do not want to fix existing and now stale + # zipimporter cache information, we still want to remove it. Related to + # Python's zip archive directory information cache, we clear each of + # its stale entries in two phases: + # 1. Clear the entry so attempting to access zip archive information + # via any existing stale zipimport.zipimporter instances fails. + # 2. Remove the entry from the cache so any newly constructed + # zipimport.zipimporter instances do not end up using old stale + # zip archive directory information. + # This whole stale data removal step does not seem strictly necessary, + # but has been left in because it was done before we started replacing + # the zip archive directory information cache content if possible, and + # there are no relevant unit tests that we can depend on to tell us if + # this is really needed. + _remove_and_clear_zip_directory_cache_data(normalized_path) + + +def _collect_zipimporter_cache_entries(normalized_path, cache): + """ + Return zipimporter cache entry keys related to a given normalized path. + + Alternative path spellings (e.g. those using different character case or + those using alternative path separators) related to the same path are + included. Any sub-path entries are included as well, i.e. those + corresponding to zip archives embedded in other zip archives. + + """ + result = [] + prefix_len = len(normalized_path) + for p in cache: + np = normalize_path(p) + if (np.startswith(normalized_path) and + np[prefix_len:prefix_len + 1] in (os.sep, '')): + result.append(p) + return result + + +def _update_zipimporter_cache(normalized_path, cache, updater=None): + """ + Update zipimporter cache data for a given normalized path. + + Any sub-path entries are processed as well, i.e. those corresponding to zip + archives embedded in other zip archives. + + Given updater is a callable taking a cache entry key and the original entry + (after already removing the entry from the cache), and expected to update + the entry and possibly return a new one to be inserted in its place. + Returning None indicates that the entry should not be replaced with a new + one. If no updater is given, the cache entries are simply removed without + any additional processing, the same as if the updater simply returned None. + + """ + for p in _collect_zipimporter_cache_entries(normalized_path, cache): + # N.B. pypy's custom zipimport._zip_directory_cache implementation does + # not support the complete dict interface: + # * Does not support item assignment, thus not allowing this function + # to be used only for removing existing cache entries. + # * Does not support the dict.pop() method, forcing us to use the + # get/del patterns instead. For more detailed information see the + # following links: + # https://github.com/pypa/setuptools/issues/202#issuecomment-202913420 + # http://bit.ly/2h9itJX + old_entry = cache[p] + del cache[p] + new_entry = updater and updater(p, old_entry) + if new_entry is not None: + cache[p] = new_entry + + +def _uncache(normalized_path, cache): + _update_zipimporter_cache(normalized_path, cache) + + +def _remove_and_clear_zip_directory_cache_data(normalized_path): + def clear_and_remove_cached_zip_archive_directory_data(path, old_entry): + old_entry.clear() + + _update_zipimporter_cache( + normalized_path, zipimport._zip_directory_cache, + updater=clear_and_remove_cached_zip_archive_directory_data) + + +# PyPy Python implementation does not allow directly writing to the +# zipimport._zip_directory_cache and so prevents us from attempting to correct +# its content. The best we can do there is clear the problematic cache content +# and have PyPy repopulate it as needed. The downside is that if there are any +# stale zipimport.zipimporter instances laying around, attempting to use them +# will fail due to not having its zip archive directory information available +# instead of being automatically corrected to use the new correct zip archive +# directory information. +if '__pypy__' in sys.builtin_module_names: + _replace_zip_directory_cache_data = \ + _remove_and_clear_zip_directory_cache_data +else: + + def _replace_zip_directory_cache_data(normalized_path): + def replace_cached_zip_archive_directory_data(path, old_entry): + # N.B. In theory, we could load the zip directory information just + # once for all updated path spellings, and then copy it locally and + # update its contained path strings to contain the correct + # spelling, but that seems like a way too invasive move (this cache + # structure is not officially documented anywhere and could in + # theory change with new Python releases) for no significant + # benefit. + old_entry.clear() + zipimport.zipimporter(path) + old_entry.update(zipimport._zip_directory_cache[path]) + return old_entry + + _update_zipimporter_cache( + normalized_path, zipimport._zip_directory_cache, + updater=replace_cached_zip_archive_directory_data) + + +def is_python(text, filename='<string>'): + "Is this string a valid Python script?" + try: + compile(text, filename, 'exec') + except (SyntaxError, TypeError): + return False + else: + return True + + +def is_sh(executable): + """Determine if the specified executable is a .sh (contains a #! line)""" + try: + with io.open(executable, encoding='latin-1') as fp: + magic = fp.read(2) + except (OSError, IOError): + return executable + return magic == '#!' + + +def nt_quote_arg(arg): + """Quote a command line argument according to Windows parsing rules""" + return subprocess.list2cmdline([arg]) + + +def is_python_script(script_text, filename): + """Is this text, as a whole, a Python script? (as opposed to shell/bat/etc. + """ + if filename.endswith('.py') or filename.endswith('.pyw'): + return True # extension says it's Python + if is_python(script_text, filename): + return True # it's syntactically valid Python + if script_text.startswith('#!'): + # It begins with a '#!' line, so check if 'python' is in it somewhere + return 'python' in script_text.splitlines()[0].lower() + + return False # Not any Python I can recognize + + +try: + from os import chmod as _chmod +except ImportError: + # Jython compatibility + def _chmod(*args): + pass + + +def chmod(path, mode): + log.debug("changing mode of %s to %o", path, mode) + try: + _chmod(path, mode) + except os.error as e: + log.debug("chmod failed: %s", e) + + +class CommandSpec(list): + """ + A command spec for a #! header, specified as a list of arguments akin to + those passed to Popen. + """ + + options = [] + split_args = dict() + + @classmethod + def best(cls): + """ + Choose the best CommandSpec class based on environmental conditions. + """ + return cls + + @classmethod + def _sys_executable(cls): + _default = os.path.normpath(sys.executable) + return os.environ.get('__PYVENV_LAUNCHER__', _default) + + @classmethod + def from_param(cls, param): + """ + Construct a CommandSpec from a parameter to build_scripts, which may + be None. + """ + if isinstance(param, cls): + return param + if isinstance(param, list): + return cls(param) + if param is None: + return cls.from_environment() + # otherwise, assume it's a string. + return cls.from_string(param) + + @classmethod + def from_environment(cls): + return cls([cls._sys_executable()]) + + @classmethod + def from_string(cls, string): + """ + Construct a command spec from a simple string representing a command + line parseable by shlex.split. + """ + items = shlex.split(string, **cls.split_args) + return cls(items) + + def install_options(self, script_text): + self.options = shlex.split(self._extract_options(script_text)) + cmdline = subprocess.list2cmdline(self) + if not isascii(cmdline): + self.options[:0] = ['-x'] + + @staticmethod + def _extract_options(orig_script): + """ + Extract any options from the first line of the script. + """ + first = (orig_script + '\n').splitlines()[0] + match = _first_line_re().match(first) + options = match.group(1) or '' if match else '' + return options.strip() + + def as_header(self): + return self._render(self + list(self.options)) + + @staticmethod + def _strip_quotes(item): + _QUOTES = '"\'' + for q in _QUOTES: + if item.startswith(q) and item.endswith(q): + return item[1:-1] + return item + + @staticmethod + def _render(items): + cmdline = subprocess.list2cmdline( + CommandSpec._strip_quotes(item.strip()) for item in items) + return '#!' + cmdline + '\n' + + +# For pbr compat; will be removed in a future version. +sys_executable = CommandSpec._sys_executable() + + +class WindowsCommandSpec(CommandSpec): + split_args = dict(posix=False) + + +class ScriptWriter: + """ + Encapsulates behavior around writing entry point scripts for console and + gui apps. + """ + + template = textwrap.dedent(r""" + # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r + __requires__ = %(spec)r + import re + import sys + from pkg_resources import load_entry_point + + if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit( + load_entry_point(%(spec)r, %(group)r, %(name)r)() + ) + """).lstrip() + + command_spec_class = CommandSpec + + @classmethod + def get_script_args(cls, dist, executable=None, wininst=False): + # for backward compatibility + warnings.warn("Use get_args", EasyInstallDeprecationWarning) + writer = (WindowsScriptWriter if wininst else ScriptWriter).best() + header = cls.get_script_header("", executable, wininst) + return writer.get_args(dist, header) + + @classmethod + def get_script_header(cls, script_text, executable=None, wininst=False): + # for backward compatibility + warnings.warn("Use get_header", EasyInstallDeprecationWarning, stacklevel=2) + if wininst: + executable = "python.exe" + return cls.get_header(script_text, executable) + + @classmethod + def get_args(cls, dist, header=None): + """ + Yield write_script() argument tuples for a distribution's + console_scripts and gui_scripts entry points. + """ + if header is None: + header = cls.get_header() + spec = str(dist.as_requirement()) + for type_ in 'console', 'gui': + group = type_ + '_scripts' + for name, ep in dist.get_entry_map(group).items(): + cls._ensure_safe_name(name) + script_text = cls.template % locals() + args = cls._get_script_args(type_, name, header, script_text) + for res in args: + yield res + + @staticmethod + def _ensure_safe_name(name): + """ + Prevent paths in *_scripts entry point names. + """ + has_path_sep = re.search(r'[\\/]', name) + if has_path_sep: + raise ValueError("Path separators not allowed in script names") + + @classmethod + def get_writer(cls, force_windows): + # for backward compatibility + warnings.warn("Use best", EasyInstallDeprecationWarning) + return WindowsScriptWriter.best() if force_windows else cls.best() + + @classmethod + def best(cls): + """ + Select the best ScriptWriter for this environment. + """ + if sys.platform == 'win32' or (os.name == 'java' and os._name == 'nt'): + return WindowsScriptWriter.best() + else: + return cls + + @classmethod + def _get_script_args(cls, type_, name, header, script_text): + # Simply write the stub with no extension. + yield (name, header + script_text) + + @classmethod + def get_header(cls, script_text="", executable=None): + """Create a #! line, getting options (if any) from script_text""" + cmd = cls.command_spec_class.best().from_param(executable) + cmd.install_options(script_text) + return cmd.as_header() + + +class WindowsScriptWriter(ScriptWriter): + command_spec_class = WindowsCommandSpec + + @classmethod + def get_writer(cls): + # for backward compatibility + warnings.warn("Use best", EasyInstallDeprecationWarning) + return cls.best() + + @classmethod + def best(cls): + """ + Select the best ScriptWriter suitable for Windows + """ + writer_lookup = dict( + executable=WindowsExecutableLauncherWriter, + natural=cls, + ) + # for compatibility, use the executable launcher by default + launcher = os.environ.get('SETUPTOOLS_LAUNCHER', 'executable') + return writer_lookup[launcher] + + @classmethod + def _get_script_args(cls, type_, name, header, script_text): + "For Windows, add a .py extension" + ext = dict(console='.pya', gui='.pyw')[type_] + if ext not in os.environ['PATHEXT'].lower().split(';'): + msg = ( + "{ext} not listed in PATHEXT; scripts will not be " + "recognized as executables." + ).format(**locals()) + warnings.warn(msg, UserWarning) + old = ['.pya', '.py', '-script.py', '.pyc', '.pyo', '.pyw', '.exe'] + old.remove(ext) + header = cls._adjust_header(type_, header) + blockers = [name + x for x in old] + yield name + ext, header + script_text, 't', blockers + + @classmethod + def _adjust_header(cls, type_, orig_header): + """ + Make sure 'pythonw' is used for gui and and 'python' is used for + console (regardless of what sys.executable is). + """ + pattern = 'pythonw.exe' + repl = 'python.exe' + if type_ == 'gui': + pattern, repl = repl, pattern + pattern_ob = re.compile(re.escape(pattern), re.IGNORECASE) + new_header = pattern_ob.sub(string=orig_header, repl=repl) + return new_header if cls._use_header(new_header) else orig_header + + @staticmethod + def _use_header(new_header): + """ + Should _adjust_header use the replaced header? + + On non-windows systems, always use. On + Windows systems, only use the replaced header if it resolves + to an executable on the system. + """ + clean_header = new_header[2:-1].strip('"') + return sys.platform != 'win32' or find_executable(clean_header) + + +class WindowsExecutableLauncherWriter(WindowsScriptWriter): + @classmethod + def _get_script_args(cls, type_, name, header, script_text): + """ + For Windows, add a .py extension and an .exe launcher + """ + if type_ == 'gui': + launcher_type = 'gui' + ext = '-script.pyw' + old = ['.pyw'] + else: + launcher_type = 'cli' + ext = '-script.py' + old = ['.py', '.pyc', '.pyo'] + hdr = cls._adjust_header(type_, header) + blockers = [name + x for x in old] + yield (name + ext, hdr + script_text, 't', blockers) + yield ( + name + '.exe', get_win_launcher(launcher_type), + 'b' # write in binary mode + ) + if not is_64bit(): + # install a manifest for the launcher to prevent Windows + # from detecting it as an installer (which it will for + # launchers like easy_install.exe). Consider only + # adding a manifest for launchers detected as installers. + # See Distribute #143 for details. + m_name = name + '.exe.manifest' + yield (m_name, load_launcher_manifest(name), 't') + + +# for backward-compatibility +get_script_args = ScriptWriter.get_script_args +get_script_header = ScriptWriter.get_script_header + + +def get_win_launcher(type): + """ + Load the Windows launcher (executable) suitable for launching a script. + + `type` should be either 'cli' or 'gui' + + Returns the executable as a byte string. + """ + launcher_fn = '%s.exe' % type + if is_64bit(): + launcher_fn = launcher_fn.replace(".", "-64.") + else: + launcher_fn = launcher_fn.replace(".", "-32.") + return resource_string('setuptools', launcher_fn) + + +def load_launcher_manifest(name): + manifest = pkg_resources.resource_string(__name__, 'launcher manifest.xml') + if six.PY2: + return manifest % vars() + else: + return manifest.decode('utf-8') % vars() + + +def rmtree(path, ignore_errors=False, onerror=auto_chmod): + return shutil.rmtree(path, ignore_errors, onerror) + + +def current_umask(): + tmp = os.umask(0o022) + os.umask(tmp) + return tmp + + +def bootstrap(): + # This function is called when setuptools*.egg is run using /bin/sh + import setuptools + + argv0 = os.path.dirname(setuptools.__path__[0]) + sys.argv[0] = argv0 + sys.argv.append(argv0) + main() + + +def main(argv=None, **kw): + from setuptools import setup + from setuptools.dist import Distribution + + class DistributionWithoutHelpCommands(Distribution): + common_usage = "" + + def _show_help(self, *args, **kw): + with _patch_usage(): + Distribution._show_help(self, *args, **kw) + + if argv is None: + argv = sys.argv[1:] + + with _patch_usage(): + setup( + script_args=['-q', 'easy_install', '-v'] + argv, + script_name=sys.argv[0] or 'easy_install', + distclass=DistributionWithoutHelpCommands, + **kw + ) + + +@contextlib.contextmanager +def _patch_usage(): + import distutils.core + USAGE = textwrap.dedent(""" + usage: %(script)s [options] requirement_or_url ... + or: %(script)s --help + """).lstrip() + + def gen_usage(script_name): + return USAGE % dict( + script=os.path.basename(script_name), + ) + + saved = distutils.core.gen_usage + distutils.core.gen_usage = gen_usage + try: + yield + finally: + distutils.core.gen_usage = saved + +class EasyInstallDeprecationWarning(SetuptoolsDeprecationWarning): + """Class for warning about deprecations in EasyInstall in SetupTools. Not ignored by default, unlike DeprecationWarning.""" + diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/egg_info.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/egg_info.py new file mode 100644 index 0000000..5d8f451 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/egg_info.py @@ -0,0 +1,717 @@ +"""setuptools.command.egg_info + +Create a distribution's .egg-info directory and contents""" + +from distutils.filelist import FileList as _FileList +from distutils.errors import DistutilsInternalError +from distutils.util import convert_path +from distutils import log +import distutils.errors +import distutils.filelist +import os +import re +import sys +import io +import warnings +import time +import collections + +from setuptools.extern import six +from setuptools.extern.six.moves import map + +from setuptools import Command +from setuptools.command.sdist import sdist +from setuptools.command.sdist import walk_revctrl +from setuptools.command.setopt import edit_config +from setuptools.command import bdist_egg +from pkg_resources import ( + parse_requirements, safe_name, parse_version, + safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename) +import setuptools.unicode_utils as unicode_utils +from setuptools.glob import glob + +from setuptools.extern import packaging +from setuptools import SetuptoolsDeprecationWarning + +def translate_pattern(glob): + """ + Translate a file path glob like '*.txt' in to a regular expression. + This differs from fnmatch.translate which allows wildcards to match + directory separators. It also knows about '**/' which matches any number of + directories. + """ + pat = '' + + # This will split on '/' within [character classes]. This is deliberate. + chunks = glob.split(os.path.sep) + + sep = re.escape(os.sep) + valid_char = '[^%s]' % (sep,) + + for c, chunk in enumerate(chunks): + last_chunk = c == len(chunks) - 1 + + # Chunks that are a literal ** are globstars. They match anything. + if chunk == '**': + if last_chunk: + # Match anything if this is the last component + pat += '.*' + else: + # Match '(name/)*' + pat += '(?:%s+%s)*' % (valid_char, sep) + continue # Break here as the whole path component has been handled + + # Find any special characters in the remainder + i = 0 + chunk_len = len(chunk) + while i < chunk_len: + char = chunk[i] + if char == '*': + # Match any number of name characters + pat += valid_char + '*' + elif char == '?': + # Match a name character + pat += valid_char + elif char == '[': + # Character class + inner_i = i + 1 + # Skip initial !/] chars + if inner_i < chunk_len and chunk[inner_i] == '!': + inner_i = inner_i + 1 + if inner_i < chunk_len and chunk[inner_i] == ']': + inner_i = inner_i + 1 + + # Loop till the closing ] is found + while inner_i < chunk_len and chunk[inner_i] != ']': + inner_i = inner_i + 1 + + if inner_i >= chunk_len: + # Got to the end of the string without finding a closing ] + # Do not treat this as a matching group, but as a literal [ + pat += re.escape(char) + else: + # Grab the insides of the [brackets] + inner = chunk[i + 1:inner_i] + char_class = '' + + # Class negation + if inner[0] == '!': + char_class = '^' + inner = inner[1:] + + char_class += re.escape(inner) + pat += '[%s]' % (char_class,) + + # Skip to the end ] + i = inner_i + else: + pat += re.escape(char) + i += 1 + + # Join each chunk with the dir separator + if not last_chunk: + pat += sep + + pat += r'\Z' + return re.compile(pat, flags=re.MULTILINE|re.DOTALL) + + +class InfoCommon: + tag_build = None + tag_date = None + + @property + def name(self): + return safe_name(self.distribution.get_name()) + + def tagged_version(self): + version = self.distribution.get_version() + # egg_info may be called more than once for a distribution, + # in which case the version string already contains all tags. + if self.vtags and version.endswith(self.vtags): + return safe_version(version) + return safe_version(version + self.vtags) + + def tags(self): + version = '' + if self.tag_build: + version += self.tag_build + if self.tag_date: + version += time.strftime("-%Y%m%d") + return version + vtags = property(tags) + + +class egg_info(InfoCommon, Command): + description = "create a distribution's .egg-info directory" + + user_options = [ + ('egg-base=', 'e', "directory containing .egg-info directories" + " (default: top of the source tree)"), + ('tag-date', 'd', "Add date stamp (e.g. 20050528) to version number"), + ('tag-build=', 'b', "Specify explicit tag to add to version number"), + ('no-date', 'D', "Don't include date stamp [default]"), + ] + + boolean_options = ['tag-date'] + negative_opt = { + 'no-date': 'tag-date', + } + + def initialize_options(self): + self.egg_base = None + self.egg_name = None + self.egg_info = None + self.egg_version = None + self.broken_egg_info = False + + #################################### + # allow the 'tag_svn_revision' to be detected and + # set, supporting sdists built on older Setuptools. + @property + def tag_svn_revision(self): + pass + + @tag_svn_revision.setter + def tag_svn_revision(self, value): + pass + #################################### + + def save_version_info(self, filename): + """ + Materialize the value of date into the + build tag. Install build keys in a deterministic order + to avoid arbitrary reordering on subsequent builds. + """ + egg_info = collections.OrderedDict() + # follow the order these keys would have been added + # when PYTHONHASHSEED=0 + egg_info['tag_build'] = self.tags() + egg_info['tag_date'] = 0 + edit_config(filename, dict(egg_info=egg_info)) + + def finalize_options(self): + # Note: we need to capture the current value returned + # by `self.tagged_version()`, so we can later update + # `self.distribution.metadata.version` without + # repercussions. + self.egg_name = self.name + self.egg_version = self.tagged_version() + parsed_version = parse_version(self.egg_version) + + try: + is_version = isinstance(parsed_version, packaging.version.Version) + spec = ( + "%s==%s" if is_version else "%s===%s" + ) + list( + parse_requirements(spec % (self.egg_name, self.egg_version)) + ) + except ValueError: + raise distutils.errors.DistutilsOptionError( + "Invalid distribution name or version syntax: %s-%s" % + (self.egg_name, self.egg_version) + ) + + if self.egg_base is None: + dirs = self.distribution.package_dir + self.egg_base = (dirs or {}).get('', os.curdir) + + self.ensure_dirname('egg_base') + self.egg_info = to_filename(self.egg_name) + '.egg-info' + if self.egg_base != os.curdir: + self.egg_info = os.path.join(self.egg_base, self.egg_info) + if '-' in self.egg_name: + self.check_broken_egg_info() + + # Set package version for the benefit of dumber commands + # (e.g. sdist, bdist_wininst, etc.) + # + self.distribution.metadata.version = self.egg_version + + # If we bootstrapped around the lack of a PKG-INFO, as might be the + # case in a fresh checkout, make sure that any special tags get added + # to the version info + # + pd = self.distribution._patched_dist + if pd is not None and pd.key == self.egg_name.lower(): + pd._version = self.egg_version + pd._parsed_version = parse_version(self.egg_version) + self.distribution._patched_dist = None + + def write_or_delete_file(self, what, filename, data, force=False): + """Write `data` to `filename` or delete if empty + + If `data` is non-empty, this routine is the same as ``write_file()``. + If `data` is empty but not ``None``, this is the same as calling + ``delete_file(filename)`. If `data` is ``None``, then this is a no-op + unless `filename` exists, in which case a warning is issued about the + orphaned file (if `force` is false), or deleted (if `force` is true). + """ + if data: + self.write_file(what, filename, data) + elif os.path.exists(filename): + if data is None and not force: + log.warn( + "%s not set in setup(), but %s exists", what, filename + ) + return + else: + self.delete_file(filename) + + def write_file(self, what, filename, data): + """Write `data` to `filename` (if not a dry run) after announcing it + + `what` is used in a log message to identify what is being written + to the file. + """ + log.info("writing %s to %s", what, filename) + if six.PY3: + data = data.encode("utf-8") + if not self.dry_run: + f = open(filename, 'wb') + f.write(data) + f.close() + + def delete_file(self, filename): + """Delete `filename` (if not a dry run) after announcing it""" + log.info("deleting %s", filename) + if not self.dry_run: + os.unlink(filename) + + def run(self): + self.mkpath(self.egg_info) + os.utime(self.egg_info, None) + installer = self.distribution.fetch_build_egg + for ep in iter_entry_points('egg_info.writers'): + ep.require(installer=installer) + writer = ep.resolve() + writer(self, ep.name, os.path.join(self.egg_info, ep.name)) + + # Get rid of native_libs.txt if it was put there by older bdist_egg + nl = os.path.join(self.egg_info, "native_libs.txt") + if os.path.exists(nl): + self.delete_file(nl) + + self.find_sources() + + def find_sources(self): + """Generate SOURCES.txt manifest file""" + manifest_filename = os.path.join(self.egg_info, "SOURCES.txt") + mm = manifest_maker(self.distribution) + mm.manifest = manifest_filename + mm.run() + self.filelist = mm.filelist + + def check_broken_egg_info(self): + bei = self.egg_name + '.egg-info' + if self.egg_base != os.curdir: + bei = os.path.join(self.egg_base, bei) + if os.path.exists(bei): + log.warn( + "-" * 78 + '\n' + "Note: Your current .egg-info directory has a '-' in its name;" + '\nthis will not work correctly with "setup.py develop".\n\n' + 'Please rename %s to %s to correct this problem.\n' + '-' * 78, + bei, self.egg_info + ) + self.broken_egg_info = self.egg_info + self.egg_info = bei # make it work for now + + +class FileList(_FileList): + # Implementations of the various MANIFEST.in commands + + def process_template_line(self, line): + # Parse the line: split it up, make sure the right number of words + # is there, and return the relevant words. 'action' is always + # defined: it's the first word of the line. Which of the other + # three are defined depends on the action; it'll be either + # patterns, (dir and patterns), or (dir_pattern). + (action, patterns, dir, dir_pattern) = self._parse_template_line(line) + + # OK, now we know that the action is valid and we have the + # right number of words on the line for that action -- so we + # can proceed with minimal error-checking. + if action == 'include': + self.debug_print("include " + ' '.join(patterns)) + for pattern in patterns: + if not self.include(pattern): + log.warn("warning: no files found matching '%s'", pattern) + + elif action == 'exclude': + self.debug_print("exclude " + ' '.join(patterns)) + for pattern in patterns: + if not self.exclude(pattern): + log.warn(("warning: no previously-included files " + "found matching '%s'"), pattern) + + elif action == 'global-include': + self.debug_print("global-include " + ' '.join(patterns)) + for pattern in patterns: + if not self.global_include(pattern): + log.warn(("warning: no files found matching '%s' " + "anywhere in distribution"), pattern) + + elif action == 'global-exclude': + self.debug_print("global-exclude " + ' '.join(patterns)) + for pattern in patterns: + if not self.global_exclude(pattern): + log.warn(("warning: no previously-included files matching " + "'%s' found anywhere in distribution"), + pattern) + + elif action == 'recursive-include': + self.debug_print("recursive-include %s %s" % + (dir, ' '.join(patterns))) + for pattern in patterns: + if not self.recursive_include(dir, pattern): + log.warn(("warning: no files found matching '%s' " + "under directory '%s'"), + pattern, dir) + + elif action == 'recursive-exclude': + self.debug_print("recursive-exclude %s %s" % + (dir, ' '.join(patterns))) + for pattern in patterns: + if not self.recursive_exclude(dir, pattern): + log.warn(("warning: no previously-included files matching " + "'%s' found under directory '%s'"), + pattern, dir) + + elif action == 'graft': + self.debug_print("graft " + dir_pattern) + if not self.graft(dir_pattern): + log.warn("warning: no directories found matching '%s'", + dir_pattern) + + elif action == 'prune': + self.debug_print("prune " + dir_pattern) + if not self.prune(dir_pattern): + log.warn(("no previously-included directories found " + "matching '%s'"), dir_pattern) + + else: + raise DistutilsInternalError( + "this cannot happen: invalid action '%s'" % action) + + def _remove_files(self, predicate): + """ + Remove all files from the file list that match the predicate. + Return True if any matching files were removed + """ + found = False + for i in range(len(self.files) - 1, -1, -1): + if predicate(self.files[i]): + self.debug_print(" removing " + self.files[i]) + del self.files[i] + found = True + return found + + def include(self, pattern): + """Include files that match 'pattern'.""" + found = [f for f in glob(pattern) if not os.path.isdir(f)] + self.extend(found) + return bool(found) + + def exclude(self, pattern): + """Exclude files that match 'pattern'.""" + match = translate_pattern(pattern) + return self._remove_files(match.match) + + def recursive_include(self, dir, pattern): + """ + Include all files anywhere in 'dir/' that match the pattern. + """ + full_pattern = os.path.join(dir, '**', pattern) + found = [f for f in glob(full_pattern, recursive=True) + if not os.path.isdir(f)] + self.extend(found) + return bool(found) + + def recursive_exclude(self, dir, pattern): + """ + Exclude any file anywhere in 'dir/' that match the pattern. + """ + match = translate_pattern(os.path.join(dir, '**', pattern)) + return self._remove_files(match.match) + + def graft(self, dir): + """Include all files from 'dir/'.""" + found = [ + item + for match_dir in glob(dir) + for item in distutils.filelist.findall(match_dir) + ] + self.extend(found) + return bool(found) + + def prune(self, dir): + """Filter out files from 'dir/'.""" + match = translate_pattern(os.path.join(dir, '**')) + return self._remove_files(match.match) + + def global_include(self, pattern): + """ + Include all files anywhere in the current directory that match the + pattern. This is very inefficient on large file trees. + """ + if self.allfiles is None: + self.findall() + match = translate_pattern(os.path.join('**', pattern)) + found = [f for f in self.allfiles if match.match(f)] + self.extend(found) + return bool(found) + + def global_exclude(self, pattern): + """ + Exclude all files anywhere that match the pattern. + """ + match = translate_pattern(os.path.join('**', pattern)) + return self._remove_files(match.match) + + def append(self, item): + if item.endswith('\r'): # Fix older sdists built on Windows + item = item[:-1] + path = convert_path(item) + + if self._safe_path(path): + self.files.append(path) + + def extend(self, paths): + self.files.extend(filter(self._safe_path, paths)) + + def _repair(self): + """ + Replace self.files with only safe paths + + Because some owners of FileList manipulate the underlying + ``files`` attribute directly, this method must be called to + repair those paths. + """ + self.files = list(filter(self._safe_path, self.files)) + + def _safe_path(self, path): + enc_warn = "'%s' not %s encodable -- skipping" + + # To avoid accidental trans-codings errors, first to unicode + u_path = unicode_utils.filesys_decode(path) + if u_path is None: + log.warn("'%s' in unexpected encoding -- skipping" % path) + return False + + # Must ensure utf-8 encodability + utf8_path = unicode_utils.try_encode(u_path, "utf-8") + if utf8_path is None: + log.warn(enc_warn, path, 'utf-8') + return False + + try: + # accept is either way checks out + if os.path.exists(u_path) or os.path.exists(utf8_path): + return True + # this will catch any encode errors decoding u_path + except UnicodeEncodeError: + log.warn(enc_warn, path, sys.getfilesystemencoding()) + + +class manifest_maker(sdist): + template = "MANIFEST.in" + + def initialize_options(self): + self.use_defaults = 1 + self.prune = 1 + self.manifest_only = 1 + self.force_manifest = 1 + + def finalize_options(self): + pass + + def run(self): + self.filelist = FileList() + if not os.path.exists(self.manifest): + self.write_manifest() # it must exist so it'll get in the list + self.add_defaults() + if os.path.exists(self.template): + self.read_template() + self.prune_file_list() + self.filelist.sort() + self.filelist.remove_duplicates() + self.write_manifest() + + def _manifest_normalize(self, path): + path = unicode_utils.filesys_decode(path) + return path.replace(os.sep, '/') + + def write_manifest(self): + """ + Write the file list in 'self.filelist' to the manifest file + named by 'self.manifest'. + """ + self.filelist._repair() + + # Now _repairs should encodability, but not unicode + files = [self._manifest_normalize(f) for f in self.filelist.files] + msg = "writing manifest file '%s'" % self.manifest + self.execute(write_file, (self.manifest, files), msg) + + def warn(self, msg): + if not self._should_suppress_warning(msg): + sdist.warn(self, msg) + + @staticmethod + def _should_suppress_warning(msg): + """ + suppress missing-file warnings from sdist + """ + return re.match(r"standard file .*not found", msg) + + def add_defaults(self): + sdist.add_defaults(self) + self.check_license() + self.filelist.append(self.template) + self.filelist.append(self.manifest) + rcfiles = list(walk_revctrl()) + if rcfiles: + self.filelist.extend(rcfiles) + elif os.path.exists(self.manifest): + self.read_manifest() + + if os.path.exists("setup.py"): + # setup.py should be included by default, even if it's not + # the script called to create the sdist + self.filelist.append("setup.py") + + ei_cmd = self.get_finalized_command('egg_info') + self.filelist.graft(ei_cmd.egg_info) + + def prune_file_list(self): + build = self.get_finalized_command('build') + base_dir = self.distribution.get_fullname() + self.filelist.prune(build.build_base) + self.filelist.prune(base_dir) + sep = re.escape(os.sep) + self.filelist.exclude_pattern(r'(^|' + sep + r')(RCS|CVS|\.svn)' + sep, + is_regex=1) + + +def write_file(filename, contents): + """Create a file with the specified name and write 'contents' (a + sequence of strings without line terminators) to it. + """ + contents = "\n".join(contents) + + # assuming the contents has been vetted for utf-8 encoding + contents = contents.encode("utf-8") + + with open(filename, "wb") as f: # always write POSIX-style manifest + f.write(contents) + + +def write_pkg_info(cmd, basename, filename): + log.info("writing %s", filename) + if not cmd.dry_run: + metadata = cmd.distribution.metadata + metadata.version, oldver = cmd.egg_version, metadata.version + metadata.name, oldname = cmd.egg_name, metadata.name + + try: + # write unescaped data to PKG-INFO, so older pkg_resources + # can still parse it + metadata.write_pkg_info(cmd.egg_info) + finally: + metadata.name, metadata.version = oldname, oldver + + safe = getattr(cmd.distribution, 'zip_safe', None) + + bdist_egg.write_safety_flag(cmd.egg_info, safe) + + +def warn_depends_obsolete(cmd, basename, filename): + if os.path.exists(filename): + log.warn( + "WARNING: 'depends.txt' is not used by setuptools 0.6!\n" + "Use the install_requires/extras_require setup() args instead." + ) + + +def _write_requirements(stream, reqs): + lines = yield_lines(reqs or ()) + append_cr = lambda line: line + '\n' + lines = map(append_cr, lines) + stream.writelines(lines) + + +def write_requirements(cmd, basename, filename): + dist = cmd.distribution + data = six.StringIO() + _write_requirements(data, dist.install_requires) + extras_require = dist.extras_require or {} + for extra in sorted(extras_require): + data.write('\n[{extra}]\n'.format(**vars())) + _write_requirements(data, extras_require[extra]) + cmd.write_or_delete_file("requirements", filename, data.getvalue()) + + +def write_setup_requirements(cmd, basename, filename): + data = io.StringIO() + _write_requirements(data, cmd.distribution.setup_requires) + cmd.write_or_delete_file("setup-requirements", filename, data.getvalue()) + + +def write_toplevel_names(cmd, basename, filename): + pkgs = dict.fromkeys( + [ + k.split('.', 1)[0] + for k in cmd.distribution.iter_distribution_names() + ] + ) + cmd.write_file("top-level names", filename, '\n'.join(sorted(pkgs)) + '\n') + + +def overwrite_arg(cmd, basename, filename): + write_arg(cmd, basename, filename, True) + + +def write_arg(cmd, basename, filename, force=False): + argname = os.path.splitext(basename)[0] + value = getattr(cmd.distribution, argname, None) + if value is not None: + value = '\n'.join(value) + '\n' + cmd.write_or_delete_file(argname, filename, value, force) + + +def write_entries(cmd, basename, filename): + ep = cmd.distribution.entry_points + + if isinstance(ep, six.string_types) or ep is None: + data = ep + elif ep is not None: + data = [] + for section, contents in sorted(ep.items()): + if not isinstance(contents, six.string_types): + contents = EntryPoint.parse_group(section, contents) + contents = '\n'.join(sorted(map(str, contents.values()))) + data.append('[%s]\n%s\n\n' % (section, contents)) + data = ''.join(data) + + cmd.write_or_delete_file('entry points', filename, data, True) + + +def get_pkg_info_revision(): + """ + Get a -r### off of PKG-INFO Version in case this is an sdist of + a subversion revision. + """ + warnings.warn("get_pkg_info_revision is deprecated.", EggInfoDeprecationWarning) + if os.path.exists('PKG-INFO'): + with io.open('PKG-INFO') as f: + for line in f: + match = re.match(r"Version:.*-r(\d+)\s*$", line) + if match: + return int(match.group(1)) + return 0 + + +class EggInfoDeprecationWarning(SetuptoolsDeprecationWarning): + """Class for warning about deprecations in eggInfo in setupTools. Not ignored by default, unlike DeprecationWarning.""" diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/install.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/install.py new file mode 100644 index 0000000..31a5ddb --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/install.py @@ -0,0 +1,125 @@ +from distutils.errors import DistutilsArgError +import inspect +import glob +import warnings +import platform +import distutils.command.install as orig + +import setuptools + +# Prior to numpy 1.9, NumPy relies on the '_install' name, so provide it for +# now. See https://github.com/pypa/setuptools/issues/199/ +_install = orig.install + + +class install(orig.install): + """Use easy_install to install the package, w/dependencies""" + + user_options = orig.install.user_options + [ + ('old-and-unmanageable', None, "Try not to use this!"), + ('single-version-externally-managed', None, + "used by system package builders to create 'flat' eggs"), + ] + boolean_options = orig.install.boolean_options + [ + 'old-and-unmanageable', 'single-version-externally-managed', + ] + new_commands = [ + ('install_egg_info', lambda self: True), + ('install_scripts', lambda self: True), + ] + _nc = dict(new_commands) + + def initialize_options(self): + orig.install.initialize_options(self) + self.old_and_unmanageable = None + self.single_version_externally_managed = None + + def finalize_options(self): + orig.install.finalize_options(self) + if self.root: + self.single_version_externally_managed = True + elif self.single_version_externally_managed: + if not self.root and not self.record: + raise DistutilsArgError( + "You must specify --record or --root when building system" + " packages" + ) + + def handle_extra_path(self): + if self.root or self.single_version_externally_managed: + # explicit backward-compatibility mode, allow extra_path to work + return orig.install.handle_extra_path(self) + + # Ignore extra_path when installing an egg (or being run by another + # command without --root or --single-version-externally-managed + self.path_file = None + self.extra_dirs = '' + + def run(self): + # Explicit request for old-style install? Just do it + if self.old_and_unmanageable or self.single_version_externally_managed: + return orig.install.run(self) + + if not self._called_from_setup(inspect.currentframe()): + # Run in backward-compatibility mode to support bdist_* commands. + orig.install.run(self) + else: + self.do_egg_install() + + @staticmethod + def _called_from_setup(run_frame): + """ + Attempt to detect whether run() was called from setup() or by another + command. If called by setup(), the parent caller will be the + 'run_command' method in 'distutils.dist', and *its* caller will be + the 'run_commands' method. If called any other way, the + immediate caller *might* be 'run_command', but it won't have been + called by 'run_commands'. Return True in that case or if a call stack + is unavailable. Return False otherwise. + """ + if run_frame is None: + msg = "Call stack not available. bdist_* commands may fail." + warnings.warn(msg) + if platform.python_implementation() == 'IronPython': + msg = "For best results, pass -X:Frames to enable call stack." + warnings.warn(msg) + return True + res = inspect.getouterframes(run_frame)[2] + caller, = res[:1] + info = inspect.getframeinfo(caller) + caller_module = caller.f_globals.get('__name__', '') + return ( + caller_module == 'distutils.dist' + and info.function == 'run_commands' + ) + + def do_egg_install(self): + + easy_install = self.distribution.get_command_class('easy_install') + + cmd = easy_install( + self.distribution, args="x", root=self.root, record=self.record, + ) + cmd.ensure_finalized() # finalize before bdist_egg munges install cmd + cmd.always_copy_from = '.' # make sure local-dir eggs get installed + + # pick up setup-dir .egg files only: no .egg-info + cmd.package_index.scan(glob.glob('*.egg')) + + self.run_command('bdist_egg') + args = [self.distribution.get_command_obj('bdist_egg').egg_output] + + if setuptools.bootstrap_install_from: + # Bootstrap self-installation of setuptools + args.insert(0, setuptools.bootstrap_install_from) + + cmd.args = args + cmd.run() + setuptools.bootstrap_install_from = None + + +# XXX Python 3.1 doesn't see _nc if this is inside the class +install.sub_commands = ( + [cmd for cmd in orig.install.sub_commands if cmd[0] not in install._nc] + + install.new_commands +) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/install_egg_info.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/install_egg_info.py new file mode 100644 index 0000000..edc4718 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/install_egg_info.py @@ -0,0 +1,62 @@ +from distutils import log, dir_util +import os + +from setuptools import Command +from setuptools import namespaces +from setuptools.archive_util import unpack_archive +import pkg_resources + + +class install_egg_info(namespaces.Installer, Command): + """Install an .egg-info directory for the package""" + + description = "Install an .egg-info directory for the package" + + user_options = [ + ('install-dir=', 'd', "directory to install to"), + ] + + def initialize_options(self): + self.install_dir = None + + def finalize_options(self): + self.set_undefined_options('install_lib', + ('install_dir', 'install_dir')) + ei_cmd = self.get_finalized_command("egg_info") + basename = pkg_resources.Distribution( + None, None, ei_cmd.egg_name, ei_cmd.egg_version + ).egg_name() + '.egg-info' + self.source = ei_cmd.egg_info + self.target = os.path.join(self.install_dir, basename) + self.outputs = [] + + def run(self): + self.run_command('egg_info') + if os.path.isdir(self.target) and not os.path.islink(self.target): + dir_util.remove_tree(self.target, dry_run=self.dry_run) + elif os.path.exists(self.target): + self.execute(os.unlink, (self.target,), "Removing " + self.target) + if not self.dry_run: + pkg_resources.ensure_directory(self.target) + self.execute( + self.copytree, (), "Copying %s to %s" % (self.source, self.target) + ) + self.install_namespaces() + + def get_outputs(self): + return self.outputs + + def copytree(self): + # Copy the .egg-info tree to site-packages + def skimmer(src, dst): + # filter out source-control directories; note that 'src' is always + # a '/'-separated path, regardless of platform. 'dst' is a + # platform-specific path. + for skip in '.svn/', 'CVS/': + if src.startswith(skip) or '/' + skip in src: + return None + self.outputs.append(dst) + log.debug("Copying %s to %s", src, dst) + return dst + + unpack_archive(self.source, self.target, skimmer) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/install_lib.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/install_lib.py new file mode 100644 index 0000000..2b31c3e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/install_lib.py @@ -0,0 +1,121 @@ +import os +import imp +from itertools import product, starmap +import distutils.command.install_lib as orig + + +class install_lib(orig.install_lib): + """Don't add compiled flags to filenames of non-Python files""" + + def run(self): + self.build() + outfiles = self.install() + if outfiles is not None: + # always compile, in case we have any extension stubs to deal with + self.byte_compile(outfiles) + + def get_exclusions(self): + """ + Return a collections.Sized collections.Container of paths to be + excluded for single_version_externally_managed installations. + """ + all_packages = ( + pkg + for ns_pkg in self._get_SVEM_NSPs() + for pkg in self._all_packages(ns_pkg) + ) + + excl_specs = product(all_packages, self._gen_exclusion_paths()) + return set(starmap(self._exclude_pkg_path, excl_specs)) + + def _exclude_pkg_path(self, pkg, exclusion_path): + """ + Given a package name and exclusion path within that package, + compute the full exclusion path. + """ + parts = pkg.split('.') + [exclusion_path] + return os.path.join(self.install_dir, *parts) + + @staticmethod + def _all_packages(pkg_name): + """ + >>> list(install_lib._all_packages('foo.bar.baz')) + ['foo.bar.baz', 'foo.bar', 'foo'] + """ + while pkg_name: + yield pkg_name + pkg_name, sep, child = pkg_name.rpartition('.') + + def _get_SVEM_NSPs(self): + """ + Get namespace packages (list) but only for + single_version_externally_managed installations and empty otherwise. + """ + # TODO: is it necessary to short-circuit here? i.e. what's the cost + # if get_finalized_command is called even when namespace_packages is + # False? + if not self.distribution.namespace_packages: + return [] + + install_cmd = self.get_finalized_command('install') + svem = install_cmd.single_version_externally_managed + + return self.distribution.namespace_packages if svem else [] + + @staticmethod + def _gen_exclusion_paths(): + """ + Generate file paths to be excluded for namespace packages (bytecode + cache files). + """ + # always exclude the package module itself + yield '__init__.py' + + yield '__init__.pyc' + yield '__init__.pyo' + + if not hasattr(imp, 'get_tag'): + return + + base = os.path.join('__pycache__', '__init__.' + imp.get_tag()) + yield base + '.pyc' + yield base + '.pyo' + yield base + '.opt-1.pyc' + yield base + '.opt-2.pyc' + + def copy_tree( + self, infile, outfile, + preserve_mode=1, preserve_times=1, preserve_symlinks=0, level=1 + ): + assert preserve_mode and preserve_times and not preserve_symlinks + exclude = self.get_exclusions() + + if not exclude: + return orig.install_lib.copy_tree(self, infile, outfile) + + # Exclude namespace package __init__.py* files from the output + + from setuptools.archive_util import unpack_directory + from distutils import log + + outfiles = [] + + def pf(src, dst): + if dst in exclude: + log.warn("Skipping installation of %s (namespace package)", + dst) + return False + + log.info("copying %s -> %s", src, os.path.dirname(dst)) + outfiles.append(dst) + return dst + + unpack_directory(infile, outfile, pf) + return outfiles + + def get_outputs(self): + outputs = orig.install_lib.get_outputs(self) + exclude = self.get_exclusions() + if exclude: + return [f for f in outputs if f not in exclude] + return outputs diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/install_scripts.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/install_scripts.py new file mode 100644 index 0000000..1623427 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/install_scripts.py @@ -0,0 +1,65 @@ +from distutils import log +import distutils.command.install_scripts as orig +import os +import sys + +from pkg_resources import Distribution, PathMetadata, ensure_directory + + +class install_scripts(orig.install_scripts): + """Do normal script install, plus any egg_info wrapper scripts""" + + def initialize_options(self): + orig.install_scripts.initialize_options(self) + self.no_ep = False + + def run(self): + import setuptools.command.easy_install as ei + + self.run_command("egg_info") + if self.distribution.scripts: + orig.install_scripts.run(self) # run first to set up self.outfiles + else: + self.outfiles = [] + if self.no_ep: + # don't install entry point scripts into .egg file! + return + + ei_cmd = self.get_finalized_command("egg_info") + dist = Distribution( + ei_cmd.egg_base, PathMetadata(ei_cmd.egg_base, ei_cmd.egg_info), + ei_cmd.egg_name, ei_cmd.egg_version, + ) + bs_cmd = self.get_finalized_command('build_scripts') + exec_param = getattr(bs_cmd, 'executable', None) + bw_cmd = self.get_finalized_command("bdist_wininst") + is_wininst = getattr(bw_cmd, '_is_running', False) + writer = ei.ScriptWriter + if is_wininst: + exec_param = "python.exe" + writer = ei.WindowsScriptWriter + if exec_param == sys.executable: + # In case the path to the Python executable contains a space, wrap + # it so it's not split up. + exec_param = [exec_param] + # resolve the writer to the environment + writer = writer.best() + cmd = writer.command_spec_class.best().from_param(exec_param) + for args in writer.get_args(dist, cmd.as_header()): + self.write_script(*args) + + def write_script(self, script_name, contents, mode="t", *ignored): + """Write an executable file to the scripts directory""" + from setuptools.command.easy_install import chmod, current_umask + + log.info("Installing %s script to %s", script_name, self.install_dir) + target = os.path.join(self.install_dir, script_name) + self.outfiles.append(target) + + mask = current_umask() + if not self.dry_run: + ensure_directory(target) + f = open(target, "w" + mode) + f.write(contents) + f.close() + chmod(target, 0o777 - mask) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/launcher manifest.xml b/mongo_mac/lib/python3.6/site-packages/setuptools/command/launcher manifest.xml new file mode 100644 index 0000000..5972a96 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/launcher manifest.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> + <assemblyIdentity version="1.0.0.0" + processorArchitecture="X86" + name="%(name)s" + type="win32"/> + <!-- Identify the application security requirements. --> + <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> + <security> + <requestedPrivileges> + <requestedExecutionLevel level="asInvoker" uiAccess="false"/> + </requestedPrivileges> + </security> + </trustInfo> +</assembly> diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/py36compat.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/py36compat.py new file mode 100644 index 0000000..61063e7 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/py36compat.py @@ -0,0 +1,136 @@ +import os +from glob import glob +from distutils.util import convert_path +from distutils.command import sdist + +from setuptools.extern.six.moves import filter + + +class sdist_add_defaults: + """ + Mix-in providing forward-compatibility for functionality as found in + distutils on Python 3.7. + + Do not edit the code in this class except to update functionality + as implemented in distutils. Instead, override in the subclass. + """ + + def add_defaults(self): + """Add all the default files to self.filelist: + - README or README.txt + - setup.py + - test/test*.py + - all pure Python modules mentioned in setup script + - all files pointed by package_data (build_py) + - all files defined in data_files. + - all files defined as scripts. + - all C sources listed as part of extensions or C libraries + in the setup script (doesn't catch C headers!) + Warns if (README or README.txt) or setup.py are missing; everything + else is optional. + """ + self._add_defaults_standards() + self._add_defaults_optional() + self._add_defaults_python() + self._add_defaults_data_files() + self._add_defaults_ext() + self._add_defaults_c_libs() + self._add_defaults_scripts() + + @staticmethod + def _cs_path_exists(fspath): + """ + Case-sensitive path existence check + + >>> sdist_add_defaults._cs_path_exists(__file__) + True + >>> sdist_add_defaults._cs_path_exists(__file__.upper()) + False + """ + if not os.path.exists(fspath): + return False + # make absolute so we always have a directory + abspath = os.path.abspath(fspath) + directory, filename = os.path.split(abspath) + return filename in os.listdir(directory) + + def _add_defaults_standards(self): + standards = [self.READMES, self.distribution.script_name] + for fn in standards: + if isinstance(fn, tuple): + alts = fn + got_it = False + for fn in alts: + if self._cs_path_exists(fn): + got_it = True + self.filelist.append(fn) + break + + if not got_it: + self.warn("standard file not found: should have one of " + + ', '.join(alts)) + else: + if self._cs_path_exists(fn): + self.filelist.append(fn) + else: + self.warn("standard file '%s' not found" % fn) + + def _add_defaults_optional(self): + optional = ['test/test*.py', 'setup.cfg'] + for pattern in optional: + files = filter(os.path.isfile, glob(pattern)) + self.filelist.extend(files) + + def _add_defaults_python(self): + # build_py is used to get: + # - python modules + # - files defined in package_data + build_py = self.get_finalized_command('build_py') + + # getting python files + if self.distribution.has_pure_modules(): + self.filelist.extend(build_py.get_source_files()) + + # getting package_data files + # (computed in build_py.data_files by build_py.finalize_options) + for pkg, src_dir, build_dir, filenames in build_py.data_files: + for filename in filenames: + self.filelist.append(os.path.join(src_dir, filename)) + + def _add_defaults_data_files(self): + # getting distribution.data_files + if self.distribution.has_data_files(): + for item in self.distribution.data_files: + if isinstance(item, str): + # plain file + item = convert_path(item) + if os.path.isfile(item): + self.filelist.append(item) + else: + # a (dirname, filenames) tuple + dirname, filenames = item + for f in filenames: + f = convert_path(f) + if os.path.isfile(f): + self.filelist.append(f) + + def _add_defaults_ext(self): + if self.distribution.has_ext_modules(): + build_ext = self.get_finalized_command('build_ext') + self.filelist.extend(build_ext.get_source_files()) + + def _add_defaults_c_libs(self): + if self.distribution.has_c_libraries(): + build_clib = self.get_finalized_command('build_clib') + self.filelist.extend(build_clib.get_source_files()) + + def _add_defaults_scripts(self): + if self.distribution.has_scripts(): + build_scripts = self.get_finalized_command('build_scripts') + self.filelist.extend(build_scripts.get_source_files()) + + +if hasattr(sdist.sdist, '_add_defaults_standards'): + # disable the functionality already available upstream + class sdist_add_defaults: + pass diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/register.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/register.py new file mode 100644 index 0000000..98bc015 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/register.py @@ -0,0 +1,18 @@ +from distutils import log +import distutils.command.register as orig + + +class register(orig.register): + __doc__ = orig.register.__doc__ + + def run(self): + try: + # Make sure that we are using valid current name/version info + self.run_command('egg_info') + orig.register.run(self) + finally: + self.announce( + "WARNING: Registering is deprecated, use twine to " + "upload instead (https://pypi.org/p/twine/)", + log.WARN + ) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/rotate.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/rotate.py new file mode 100644 index 0000000..b89353f --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/rotate.py @@ -0,0 +1,66 @@ +from distutils.util import convert_path +from distutils import log +from distutils.errors import DistutilsOptionError +import os +import shutil + +from setuptools.extern import six + +from setuptools import Command + + +class rotate(Command): + """Delete older distributions""" + + description = "delete older distributions, keeping N newest files" + user_options = [ + ('match=', 'm', "patterns to match (required)"), + ('dist-dir=', 'd', "directory where the distributions are"), + ('keep=', 'k', "number of matching distributions to keep"), + ] + + boolean_options = [] + + def initialize_options(self): + self.match = None + self.dist_dir = None + self.keep = None + + def finalize_options(self): + if self.match is None: + raise DistutilsOptionError( + "Must specify one or more (comma-separated) match patterns " + "(e.g. '.zip' or '.egg')" + ) + if self.keep is None: + raise DistutilsOptionError("Must specify number of files to keep") + try: + self.keep = int(self.keep) + except ValueError: + raise DistutilsOptionError("--keep must be an integer") + if isinstance(self.match, six.string_types): + self.match = [ + convert_path(p.strip()) for p in self.match.split(',') + ] + self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) + + def run(self): + self.run_command("egg_info") + from glob import glob + + for pattern in self.match: + pattern = self.distribution.get_name() + '*' + pattern + files = glob(os.path.join(self.dist_dir, pattern)) + files = [(os.path.getmtime(f), f) for f in files] + files.sort() + files.reverse() + + log.info("%d file(s) matching %s", len(files), pattern) + files = files[self.keep:] + for (t, f) in files: + log.info("Deleting %s", f) + if not self.dry_run: + if os.path.isdir(f): + shutil.rmtree(f) + else: + os.unlink(f) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/saveopts.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/saveopts.py new file mode 100644 index 0000000..611cec5 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/saveopts.py @@ -0,0 +1,22 @@ +from setuptools.command.setopt import edit_config, option_base + + +class saveopts(option_base): + """Save command-line options to a file""" + + description = "save supplied options to setup.cfg or other config file" + + def run(self): + dist = self.distribution + settings = {} + + for cmd in dist.command_options: + + if cmd == 'saveopts': + continue # don't save our own options! + + for opt, (src, val) in dist.get_option_dict(cmd).items(): + if src == "command line": + settings.setdefault(cmd, {})[opt] = val + + edit_config(self.filename, settings, self.dry_run) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/sdist.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/sdist.py new file mode 100644 index 0000000..dc25398 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/sdist.py @@ -0,0 +1,221 @@ +from distutils import log +import distutils.command.sdist as orig +import os +import sys +import io +import contextlib + +from setuptools.extern import six + +from .py36compat import sdist_add_defaults + +import pkg_resources + +_default_revctrl = list + + +def walk_revctrl(dirname=''): + """Find all files under revision control""" + for ep in pkg_resources.iter_entry_points('setuptools.file_finders'): + for item in ep.load()(dirname): + yield item + + +class sdist(sdist_add_defaults, orig.sdist): + """Smart sdist that finds anything supported by revision control""" + + user_options = [ + ('formats=', None, + "formats for source distribution (comma-separated list)"), + ('keep-temp', 'k', + "keep the distribution tree around after creating " + + "archive file(s)"), + ('dist-dir=', 'd', + "directory to put the source distribution archive(s) in " + "[default: dist]"), + ] + + negative_opt = {} + + README_EXTENSIONS = ['', '.rst', '.txt', '.md'] + READMES = tuple('README{0}'.format(ext) for ext in README_EXTENSIONS) + + def run(self): + self.run_command('egg_info') + ei_cmd = self.get_finalized_command('egg_info') + self.filelist = ei_cmd.filelist + self.filelist.append(os.path.join(ei_cmd.egg_info, 'SOURCES.txt')) + self.check_readme() + + # Run sub commands + for cmd_name in self.get_sub_commands(): + self.run_command(cmd_name) + + self.make_distribution() + + dist_files = getattr(self.distribution, 'dist_files', []) + for file in self.archive_files: + data = ('sdist', '', file) + if data not in dist_files: + dist_files.append(data) + + def initialize_options(self): + orig.sdist.initialize_options(self) + + self._default_to_gztar() + + def _default_to_gztar(self): + # only needed on Python prior to 3.6. + if sys.version_info >= (3, 6, 0, 'beta', 1): + return + self.formats = ['gztar'] + + def make_distribution(self): + """ + Workaround for #516 + """ + with self._remove_os_link(): + orig.sdist.make_distribution(self) + + @staticmethod + @contextlib.contextmanager + def _remove_os_link(): + """ + In a context, remove and restore os.link if it exists + """ + + class NoValue: + pass + + orig_val = getattr(os, 'link', NoValue) + try: + del os.link + except Exception: + pass + try: + yield + finally: + if orig_val is not NoValue: + setattr(os, 'link', orig_val) + + def __read_template_hack(self): + # This grody hack closes the template file (MANIFEST.in) if an + # exception occurs during read_template. + # Doing so prevents an error when easy_install attempts to delete the + # file. + try: + orig.sdist.read_template(self) + except Exception: + _, _, tb = sys.exc_info() + tb.tb_next.tb_frame.f_locals['template'].close() + raise + + # Beginning with Python 2.7.2, 3.1.4, and 3.2.1, this leaky file handle + # has been fixed, so only override the method if we're using an earlier + # Python. + has_leaky_handle = ( + sys.version_info < (2, 7, 2) + or (3, 0) <= sys.version_info < (3, 1, 4) + or (3, 2) <= sys.version_info < (3, 2, 1) + ) + if has_leaky_handle: + read_template = __read_template_hack + + def _add_defaults_python(self): + """getting python files""" + if self.distribution.has_pure_modules(): + build_py = self.get_finalized_command('build_py') + self.filelist.extend(build_py.get_source_files()) + # This functionality is incompatible with include_package_data, and + # will in fact create an infinite recursion if include_package_data + # is True. Use of include_package_data will imply that + # distutils-style automatic handling of package_data is disabled + if not self.distribution.include_package_data: + for _, src_dir, _, filenames in build_py.data_files: + self.filelist.extend([os.path.join(src_dir, filename) + for filename in filenames]) + + def _add_defaults_data_files(self): + try: + if six.PY2: + sdist_add_defaults._add_defaults_data_files(self) + else: + super()._add_defaults_data_files() + except TypeError: + log.warn("data_files contains unexpected objects") + + def check_readme(self): + for f in self.READMES: + if os.path.exists(f): + return + else: + self.warn( + "standard file not found: should have one of " + + ', '.join(self.READMES) + ) + + def make_release_tree(self, base_dir, files): + orig.sdist.make_release_tree(self, base_dir, files) + + # Save any egg_info command line options used to create this sdist + dest = os.path.join(base_dir, 'setup.cfg') + if hasattr(os, 'link') and os.path.exists(dest): + # unlink and re-copy, since it might be hard-linked, and + # we don't want to change the source version + os.unlink(dest) + self.copy_file('setup.cfg', dest) + + self.get_finalized_command('egg_info').save_version_info(dest) + + def _manifest_is_not_generated(self): + # check for special comment used in 2.7.1 and higher + if not os.path.isfile(self.manifest): + return False + + with io.open(self.manifest, 'rb') as fp: + first_line = fp.readline() + return (first_line != + '# file GENERATED by distutils, do NOT edit\n'.encode()) + + def read_manifest(self): + """Read the manifest file (named by 'self.manifest') and use it to + fill in 'self.filelist', the list of files to include in the source + distribution. + """ + log.info("reading manifest file '%s'", self.manifest) + manifest = open(self.manifest, 'rb') + for line in manifest: + # The manifest must contain UTF-8. See #303. + if six.PY3: + try: + line = line.decode('UTF-8') + except UnicodeDecodeError: + log.warn("%r not UTF-8 decodable -- skipping" % line) + continue + # ignore comments and blank lines + line = line.strip() + if line.startswith('#') or not line: + continue + self.filelist.append(line) + manifest.close() + + def check_license(self): + """Checks if license_file' is configured and adds it to + 'self.filelist' if the value contains a valid path. + """ + + opts = self.distribution.get_option_dict('metadata') + + # ignore the source of the value + _, license_file = opts.get('license_file', (None, None)) + + if license_file is None: + log.debug("'license_file' option was not specified") + return + + if not os.path.exists(license_file): + log.warn("warning: Failed to find the configured license file '%s'", + license_file) + return + + self.filelist.append(license_file) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/setopt.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/setopt.py new file mode 100644 index 0000000..7e57cc0 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/setopt.py @@ -0,0 +1,149 @@ +from distutils.util import convert_path +from distutils import log +from distutils.errors import DistutilsOptionError +import distutils +import os + +from setuptools.extern.six.moves import configparser + +from setuptools import Command + +__all__ = ['config_file', 'edit_config', 'option_base', 'setopt'] + + +def config_file(kind="local"): + """Get the filename of the distutils, local, global, or per-user config + + `kind` must be one of "local", "global", or "user" + """ + if kind == 'local': + return 'setup.cfg' + if kind == 'global': + return os.path.join( + os.path.dirname(distutils.__file__), 'distutils.cfg' + ) + if kind == 'user': + dot = os.name == 'posix' and '.' or '' + return os.path.expanduser(convert_path("~/%spydistutils.cfg" % dot)) + raise ValueError( + "config_file() type must be 'local', 'global', or 'user'", kind + ) + + +def edit_config(filename, settings, dry_run=False): + """Edit a configuration file to include `settings` + + `settings` is a dictionary of dictionaries or ``None`` values, keyed by + command/section name. A ``None`` value means to delete the entire section, + while a dictionary lists settings to be changed or deleted in that section. + A setting of ``None`` means to delete that setting. + """ + log.debug("Reading configuration from %s", filename) + opts = configparser.RawConfigParser() + opts.read([filename]) + for section, options in settings.items(): + if options is None: + log.info("Deleting section [%s] from %s", section, filename) + opts.remove_section(section) + else: + if not opts.has_section(section): + log.debug("Adding new section [%s] to %s", section, filename) + opts.add_section(section) + for option, value in options.items(): + if value is None: + log.debug( + "Deleting %s.%s from %s", + section, option, filename + ) + opts.remove_option(section, option) + if not opts.options(section): + log.info("Deleting empty [%s] section from %s", + section, filename) + opts.remove_section(section) + else: + log.debug( + "Setting %s.%s to %r in %s", + section, option, value, filename + ) + opts.set(section, option, value) + + log.info("Writing %s", filename) + if not dry_run: + with open(filename, 'w') as f: + opts.write(f) + + +class option_base(Command): + """Abstract base class for commands that mess with config files""" + + user_options = [ + ('global-config', 'g', + "save options to the site-wide distutils.cfg file"), + ('user-config', 'u', + "save options to the current user's pydistutils.cfg file"), + ('filename=', 'f', + "configuration file to use (default=setup.cfg)"), + ] + + boolean_options = [ + 'global-config', 'user-config', + ] + + def initialize_options(self): + self.global_config = None + self.user_config = None + self.filename = None + + def finalize_options(self): + filenames = [] + if self.global_config: + filenames.append(config_file('global')) + if self.user_config: + filenames.append(config_file('user')) + if self.filename is not None: + filenames.append(self.filename) + if not filenames: + filenames.append(config_file('local')) + if len(filenames) > 1: + raise DistutilsOptionError( + "Must specify only one configuration file option", + filenames + ) + self.filename, = filenames + + +class setopt(option_base): + """Save command-line options to a file""" + + description = "set an option in setup.cfg or another config file" + + user_options = [ + ('command=', 'c', 'command to set an option for'), + ('option=', 'o', 'option to set'), + ('set-value=', 's', 'value of the option'), + ('remove', 'r', 'remove (unset) the value'), + ] + option_base.user_options + + boolean_options = option_base.boolean_options + ['remove'] + + def initialize_options(self): + option_base.initialize_options(self) + self.command = None + self.option = None + self.set_value = None + self.remove = None + + def finalize_options(self): + option_base.finalize_options(self) + if self.command is None or self.option is None: + raise DistutilsOptionError("Must specify --command *and* --option") + if self.set_value is None and not self.remove: + raise DistutilsOptionError("Must specify --set-value or --remove") + + def run(self): + edit_config( + self.filename, { + self.command: {self.option.replace('-', '_'): self.set_value} + }, + self.dry_run + ) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/test.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/test.py new file mode 100644 index 0000000..973e4eb --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/test.py @@ -0,0 +1,271 @@ +import os +import operator +import sys +import contextlib +import itertools +import unittest +from distutils.errors import DistutilsError, DistutilsOptionError +from distutils import log +from unittest import TestLoader + +from setuptools.extern import six +from setuptools.extern.six.moves import map, filter + +from pkg_resources import (resource_listdir, resource_exists, normalize_path, + working_set, _namespace_packages, evaluate_marker, + add_activation_listener, require, EntryPoint) +from setuptools import Command +from .build_py import _unique_everseen + +__metaclass__ = type + + +class ScanningLoader(TestLoader): + + def __init__(self): + TestLoader.__init__(self) + self._visited = set() + + def loadTestsFromModule(self, module, pattern=None): + """Return a suite of all tests cases contained in the given module + + If the module is a package, load tests from all the modules in it. + If the module has an ``additional_tests`` function, call it and add + the return value to the tests. + """ + if module in self._visited: + return None + self._visited.add(module) + + tests = [] + tests.append(TestLoader.loadTestsFromModule(self, module)) + + if hasattr(module, "additional_tests"): + tests.append(module.additional_tests()) + + if hasattr(module, '__path__'): + for file in resource_listdir(module.__name__, ''): + if file.endswith('.py') and file != '__init__.py': + submodule = module.__name__ + '.' + file[:-3] + else: + if resource_exists(module.__name__, file + '/__init__.py'): + submodule = module.__name__ + '.' + file + else: + continue + tests.append(self.loadTestsFromName(submodule)) + + if len(tests) != 1: + return self.suiteClass(tests) + else: + return tests[0] # don't create a nested suite for only one return + + +# adapted from jaraco.classes.properties:NonDataProperty +class NonDataProperty: + def __init__(self, fget): + self.fget = fget + + def __get__(self, obj, objtype=None): + if obj is None: + return self + return self.fget(obj) + + +class test(Command): + """Command to run unit tests after in-place build""" + + description = "run unit tests after in-place build" + + user_options = [ + ('test-module=', 'm', "Run 'test_suite' in specified module"), + ('test-suite=', 's', + "Run single test, case or suite (e.g. 'module.test_suite')"), + ('test-runner=', 'r', "Test runner to use"), + ] + + def initialize_options(self): + self.test_suite = None + self.test_module = None + self.test_loader = None + self.test_runner = None + + def finalize_options(self): + + if self.test_suite and self.test_module: + msg = "You may specify a module or a suite, but not both" + raise DistutilsOptionError(msg) + + if self.test_suite is None: + if self.test_module is None: + self.test_suite = self.distribution.test_suite + else: + self.test_suite = self.test_module + ".test_suite" + + if self.test_loader is None: + self.test_loader = getattr(self.distribution, 'test_loader', None) + if self.test_loader is None: + self.test_loader = "setuptools.command.test:ScanningLoader" + if self.test_runner is None: + self.test_runner = getattr(self.distribution, 'test_runner', None) + + @NonDataProperty + def test_args(self): + return list(self._test_args()) + + def _test_args(self): + if not self.test_suite and sys.version_info >= (2, 7): + yield 'discover' + if self.verbose: + yield '--verbose' + if self.test_suite: + yield self.test_suite + + def with_project_on_sys_path(self, func): + """ + Backward compatibility for project_on_sys_path context. + """ + with self.project_on_sys_path(): + func() + + @contextlib.contextmanager + def project_on_sys_path(self, include_dists=[]): + with_2to3 = six.PY3 and getattr(self.distribution, 'use_2to3', False) + + if with_2to3: + # If we run 2to3 we can not do this inplace: + + # Ensure metadata is up-to-date + self.reinitialize_command('build_py', inplace=0) + self.run_command('build_py') + bpy_cmd = self.get_finalized_command("build_py") + build_path = normalize_path(bpy_cmd.build_lib) + + # Build extensions + self.reinitialize_command('egg_info', egg_base=build_path) + self.run_command('egg_info') + + self.reinitialize_command('build_ext', inplace=0) + self.run_command('build_ext') + else: + # Without 2to3 inplace works fine: + self.run_command('egg_info') + + # Build extensions in-place + self.reinitialize_command('build_ext', inplace=1) + self.run_command('build_ext') + + ei_cmd = self.get_finalized_command("egg_info") + + old_path = sys.path[:] + old_modules = sys.modules.copy() + + try: + project_path = normalize_path(ei_cmd.egg_base) + sys.path.insert(0, project_path) + working_set.__init__() + add_activation_listener(lambda dist: dist.activate()) + require('%s==%s' % (ei_cmd.egg_name, ei_cmd.egg_version)) + with self.paths_on_pythonpath([project_path]): + yield + finally: + sys.path[:] = old_path + sys.modules.clear() + sys.modules.update(old_modules) + working_set.__init__() + + @staticmethod + @contextlib.contextmanager + def paths_on_pythonpath(paths): + """ + Add the indicated paths to the head of the PYTHONPATH environment + variable so that subprocesses will also see the packages at + these paths. + + Do this in a context that restores the value on exit. + """ + nothing = object() + orig_pythonpath = os.environ.get('PYTHONPATH', nothing) + current_pythonpath = os.environ.get('PYTHONPATH', '') + try: + prefix = os.pathsep.join(_unique_everseen(paths)) + to_join = filter(None, [prefix, current_pythonpath]) + new_path = os.pathsep.join(to_join) + if new_path: + os.environ['PYTHONPATH'] = new_path + yield + finally: + if orig_pythonpath is nothing: + os.environ.pop('PYTHONPATH', None) + else: + os.environ['PYTHONPATH'] = orig_pythonpath + + @staticmethod + def install_dists(dist): + """ + Install the requirements indicated by self.distribution and + return an iterable of the dists that were built. + """ + ir_d = dist.fetch_build_eggs(dist.install_requires) + tr_d = dist.fetch_build_eggs(dist.tests_require or []) + er_d = dist.fetch_build_eggs( + v for k, v in dist.extras_require.items() + if k.startswith(':') and evaluate_marker(k[1:]) + ) + return itertools.chain(ir_d, tr_d, er_d) + + def run(self): + installed_dists = self.install_dists(self.distribution) + + cmd = ' '.join(self._argv) + if self.dry_run: + self.announce('skipping "%s" (dry run)' % cmd) + return + + self.announce('running "%s"' % cmd) + + paths = map(operator.attrgetter('location'), installed_dists) + with self.paths_on_pythonpath(paths): + with self.project_on_sys_path(): + self.run_tests() + + def run_tests(self): + # Purge modules under test from sys.modules. The test loader will + # re-import them from the build location. Required when 2to3 is used + # with namespace packages. + if six.PY3 and getattr(self.distribution, 'use_2to3', False): + module = self.test_suite.split('.')[0] + if module in _namespace_packages: + del_modules = [] + if module in sys.modules: + del_modules.append(module) + module += '.' + for name in sys.modules: + if name.startswith(module): + del_modules.append(name) + list(map(sys.modules.__delitem__, del_modules)) + + test = unittest.main( + None, None, self._argv, + testLoader=self._resolve_as_ep(self.test_loader), + testRunner=self._resolve_as_ep(self.test_runner), + exit=False, + ) + if not test.result.wasSuccessful(): + msg = 'Test failed: %s' % test.result + self.announce(msg, log.ERROR) + raise DistutilsError(msg) + + @property + def _argv(self): + return ['unittest'] + self.test_args + + @staticmethod + def _resolve_as_ep(val): + """ + Load the indicated attribute value, called, as a as if it were + specified as an entry point. + """ + if val is None: + return + parsed = EntryPoint.parse("x=" + val) + return parsed.resolve()() diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/upload.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/upload.py new file mode 100644 index 0000000..6db8888 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/upload.py @@ -0,0 +1,196 @@ +import io +import os +import hashlib +import getpass + +from base64 import standard_b64encode + +from distutils import log +from distutils.command import upload as orig +from distutils.spawn import spawn + +from distutils.errors import DistutilsError + +from setuptools.extern.six.moves.urllib.request import urlopen, Request +from setuptools.extern.six.moves.urllib.error import HTTPError +from setuptools.extern.six.moves.urllib.parse import urlparse + + +class upload(orig.upload): + """ + Override default upload behavior to obtain password + in a variety of different ways. + """ + def run(self): + try: + orig.upload.run(self) + finally: + self.announce( + "WARNING: Uploading via this command is deprecated, use twine " + "to upload instead (https://pypi.org/p/twine/)", + log.WARN + ) + + def finalize_options(self): + orig.upload.finalize_options(self) + self.username = ( + self.username or + getpass.getuser() + ) + # Attempt to obtain password. Short circuit evaluation at the first + # sign of success. + self.password = ( + self.password or + self._load_password_from_keyring() or + self._prompt_for_password() + ) + + def upload_file(self, command, pyversion, filename): + # Makes sure the repository URL is compliant + schema, netloc, url, params, query, fragments = \ + urlparse(self.repository) + if params or query or fragments: + raise AssertionError("Incompatible url %s" % self.repository) + + if schema not in ('http', 'https'): + raise AssertionError("unsupported schema " + schema) + + # Sign if requested + if self.sign: + gpg_args = ["gpg", "--detach-sign", "-a", filename] + if self.identity: + gpg_args[2:2] = ["--local-user", self.identity] + spawn(gpg_args, + dry_run=self.dry_run) + + # Fill in the data - send all the meta-data in case we need to + # register a new release + with open(filename, 'rb') as f: + content = f.read() + + meta = self.distribution.metadata + + data = { + # action + ':action': 'file_upload', + 'protocol_version': '1', + + # identify release + 'name': meta.get_name(), + 'version': meta.get_version(), + + # file content + 'content': (os.path.basename(filename), content), + 'filetype': command, + 'pyversion': pyversion, + 'md5_digest': hashlib.md5(content).hexdigest(), + + # additional meta-data + 'metadata_version': str(meta.get_metadata_version()), + 'summary': meta.get_description(), + 'home_page': meta.get_url(), + 'author': meta.get_contact(), + 'author_email': meta.get_contact_email(), + 'license': meta.get_licence(), + 'description': meta.get_long_description(), + 'keywords': meta.get_keywords(), + 'platform': meta.get_platforms(), + 'classifiers': meta.get_classifiers(), + 'download_url': meta.get_download_url(), + # PEP 314 + 'provides': meta.get_provides(), + 'requires': meta.get_requires(), + 'obsoletes': meta.get_obsoletes(), + } + + data['comment'] = '' + + if self.sign: + data['gpg_signature'] = (os.path.basename(filename) + ".asc", + open(filename+".asc", "rb").read()) + + # set up the authentication + user_pass = (self.username + ":" + self.password).encode('ascii') + # The exact encoding of the authentication string is debated. + # Anyway PyPI only accepts ascii for both username or password. + auth = "Basic " + standard_b64encode(user_pass).decode('ascii') + + # Build up the MIME payload for the POST data + boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' + sep_boundary = b'\r\n--' + boundary.encode('ascii') + end_boundary = sep_boundary + b'--\r\n' + body = io.BytesIO() + for key, value in data.items(): + title = '\r\nContent-Disposition: form-data; name="%s"' % key + # handle multiple entries for the same name + if not isinstance(value, list): + value = [value] + for value in value: + if type(value) is tuple: + title += '; filename="%s"' % value[0] + value = value[1] + else: + value = str(value).encode('utf-8') + body.write(sep_boundary) + body.write(title.encode('utf-8')) + body.write(b"\r\n\r\n") + body.write(value) + body.write(end_boundary) + body = body.getvalue() + + msg = "Submitting %s to %s" % (filename, self.repository) + self.announce(msg, log.INFO) + + # build the Request + headers = { + 'Content-type': 'multipart/form-data; boundary=%s' % boundary, + 'Content-length': str(len(body)), + 'Authorization': auth, + } + + request = Request(self.repository, data=body, + headers=headers) + # send the data + try: + result = urlopen(request) + status = result.getcode() + reason = result.msg + except HTTPError as e: + status = e.code + reason = e.msg + except OSError as e: + self.announce(str(e), log.ERROR) + raise + + if status == 200: + self.announce('Server response (%s): %s' % (status, reason), + log.INFO) + if self.show_response: + text = getattr(self, '_read_pypi_response', + lambda x: None)(result) + if text is not None: + msg = '\n'.join(('-' * 75, text, '-' * 75)) + self.announce(msg, log.INFO) + else: + msg = 'Upload failed (%s): %s' % (status, reason) + self.announce(msg, log.ERROR) + raise DistutilsError(msg) + + def _load_password_from_keyring(self): + """ + Attempt to load password from keyring. Suppress Exceptions. + """ + try: + keyring = __import__('keyring') + return keyring.get_password(self.repository, self.username) + except Exception: + pass + + def _prompt_for_password(self): + """ + Prompt for a password on the tty. Suppress Exceptions. + """ + try: + return getpass.getpass() + except (Exception, KeyboardInterrupt): + pass diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/command/upload_docs.py b/mongo_mac/lib/python3.6/site-packages/setuptools/command/upload_docs.py new file mode 100644 index 0000000..07aa564 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/command/upload_docs.py @@ -0,0 +1,206 @@ +# -*- coding: utf-8 -*- +"""upload_docs + +Implements a Distutils 'upload_docs' subcommand (upload documentation to +PyPI's pythonhosted.org). +""" + +from base64 import standard_b64encode +from distutils import log +from distutils.errors import DistutilsOptionError +import os +import socket +import zipfile +import tempfile +import shutil +import itertools +import functools + +from setuptools.extern import six +from setuptools.extern.six.moves import http_client, urllib + +from pkg_resources import iter_entry_points +from .upload import upload + + +def _encode(s): + errors = 'surrogateescape' if six.PY3 else 'strict' + return s.encode('utf-8', errors) + + +class upload_docs(upload): + # override the default repository as upload_docs isn't + # supported by Warehouse (and won't be). + DEFAULT_REPOSITORY = 'https://pypi.python.org/pypi/' + + description = 'Upload documentation to PyPI' + + user_options = [ + ('repository=', 'r', + "url of repository [default: %s]" % upload.DEFAULT_REPOSITORY), + ('show-response', None, + 'display full response text from server'), + ('upload-dir=', None, 'directory to upload'), + ] + boolean_options = upload.boolean_options + + def has_sphinx(self): + if self.upload_dir is None: + for ep in iter_entry_points('distutils.commands', 'build_sphinx'): + return True + + sub_commands = [('build_sphinx', has_sphinx)] + + def initialize_options(self): + upload.initialize_options(self) + self.upload_dir = None + self.target_dir = None + + def finalize_options(self): + upload.finalize_options(self) + if self.upload_dir is None: + if self.has_sphinx(): + build_sphinx = self.get_finalized_command('build_sphinx') + self.target_dir = build_sphinx.builder_target_dir + else: + build = self.get_finalized_command('build') + self.target_dir = os.path.join(build.build_base, 'docs') + else: + self.ensure_dirname('upload_dir') + self.target_dir = self.upload_dir + if 'pypi.python.org' in self.repository: + log.warn("Upload_docs command is deprecated. Use RTD instead.") + self.announce('Using upload directory %s' % self.target_dir) + + def create_zipfile(self, filename): + zip_file = zipfile.ZipFile(filename, "w") + try: + self.mkpath(self.target_dir) # just in case + for root, dirs, files in os.walk(self.target_dir): + if root == self.target_dir and not files: + tmpl = "no files found in upload directory '%s'" + raise DistutilsOptionError(tmpl % self.target_dir) + for name in files: + full = os.path.join(root, name) + relative = root[len(self.target_dir):].lstrip(os.path.sep) + dest = os.path.join(relative, name) + zip_file.write(full, dest) + finally: + zip_file.close() + + def run(self): + # Run sub commands + for cmd_name in self.get_sub_commands(): + self.run_command(cmd_name) + + tmp_dir = tempfile.mkdtemp() + name = self.distribution.metadata.get_name() + zip_file = os.path.join(tmp_dir, "%s.zip" % name) + try: + self.create_zipfile(zip_file) + self.upload_file(zip_file) + finally: + shutil.rmtree(tmp_dir) + + @staticmethod + def _build_part(item, sep_boundary): + key, values = item + title = '\nContent-Disposition: form-data; name="%s"' % key + # handle multiple entries for the same name + if not isinstance(values, list): + values = [values] + for value in values: + if isinstance(value, tuple): + title += '; filename="%s"' % value[0] + value = value[1] + else: + value = _encode(value) + yield sep_boundary + yield _encode(title) + yield b"\n\n" + yield value + if value and value[-1:] == b'\r': + yield b'\n' # write an extra newline (lurve Macs) + + @classmethod + def _build_multipart(cls, data): + """ + Build up the MIME payload for the POST data + """ + boundary = b'--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' + sep_boundary = b'\n--' + boundary + end_boundary = sep_boundary + b'--' + end_items = end_boundary, b"\n", + builder = functools.partial( + cls._build_part, + sep_boundary=sep_boundary, + ) + part_groups = map(builder, data.items()) + parts = itertools.chain.from_iterable(part_groups) + body_items = itertools.chain(parts, end_items) + content_type = 'multipart/form-data; boundary=%s' % boundary.decode('ascii') + return b''.join(body_items), content_type + + def upload_file(self, filename): + with open(filename, 'rb') as f: + content = f.read() + meta = self.distribution.metadata + data = { + ':action': 'doc_upload', + 'name': meta.get_name(), + 'content': (os.path.basename(filename), content), + } + # set up the authentication + credentials = _encode(self.username + ':' + self.password) + credentials = standard_b64encode(credentials) + if six.PY3: + credentials = credentials.decode('ascii') + auth = "Basic " + credentials + + body, ct = self._build_multipart(data) + + msg = "Submitting documentation to %s" % (self.repository) + self.announce(msg, log.INFO) + + # build the Request + # We can't use urllib2 since we need to send the Basic + # auth right with the first request + schema, netloc, url, params, query, fragments = \ + urllib.parse.urlparse(self.repository) + assert not params and not query and not fragments + if schema == 'http': + conn = http_client.HTTPConnection(netloc) + elif schema == 'https': + conn = http_client.HTTPSConnection(netloc) + else: + raise AssertionError("unsupported schema " + schema) + + data = '' + try: + conn.connect() + conn.putrequest("POST", url) + content_type = ct + conn.putheader('Content-type', content_type) + conn.putheader('Content-length', str(len(body))) + conn.putheader('Authorization', auth) + conn.endheaders() + conn.send(body) + except socket.error as e: + self.announce(str(e), log.ERROR) + return + + r = conn.getresponse() + if r.status == 200: + msg = 'Server response (%s): %s' % (r.status, r.reason) + self.announce(msg, log.INFO) + elif r.status == 301: + location = r.getheader('Location') + if location is None: + location = 'https://pythonhosted.org/%s/' % meta.get_name() + msg = 'Upload successful. Visit %s' % location + self.announce(msg, log.INFO) + else: + msg = 'Upload failed (%s): %s' % (r.status, r.reason) + self.announce(msg, log.ERROR) + if self.show_response: + print('-' * 75, r.read(), '-' * 75) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/config.py b/mongo_mac/lib/python3.6/site-packages/setuptools/config.py new file mode 100644 index 0000000..b662604 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/config.py @@ -0,0 +1,656 @@ +from __future__ import absolute_import, unicode_literals +import io +import os +import sys + +import warnings +import functools +from collections import defaultdict +from functools import partial +from functools import wraps +from importlib import import_module + +from distutils.errors import DistutilsOptionError, DistutilsFileError +from setuptools.extern.packaging.version import LegacyVersion, parse +from setuptools.extern.six import string_types, PY3 + + +__metaclass__ = type + + +def read_configuration( + filepath, find_others=False, ignore_option_errors=False): + """Read given configuration file and returns options from it as a dict. + + :param str|unicode filepath: Path to configuration file + to get options from. + + :param bool find_others: Whether to search for other configuration files + which could be on in various places. + + :param bool ignore_option_errors: Whether to silently ignore + options, values of which could not be resolved (e.g. due to exceptions + in directives such as file:, attr:, etc.). + If False exceptions are propagated as expected. + + :rtype: dict + """ + from setuptools.dist import Distribution, _Distribution + + filepath = os.path.abspath(filepath) + + if not os.path.isfile(filepath): + raise DistutilsFileError( + 'Configuration file %s does not exist.' % filepath) + + current_directory = os.getcwd() + os.chdir(os.path.dirname(filepath)) + + try: + dist = Distribution() + + filenames = dist.find_config_files() if find_others else [] + if filepath not in filenames: + filenames.append(filepath) + + _Distribution.parse_config_files(dist, filenames=filenames) + + handlers = parse_configuration( + dist, dist.command_options, + ignore_option_errors=ignore_option_errors) + + finally: + os.chdir(current_directory) + + return configuration_to_dict(handlers) + + +def _get_option(target_obj, key): + """ + Given a target object and option key, get that option from + the target object, either through a get_{key} method or + from an attribute directly. + """ + getter_name = 'get_{key}'.format(**locals()) + by_attribute = functools.partial(getattr, target_obj, key) + getter = getattr(target_obj, getter_name, by_attribute) + return getter() + + +def configuration_to_dict(handlers): + """Returns configuration data gathered by given handlers as a dict. + + :param list[ConfigHandler] handlers: Handlers list, + usually from parse_configuration() + + :rtype: dict + """ + config_dict = defaultdict(dict) + + for handler in handlers: + for option in handler.set_options: + value = _get_option(handler.target_obj, option) + config_dict[handler.section_prefix][option] = value + + return config_dict + + +def parse_configuration( + distribution, command_options, ignore_option_errors=False): + """Performs additional parsing of configuration options + for a distribution. + + Returns a list of used option handlers. + + :param Distribution distribution: + :param dict command_options: + :param bool ignore_option_errors: Whether to silently ignore + options, values of which could not be resolved (e.g. due to exceptions + in directives such as file:, attr:, etc.). + If False exceptions are propagated as expected. + :rtype: list + """ + options = ConfigOptionsHandler( + distribution, command_options, ignore_option_errors) + options.parse() + + meta = ConfigMetadataHandler( + distribution.metadata, command_options, ignore_option_errors, + distribution.package_dir) + meta.parse() + + return meta, options + + +class ConfigHandler: + """Handles metadata supplied in configuration files.""" + + section_prefix = None + """Prefix for config sections handled by this handler. + Must be provided by class heirs. + + """ + + aliases = {} + """Options aliases. + For compatibility with various packages. E.g.: d2to1 and pbr. + Note: `-` in keys is replaced with `_` by config parser. + + """ + + def __init__(self, target_obj, options, ignore_option_errors=False): + sections = {} + + section_prefix = self.section_prefix + for section_name, section_options in options.items(): + if not section_name.startswith(section_prefix): + continue + + section_name = section_name.replace(section_prefix, '').strip('.') + sections[section_name] = section_options + + self.ignore_option_errors = ignore_option_errors + self.target_obj = target_obj + self.sections = sections + self.set_options = [] + + @property + def parsers(self): + """Metadata item name to parser function mapping.""" + raise NotImplementedError( + '%s must provide .parsers property' % self.__class__.__name__) + + def __setitem__(self, option_name, value): + unknown = tuple() + target_obj = self.target_obj + + # Translate alias into real name. + option_name = self.aliases.get(option_name, option_name) + + current_value = getattr(target_obj, option_name, unknown) + + if current_value is unknown: + raise KeyError(option_name) + + if current_value: + # Already inhabited. Skipping. + return + + skip_option = False + parser = self.parsers.get(option_name) + if parser: + try: + value = parser(value) + + except Exception: + skip_option = True + if not self.ignore_option_errors: + raise + + if skip_option: + return + + setter = getattr(target_obj, 'set_%s' % option_name, None) + if setter is None: + setattr(target_obj, option_name, value) + else: + setter(value) + + self.set_options.append(option_name) + + @classmethod + def _parse_list(cls, value, separator=','): + """Represents value as a list. + + Value is split either by separator (defaults to comma) or by lines. + + :param value: + :param separator: List items separator character. + :rtype: list + """ + if isinstance(value, list): # _get_parser_compound case + return value + + if '\n' in value: + value = value.splitlines() + else: + value = value.split(separator) + + return [chunk.strip() for chunk in value if chunk.strip()] + + @classmethod + def _parse_dict(cls, value): + """Represents value as a dict. + + :param value: + :rtype: dict + """ + separator = '=' + result = {} + for line in cls._parse_list(value): + key, sep, val = line.partition(separator) + if sep != separator: + raise DistutilsOptionError( + 'Unable to parse option value to dict: %s' % value) + result[key.strip()] = val.strip() + + return result + + @classmethod + def _parse_bool(cls, value): + """Represents value as boolean. + + :param value: + :rtype: bool + """ + value = value.lower() + return value in ('1', 'true', 'yes') + + @classmethod + def _exclude_files_parser(cls, key): + """Returns a parser function to make sure field inputs + are not files. + + Parses a value after getting the key so error messages are + more informative. + + :param key: + :rtype: callable + """ + def parser(value): + exclude_directive = 'file:' + if value.startswith(exclude_directive): + raise ValueError( + 'Only strings are accepted for the {0} field, ' + 'files are not accepted'.format(key)) + return value + return parser + + @classmethod + def _parse_file(cls, value): + """Represents value as a string, allowing including text + from nearest files using `file:` directive. + + Directive is sandboxed and won't reach anything outside + directory with setup.py. + + Examples: + file: README.rst, CHANGELOG.md, src/file.txt + + :param str value: + :rtype: str + """ + include_directive = 'file:' + + if not isinstance(value, string_types): + return value + + if not value.startswith(include_directive): + return value + + spec = value[len(include_directive):] + filepaths = (os.path.abspath(path.strip()) for path in spec.split(',')) + return '\n'.join( + cls._read_file(path) + for path in filepaths + if (cls._assert_local(path) or True) + and os.path.isfile(path) + ) + + @staticmethod + def _assert_local(filepath): + if not filepath.startswith(os.getcwd()): + raise DistutilsOptionError( + '`file:` directive can not access %s' % filepath) + + @staticmethod + def _read_file(filepath): + with io.open(filepath, encoding='utf-8') as f: + return f.read() + + @classmethod + def _parse_attr(cls, value, package_dir=None): + """Represents value as a module attribute. + + Examples: + attr: package.attr + attr: package.module.attr + + :param str value: + :rtype: str + """ + attr_directive = 'attr:' + if not value.startswith(attr_directive): + return value + + attrs_path = value.replace(attr_directive, '').strip().split('.') + attr_name = attrs_path.pop() + + module_name = '.'.join(attrs_path) + module_name = module_name or '__init__' + + parent_path = os.getcwd() + if package_dir: + if attrs_path[0] in package_dir: + # A custom path was specified for the module we want to import + custom_path = package_dir[attrs_path[0]] + parts = custom_path.rsplit('/', 1) + if len(parts) > 1: + parent_path = os.path.join(os.getcwd(), parts[0]) + module_name = parts[1] + else: + module_name = custom_path + elif '' in package_dir: + # A custom parent directory was specified for all root modules + parent_path = os.path.join(os.getcwd(), package_dir['']) + sys.path.insert(0, parent_path) + try: + module = import_module(module_name) + value = getattr(module, attr_name) + + finally: + sys.path = sys.path[1:] + + return value + + @classmethod + def _get_parser_compound(cls, *parse_methods): + """Returns parser function to represents value as a list. + + Parses a value applying given methods one after another. + + :param parse_methods: + :rtype: callable + """ + def parse(value): + parsed = value + + for method in parse_methods: + parsed = method(parsed) + + return parsed + + return parse + + @classmethod + def _parse_section_to_dict(cls, section_options, values_parser=None): + """Parses section options into a dictionary. + + Optionally applies a given parser to values. + + :param dict section_options: + :param callable values_parser: + :rtype: dict + """ + value = {} + values_parser = values_parser or (lambda val: val) + for key, (_, val) in section_options.items(): + value[key] = values_parser(val) + return value + + def parse_section(self, section_options): + """Parses configuration file section. + + :param dict section_options: + """ + for (name, (_, value)) in section_options.items(): + try: + self[name] = value + + except KeyError: + pass # Keep silent for a new option may appear anytime. + + def parse(self): + """Parses configuration file items from one + or more related sections. + + """ + for section_name, section_options in self.sections.items(): + + method_postfix = '' + if section_name: # [section.option] variant + method_postfix = '_%s' % section_name + + section_parser_method = getattr( + self, + # Dots in section names are translated into dunderscores. + ('parse_section%s' % method_postfix).replace('.', '__'), + None) + + if section_parser_method is None: + raise DistutilsOptionError( + 'Unsupported distribution option section: [%s.%s]' % ( + self.section_prefix, section_name)) + + section_parser_method(section_options) + + def _deprecated_config_handler(self, func, msg, warning_class): + """ this function will wrap around parameters that are deprecated + + :param msg: deprecation message + :param warning_class: class of warning exception to be raised + :param func: function to be wrapped around + """ + @wraps(func) + def config_handler(*args, **kwargs): + warnings.warn(msg, warning_class) + return func(*args, **kwargs) + + return config_handler + + +class ConfigMetadataHandler(ConfigHandler): + + section_prefix = 'metadata' + + aliases = { + 'home_page': 'url', + 'summary': 'description', + 'classifier': 'classifiers', + 'platform': 'platforms', + } + + strict_mode = False + """We need to keep it loose, to be partially compatible with + `pbr` and `d2to1` packages which also uses `metadata` section. + + """ + + def __init__(self, target_obj, options, ignore_option_errors=False, + package_dir=None): + super(ConfigMetadataHandler, self).__init__(target_obj, options, + ignore_option_errors) + self.package_dir = package_dir + + @property + def parsers(self): + """Metadata item name to parser function mapping.""" + parse_list = self._parse_list + parse_file = self._parse_file + parse_dict = self._parse_dict + exclude_files_parser = self._exclude_files_parser + + return { + 'platforms': parse_list, + 'keywords': parse_list, + 'provides': parse_list, + 'requires': self._deprecated_config_handler( + parse_list, + "The requires parameter is deprecated, please use " + "install_requires for runtime dependencies.", + DeprecationWarning), + 'obsoletes': parse_list, + 'classifiers': self._get_parser_compound(parse_file, parse_list), + 'license': exclude_files_parser('license'), + 'description': parse_file, + 'long_description': parse_file, + 'version': self._parse_version, + 'project_urls': parse_dict, + } + + def _parse_version(self, value): + """Parses `version` option value. + + :param value: + :rtype: str + + """ + version = self._parse_file(value) + + if version != value: + version = version.strip() + # Be strict about versions loaded from file because it's easy to + # accidentally include newlines and other unintended content + if isinstance(parse(version), LegacyVersion): + tmpl = ( + 'Version loaded from {value} does not ' + 'comply with PEP 440: {version}' + ) + raise DistutilsOptionError(tmpl.format(**locals())) + + return version + + version = self._parse_attr(value, self.package_dir) + + if callable(version): + version = version() + + if not isinstance(version, string_types): + if hasattr(version, '__iter__'): + version = '.'.join(map(str, version)) + else: + version = '%s' % version + + return version + + +class ConfigOptionsHandler(ConfigHandler): + + section_prefix = 'options' + + @property + def parsers(self): + """Metadata item name to parser function mapping.""" + parse_list = self._parse_list + parse_list_semicolon = partial(self._parse_list, separator=';') + parse_bool = self._parse_bool + parse_dict = self._parse_dict + + return { + 'zip_safe': parse_bool, + 'use_2to3': parse_bool, + 'include_package_data': parse_bool, + 'package_dir': parse_dict, + 'use_2to3_fixers': parse_list, + 'use_2to3_exclude_fixers': parse_list, + 'convert_2to3_doctests': parse_list, + 'scripts': parse_list, + 'eager_resources': parse_list, + 'dependency_links': parse_list, + 'namespace_packages': parse_list, + 'install_requires': parse_list_semicolon, + 'setup_requires': parse_list_semicolon, + 'tests_require': parse_list_semicolon, + 'packages': self._parse_packages, + 'entry_points': self._parse_file, + 'py_modules': parse_list, + } + + def _parse_packages(self, value): + """Parses `packages` option value. + + :param value: + :rtype: list + """ + find_directives = ['find:', 'find_namespace:'] + trimmed_value = value.strip() + + if trimmed_value not in find_directives: + return self._parse_list(value) + + findns = trimmed_value == find_directives[1] + if findns and not PY3: + raise DistutilsOptionError( + 'find_namespace: directive is unsupported on Python < 3.3') + + # Read function arguments from a dedicated section. + find_kwargs = self.parse_section_packages__find( + self.sections.get('packages.find', {})) + + if findns: + from setuptools import find_namespace_packages as find_packages + else: + from setuptools import find_packages + + return find_packages(**find_kwargs) + + def parse_section_packages__find(self, section_options): + """Parses `packages.find` configuration file section. + + To be used in conjunction with _parse_packages(). + + :param dict section_options: + """ + section_data = self._parse_section_to_dict( + section_options, self._parse_list) + + valid_keys = ['where', 'include', 'exclude'] + + find_kwargs = dict( + [(k, v) for k, v in section_data.items() if k in valid_keys and v]) + + where = find_kwargs.get('where') + if where is not None: + find_kwargs['where'] = where[0] # cast list to single val + + return find_kwargs + + def parse_section_entry_points(self, section_options): + """Parses `entry_points` configuration file section. + + :param dict section_options: + """ + parsed = self._parse_section_to_dict(section_options, self._parse_list) + self['entry_points'] = parsed + + def _parse_package_data(self, section_options): + parsed = self._parse_section_to_dict(section_options, self._parse_list) + + root = parsed.get('*') + if root: + parsed[''] = root + del parsed['*'] + + return parsed + + def parse_section_package_data(self, section_options): + """Parses `package_data` configuration file section. + + :param dict section_options: + """ + self['package_data'] = self._parse_package_data(section_options) + + def parse_section_exclude_package_data(self, section_options): + """Parses `exclude_package_data` configuration file section. + + :param dict section_options: + """ + self['exclude_package_data'] = self._parse_package_data( + section_options) + + def parse_section_extras_require(self, section_options): + """Parses `extras_require` configuration file section. + + :param dict section_options: + """ + parse_list = partial(self._parse_list, separator=';') + self['extras_require'] = self._parse_section_to_dict( + section_options, parse_list) + + def parse_section_data_files(self, section_options): + """Parses `data_files` configuration file section. + + :param dict section_options: + """ + parsed = self._parse_section_to_dict(section_options, self._parse_list) + self['data_files'] = [(k, v) for k, v in parsed.items()] diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/dep_util.py b/mongo_mac/lib/python3.6/site-packages/setuptools/dep_util.py new file mode 100644 index 0000000..2931c13 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/dep_util.py @@ -0,0 +1,23 @@ +from distutils.dep_util import newer_group + +# yes, this is was almost entirely copy-pasted from +# 'newer_pairwise()', this is just another convenience +# function. +def newer_pairwise_group(sources_groups, targets): + """Walk both arguments in parallel, testing if each source group is newer + than its corresponding target. Returns a pair of lists (sources_groups, + targets) where sources is newer than target, according to the semantics + of 'newer_group()'. + """ + if len(sources_groups) != len(targets): + raise ValueError("'sources_group' and 'targets' must be the same length") + + # build a pair of lists (sources_groups, targets) where source is newer + n_sources = [] + n_targets = [] + for i in range(len(sources_groups)): + if newer_group(sources_groups[i], targets[i]): + n_sources.append(sources_groups[i]) + n_targets.append(targets[i]) + + return n_sources, n_targets diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/depends.py b/mongo_mac/lib/python3.6/site-packages/setuptools/depends.py new file mode 100644 index 0000000..45e7052 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/depends.py @@ -0,0 +1,186 @@ +import sys +import imp +import marshal +from distutils.version import StrictVersion +from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN + +from .py33compat import Bytecode + + +__all__ = [ + 'Require', 'find_module', 'get_module_constant', 'extract_constant' +] + + +class Require: + """A prerequisite to building or installing a distribution""" + + def __init__(self, name, requested_version, module, homepage='', + attribute=None, format=None): + + if format is None and requested_version is not None: + format = StrictVersion + + if format is not None: + requested_version = format(requested_version) + if attribute is None: + attribute = '__version__' + + self.__dict__.update(locals()) + del self.self + + def full_name(self): + """Return full package/distribution name, w/version""" + if self.requested_version is not None: + return '%s-%s' % (self.name, self.requested_version) + return self.name + + def version_ok(self, version): + """Is 'version' sufficiently up-to-date?""" + return self.attribute is None or self.format is None or \ + str(version) != "unknown" and version >= self.requested_version + + def get_version(self, paths=None, default="unknown"): + """Get version number of installed module, 'None', or 'default' + + Search 'paths' for module. If not found, return 'None'. If found, + return the extracted version attribute, or 'default' if no version + attribute was specified, or the value cannot be determined without + importing the module. The version is formatted according to the + requirement's version format (if any), unless it is 'None' or the + supplied 'default'. + """ + + if self.attribute is None: + try: + f, p, i = find_module(self.module, paths) + if f: + f.close() + return default + except ImportError: + return None + + v = get_module_constant(self.module, self.attribute, default, paths) + + if v is not None and v is not default and self.format is not None: + return self.format(v) + + return v + + def is_present(self, paths=None): + """Return true if dependency is present on 'paths'""" + return self.get_version(paths) is not None + + def is_current(self, paths=None): + """Return true if dependency is present and up-to-date on 'paths'""" + version = self.get_version(paths) + if version is None: + return False + return self.version_ok(version) + + +def find_module(module, paths=None): + """Just like 'imp.find_module()', but with package support""" + + parts = module.split('.') + + while parts: + part = parts.pop(0) + f, path, (suffix, mode, kind) = info = imp.find_module(part, paths) + + if kind == PKG_DIRECTORY: + parts = parts or ['__init__'] + paths = [path] + + elif parts: + raise ImportError("Can't find %r in %s" % (parts, module)) + + return info + + +def get_module_constant(module, symbol, default=-1, paths=None): + """Find 'module' by searching 'paths', and extract 'symbol' + + Return 'None' if 'module' does not exist on 'paths', or it does not define + 'symbol'. If the module defines 'symbol' as a constant, return the + constant. Otherwise, return 'default'.""" + + try: + f, path, (suffix, mode, kind) = find_module(module, paths) + except ImportError: + # Module doesn't exist + return None + + try: + if kind == PY_COMPILED: + f.read(8) # skip magic & date + code = marshal.load(f) + elif kind == PY_FROZEN: + code = imp.get_frozen_object(module) + elif kind == PY_SOURCE: + code = compile(f.read(), path, 'exec') + else: + # Not something we can parse; we'll have to import it. :( + if module not in sys.modules: + imp.load_module(module, f, path, (suffix, mode, kind)) + return getattr(sys.modules[module], symbol, None) + + finally: + if f: + f.close() + + return extract_constant(code, symbol, default) + + +def extract_constant(code, symbol, default=-1): + """Extract the constant value of 'symbol' from 'code' + + If the name 'symbol' is bound to a constant value by the Python code + object 'code', return that value. If 'symbol' is bound to an expression, + return 'default'. Otherwise, return 'None'. + + Return value is based on the first assignment to 'symbol'. 'symbol' must + be a global, or at least a non-"fast" local in the code block. That is, + only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol' + must be present in 'code.co_names'. + """ + if symbol not in code.co_names: + # name's not there, can't possibly be an assignment + return None + + name_idx = list(code.co_names).index(symbol) + + STORE_NAME = 90 + STORE_GLOBAL = 97 + LOAD_CONST = 100 + + const = default + + for byte_code in Bytecode(code): + op = byte_code.opcode + arg = byte_code.arg + + if op == LOAD_CONST: + const = code.co_consts[arg] + elif arg == name_idx and (op == STORE_NAME or op == STORE_GLOBAL): + return const + else: + const = default + + +def _update_globals(): + """ + Patch the globals to remove the objects not available on some platforms. + + XXX it'd be better to test assertions about bytecode instead. + """ + + if not sys.platform.startswith('java') and sys.platform != 'cli': + return + incompatible = 'extract_constant', 'get_module_constant' + for name in incompatible: + del globals()[name] + __all__.remove(name) + + +_update_globals() diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/dist.py b/mongo_mac/lib/python3.6/site-packages/setuptools/dist.py new file mode 100644 index 0000000..9a165de --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/dist.py @@ -0,0 +1,1278 @@ +# -*- coding: utf-8 -*- +__all__ = ['Distribution'] + +import io +import sys +import re +import os +import warnings +import numbers +import distutils.log +import distutils.core +import distutils.cmd +import distutils.dist +from distutils.util import strtobool +from distutils.debug import DEBUG +from distutils.fancy_getopt import translate_longopt +import itertools + +from collections import defaultdict +from email import message_from_file + +from distutils.errors import ( + DistutilsOptionError, DistutilsPlatformError, DistutilsSetupError, +) +from distutils.util import rfc822_escape +from distutils.version import StrictVersion + +from setuptools.extern import six +from setuptools.extern import packaging +from setuptools.extern.six.moves import map, filter, filterfalse + +from . import SetuptoolsDeprecationWarning + +from setuptools.depends import Require +from setuptools import windows_support +from setuptools.monkey import get_unpatched +from setuptools.config import parse_configuration +import pkg_resources + +__import__('setuptools.extern.packaging.specifiers') +__import__('setuptools.extern.packaging.version') + + +def _get_unpatched(cls): + warnings.warn("Do not call this function", DistDeprecationWarning) + return get_unpatched(cls) + + +def get_metadata_version(self): + mv = getattr(self, 'metadata_version', None) + + if mv is None: + if self.long_description_content_type or self.provides_extras: + mv = StrictVersion('2.1') + elif (self.maintainer is not None or + self.maintainer_email is not None or + getattr(self, 'python_requires', None) is not None): + mv = StrictVersion('1.2') + elif (self.provides or self.requires or self.obsoletes or + self.classifiers or self.download_url): + mv = StrictVersion('1.1') + else: + mv = StrictVersion('1.0') + + self.metadata_version = mv + + return mv + + +def read_pkg_file(self, file): + """Reads the metadata values from a file object.""" + msg = message_from_file(file) + + def _read_field(name): + value = msg[name] + if value == 'UNKNOWN': + return None + return value + + def _read_list(name): + values = msg.get_all(name, None) + if values == []: + return None + return values + + self.metadata_version = StrictVersion(msg['metadata-version']) + self.name = _read_field('name') + self.version = _read_field('version') + self.description = _read_field('summary') + # we are filling author only. + self.author = _read_field('author') + self.maintainer = None + self.author_email = _read_field('author-email') + self.maintainer_email = None + self.url = _read_field('home-page') + self.license = _read_field('license') + + if 'download-url' in msg: + self.download_url = _read_field('download-url') + else: + self.download_url = None + + self.long_description = _read_field('description') + self.description = _read_field('summary') + + if 'keywords' in msg: + self.keywords = _read_field('keywords').split(',') + + self.platforms = _read_list('platform') + self.classifiers = _read_list('classifier') + + # PEP 314 - these fields only exist in 1.1 + if self.metadata_version == StrictVersion('1.1'): + self.requires = _read_list('requires') + self.provides = _read_list('provides') + self.obsoletes = _read_list('obsoletes') + else: + self.requires = None + self.provides = None + self.obsoletes = None + + +# Based on Python 3.5 version +def write_pkg_file(self, file): + """Write the PKG-INFO format data to a file object. + """ + version = self.get_metadata_version() + + if six.PY2: + def write_field(key, value): + file.write("%s: %s\n" % (key, self._encode_field(value))) + else: + def write_field(key, value): + file.write("%s: %s\n" % (key, value)) + + write_field('Metadata-Version', str(version)) + write_field('Name', self.get_name()) + write_field('Version', self.get_version()) + write_field('Summary', self.get_description()) + write_field('Home-page', self.get_url()) + + if version < StrictVersion('1.2'): + write_field('Author', self.get_contact()) + write_field('Author-email', self.get_contact_email()) + else: + optional_fields = ( + ('Author', 'author'), + ('Author-email', 'author_email'), + ('Maintainer', 'maintainer'), + ('Maintainer-email', 'maintainer_email'), + ) + + for field, attr in optional_fields: + attr_val = getattr(self, attr) + + if attr_val is not None: + write_field(field, attr_val) + + write_field('License', self.get_license()) + if self.download_url: + write_field('Download-URL', self.download_url) + for project_url in self.project_urls.items(): + write_field('Project-URL', '%s, %s' % project_url) + + long_desc = rfc822_escape(self.get_long_description()) + write_field('Description', long_desc) + + keywords = ','.join(self.get_keywords()) + if keywords: + write_field('Keywords', keywords) + + if version >= StrictVersion('1.2'): + for platform in self.get_platforms(): + write_field('Platform', platform) + else: + self._write_list(file, 'Platform', self.get_platforms()) + + self._write_list(file, 'Classifier', self.get_classifiers()) + + # PEP 314 + self._write_list(file, 'Requires', self.get_requires()) + self._write_list(file, 'Provides', self.get_provides()) + self._write_list(file, 'Obsoletes', self.get_obsoletes()) + + # Setuptools specific for PEP 345 + if hasattr(self, 'python_requires'): + write_field('Requires-Python', self.python_requires) + + # PEP 566 + if self.long_description_content_type: + write_field( + 'Description-Content-Type', + self.long_description_content_type + ) + if self.provides_extras: + for extra in self.provides_extras: + write_field('Provides-Extra', extra) + + +sequence = tuple, list + + +def check_importable(dist, attr, value): + try: + ep = pkg_resources.EntryPoint.parse('x=' + value) + assert not ep.extras + except (TypeError, ValueError, AttributeError, AssertionError): + raise DistutilsSetupError( + "%r must be importable 'module:attrs' string (got %r)" + % (attr, value) + ) + + +def assert_string_list(dist, attr, value): + """Verify that value is a string list or None""" + try: + assert ''.join(value) != value + except (TypeError, ValueError, AttributeError, AssertionError): + raise DistutilsSetupError( + "%r must be a list of strings (got %r)" % (attr, value) + ) + + +def check_nsp(dist, attr, value): + """Verify that namespace packages are valid""" + ns_packages = value + assert_string_list(dist, attr, ns_packages) + for nsp in ns_packages: + if not dist.has_contents_for(nsp): + raise DistutilsSetupError( + "Distribution contains no modules or packages for " + + "namespace package %r" % nsp + ) + parent, sep, child = nsp.rpartition('.') + if parent and parent not in ns_packages: + distutils.log.warn( + "WARNING: %r is declared as a package namespace, but %r" + " is not: please correct this in setup.py", nsp, parent + ) + + +def check_extras(dist, attr, value): + """Verify that extras_require mapping is valid""" + try: + list(itertools.starmap(_check_extra, value.items())) + except (TypeError, ValueError, AttributeError): + raise DistutilsSetupError( + "'extras_require' must be a dictionary whose values are " + "strings or lists of strings containing valid project/version " + "requirement specifiers." + ) + + +def _check_extra(extra, reqs): + name, sep, marker = extra.partition(':') + if marker and pkg_resources.invalid_marker(marker): + raise DistutilsSetupError("Invalid environment marker: " + marker) + list(pkg_resources.parse_requirements(reqs)) + + +def assert_bool(dist, attr, value): + """Verify that value is True, False, 0, or 1""" + if bool(value) != value: + tmpl = "{attr!r} must be a boolean value (got {value!r})" + raise DistutilsSetupError(tmpl.format(attr=attr, value=value)) + + +def check_requirements(dist, attr, value): + """Verify that install_requires is a valid requirements list""" + try: + list(pkg_resources.parse_requirements(value)) + if isinstance(value, (dict, set)): + raise TypeError("Unordered types are not allowed") + except (TypeError, ValueError) as error: + tmpl = ( + "{attr!r} must be a string or list of strings " + "containing valid project/version requirement specifiers; {error}" + ) + raise DistutilsSetupError(tmpl.format(attr=attr, error=error)) + + +def check_specifier(dist, attr, value): + """Verify that value is a valid version specifier""" + try: + packaging.specifiers.SpecifierSet(value) + except packaging.specifiers.InvalidSpecifier as error: + tmpl = ( + "{attr!r} must be a string " + "containing valid version specifiers; {error}" + ) + raise DistutilsSetupError(tmpl.format(attr=attr, error=error)) + + +def check_entry_points(dist, attr, value): + """Verify that entry_points map is parseable""" + try: + pkg_resources.EntryPoint.parse_map(value) + except ValueError as e: + raise DistutilsSetupError(e) + + +def check_test_suite(dist, attr, value): + if not isinstance(value, six.string_types): + raise DistutilsSetupError("test_suite must be a string") + + +def check_package_data(dist, attr, value): + """Verify that value is a dictionary of package names to glob lists""" + if isinstance(value, dict): + for k, v in value.items(): + if not isinstance(k, str): + break + try: + iter(v) + except TypeError: + break + else: + return + raise DistutilsSetupError( + attr + " must be a dictionary mapping package names to lists of " + "wildcard patterns" + ) + + +def check_packages(dist, attr, value): + for pkgname in value: + if not re.match(r'\w+(\.\w+)*', pkgname): + distutils.log.warn( + "WARNING: %r not a valid package name; please use only " + ".-separated package names in setup.py", pkgname + ) + + +_Distribution = get_unpatched(distutils.core.Distribution) + + +class Distribution(_Distribution): + """Distribution with support for features, tests, and package data + + This is an enhanced version of 'distutils.dist.Distribution' that + effectively adds the following new optional keyword arguments to 'setup()': + + 'install_requires' -- a string or sequence of strings specifying project + versions that the distribution requires when installed, in the format + used by 'pkg_resources.require()'. They will be installed + automatically when the package is installed. If you wish to use + packages that are not available in PyPI, or want to give your users an + alternate download location, you can add a 'find_links' option to the + '[easy_install]' section of your project's 'setup.cfg' file, and then + setuptools will scan the listed web pages for links that satisfy the + requirements. + + 'extras_require' -- a dictionary mapping names of optional "extras" to the + additional requirement(s) that using those extras incurs. For example, + this:: + + extras_require = dict(reST = ["docutils>=0.3", "reSTedit"]) + + indicates that the distribution can optionally provide an extra + capability called "reST", but it can only be used if docutils and + reSTedit are installed. If the user installs your package using + EasyInstall and requests one of your extras, the corresponding + additional requirements will be installed if needed. + + 'features' **deprecated** -- a dictionary mapping option names to + 'setuptools.Feature' + objects. Features are a portion of the distribution that can be + included or excluded based on user options, inter-feature dependencies, + and availability on the current system. Excluded features are omitted + from all setup commands, including source and binary distributions, so + you can create multiple distributions from the same source tree. + Feature names should be valid Python identifiers, except that they may + contain the '-' (minus) sign. Features can be included or excluded + via the command line options '--with-X' and '--without-X', where 'X' is + the name of the feature. Whether a feature is included by default, and + whether you are allowed to control this from the command line, is + determined by the Feature object. See the 'Feature' class for more + information. + + 'test_suite' -- the name of a test suite to run for the 'test' command. + If the user runs 'python setup.py test', the package will be installed, + and the named test suite will be run. The format is the same as + would be used on a 'unittest.py' command line. That is, it is the + dotted name of an object to import and call to generate a test suite. + + 'package_data' -- a dictionary mapping package names to lists of filenames + or globs to use to find data files contained in the named packages. + If the dictionary has filenames or globs listed under '""' (the empty + string), those names will be searched for in every package, in addition + to any names for the specific package. Data files found using these + names/globs will be installed along with the package, in the same + location as the package. Note that globs are allowed to reference + the contents of non-package subdirectories, as long as you use '/' as + a path separator. (Globs are automatically converted to + platform-specific paths at runtime.) + + In addition to these new keywords, this class also has several new methods + for manipulating the distribution's contents. For example, the 'include()' + and 'exclude()' methods can be thought of as in-place add and subtract + commands that add or remove packages, modules, extensions, and so on from + the distribution. They are used by the feature subsystem to configure the + distribution for the included and excluded features. + """ + + _DISTUTILS_UNSUPPORTED_METADATA = { + 'long_description_content_type': None, + 'project_urls': dict, + 'provides_extras': set, + } + + _patched_dist = None + + def patch_missing_pkg_info(self, attrs): + # Fake up a replacement for the data that would normally come from + # PKG-INFO, but which might not yet be built if this is a fresh + # checkout. + # + if not attrs or 'name' not in attrs or 'version' not in attrs: + return + key = pkg_resources.safe_name(str(attrs['name'])).lower() + dist = pkg_resources.working_set.by_key.get(key) + if dist is not None and not dist.has_metadata('PKG-INFO'): + dist._version = pkg_resources.safe_version(str(attrs['version'])) + self._patched_dist = dist + + def __init__(self, attrs=None): + have_package_data = hasattr(self, "package_data") + if not have_package_data: + self.package_data = {} + attrs = attrs or {} + if 'features' in attrs or 'require_features' in attrs: + Feature.warn_deprecated() + self.require_features = [] + self.features = {} + self.dist_files = [] + # Filter-out setuptools' specific options. + self.src_root = attrs.pop("src_root", None) + self.patch_missing_pkg_info(attrs) + self.dependency_links = attrs.pop('dependency_links', []) + self.setup_requires = attrs.pop('setup_requires', []) + for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): + vars(self).setdefault(ep.name, None) + _Distribution.__init__(self, { + k: v for k, v in attrs.items() + if k not in self._DISTUTILS_UNSUPPORTED_METADATA + }) + + # Fill-in missing metadata fields not supported by distutils. + # Note some fields may have been set by other tools (e.g. pbr) + # above; they are taken preferrentially to setup() arguments + for option, default in self._DISTUTILS_UNSUPPORTED_METADATA.items(): + for source in self.metadata.__dict__, attrs: + if option in source: + value = source[option] + break + else: + value = default() if default else None + setattr(self.metadata, option, value) + + if isinstance(self.metadata.version, numbers.Number): + # Some people apparently take "version number" too literally :) + self.metadata.version = str(self.metadata.version) + + if self.metadata.version is not None: + try: + ver = packaging.version.Version(self.metadata.version) + normalized_version = str(ver) + if self.metadata.version != normalized_version: + warnings.warn( + "Normalizing '%s' to '%s'" % ( + self.metadata.version, + normalized_version, + ) + ) + self.metadata.version = normalized_version + except (packaging.version.InvalidVersion, TypeError): + warnings.warn( + "The version specified (%r) is an invalid version, this " + "may not work as expected with newer versions of " + "setuptools, pip, and PyPI. Please see PEP 440 for more " + "details." % self.metadata.version + ) + self._finalize_requires() + + def _finalize_requires(self): + """ + Set `metadata.python_requires` and fix environment markers + in `install_requires` and `extras_require`. + """ + if getattr(self, 'python_requires', None): + self.metadata.python_requires = self.python_requires + + if getattr(self, 'extras_require', None): + for extra in self.extras_require.keys(): + # Since this gets called multiple times at points where the + # keys have become 'converted' extras, ensure that we are only + # truly adding extras we haven't seen before here. + extra = extra.split(':')[0] + if extra: + self.metadata.provides_extras.add(extra) + + self._convert_extras_requirements() + self._move_install_requirements_markers() + + def _convert_extras_requirements(self): + """ + Convert requirements in `extras_require` of the form + `"extra": ["barbazquux; {marker}"]` to + `"extra:{marker}": ["barbazquux"]`. + """ + spec_ext_reqs = getattr(self, 'extras_require', None) or {} + self._tmp_extras_require = defaultdict(list) + for section, v in spec_ext_reqs.items(): + # Do not strip empty sections. + self._tmp_extras_require[section] + for r in pkg_resources.parse_requirements(v): + suffix = self._suffix_for(r) + self._tmp_extras_require[section + suffix].append(r) + + @staticmethod + def _suffix_for(req): + """ + For a requirement, return the 'extras_require' suffix for + that requirement. + """ + return ':' + str(req.marker) if req.marker else '' + + def _move_install_requirements_markers(self): + """ + Move requirements in `install_requires` that are using environment + markers `extras_require`. + """ + + # divide the install_requires into two sets, simple ones still + # handled by install_requires and more complex ones handled + # by extras_require. + + def is_simple_req(req): + return not req.marker + + spec_inst_reqs = getattr(self, 'install_requires', None) or () + inst_reqs = list(pkg_resources.parse_requirements(spec_inst_reqs)) + simple_reqs = filter(is_simple_req, inst_reqs) + complex_reqs = filterfalse(is_simple_req, inst_reqs) + self.install_requires = list(map(str, simple_reqs)) + + for r in complex_reqs: + self._tmp_extras_require[':' + str(r.marker)].append(r) + self.extras_require = dict( + (k, [str(r) for r in map(self._clean_req, v)]) + for k, v in self._tmp_extras_require.items() + ) + + def _clean_req(self, req): + """ + Given a Requirement, remove environment markers and return it. + """ + req.marker = None + return req + + def _parse_config_files(self, filenames=None): + """ + Adapted from distutils.dist.Distribution.parse_config_files, + this method provides the same functionality in subtly-improved + ways. + """ + from setuptools.extern.six.moves.configparser import ConfigParser + + # Ignore install directory options if we have a venv + if six.PY3 and sys.prefix != sys.base_prefix: + ignore_options = [ + 'install-base', 'install-platbase', 'install-lib', + 'install-platlib', 'install-purelib', 'install-headers', + 'install-scripts', 'install-data', 'prefix', 'exec-prefix', + 'home', 'user', 'root'] + else: + ignore_options = [] + + ignore_options = frozenset(ignore_options) + + if filenames is None: + filenames = self.find_config_files() + + if DEBUG: + self.announce("Distribution.parse_config_files():") + + parser = ConfigParser() + for filename in filenames: + with io.open(filename, encoding='utf-8') as reader: + if DEBUG: + self.announce(" reading {filename}".format(**locals())) + (parser.read_file if six.PY3 else parser.readfp)(reader) + for section in parser.sections(): + options = parser.options(section) + opt_dict = self.get_option_dict(section) + + for opt in options: + if opt != '__name__' and opt not in ignore_options: + val = self._try_str(parser.get(section, opt)) + opt = opt.replace('-', '_') + opt_dict[opt] = (filename, val) + + # Make the ConfigParser forget everything (so we retain + # the original filenames that options come from) + parser.__init__() + + # If there was a "global" section in the config file, use it + # to set Distribution options. + + if 'global' in self.command_options: + for (opt, (src, val)) in self.command_options['global'].items(): + alias = self.negative_opt.get(opt) + try: + if alias: + setattr(self, alias, not strtobool(val)) + elif opt in ('verbose', 'dry_run'): # ugh! + setattr(self, opt, strtobool(val)) + else: + setattr(self, opt, val) + except ValueError as msg: + raise DistutilsOptionError(msg) + + @staticmethod + def _try_str(val): + """ + On Python 2, much of distutils relies on string values being of + type 'str' (bytes) and not unicode text. If the value can be safely + encoded to bytes using the default encoding, prefer that. + + Why the default encoding? Because that value can be implicitly + decoded back to text if needed. + + Ref #1653 + """ + if six.PY3: + return val + try: + return val.encode() + except UnicodeEncodeError: + pass + return val + + def _set_command_options(self, command_obj, option_dict=None): + """ + Set the options for 'command_obj' from 'option_dict'. Basically + this means copying elements of a dictionary ('option_dict') to + attributes of an instance ('command'). + + 'command_obj' must be a Command instance. If 'option_dict' is not + supplied, uses the standard option dictionary for this command + (from 'self.command_options'). + + (Adopted from distutils.dist.Distribution._set_command_options) + """ + command_name = command_obj.get_command_name() + if option_dict is None: + option_dict = self.get_option_dict(command_name) + + if DEBUG: + self.announce(" setting options for '%s' command:" % command_name) + for (option, (source, value)) in option_dict.items(): + if DEBUG: + self.announce(" %s = %s (from %s)" % (option, value, + source)) + try: + bool_opts = [translate_longopt(o) + for o in command_obj.boolean_options] + except AttributeError: + bool_opts = [] + try: + neg_opt = command_obj.negative_opt + except AttributeError: + neg_opt = {} + + try: + is_string = isinstance(value, six.string_types) + if option in neg_opt and is_string: + setattr(command_obj, neg_opt[option], not strtobool(value)) + elif option in bool_opts and is_string: + setattr(command_obj, option, strtobool(value)) + elif hasattr(command_obj, option): + setattr(command_obj, option, value) + else: + raise DistutilsOptionError( + "error in %s: command '%s' has no such option '%s'" + % (source, command_name, option)) + except ValueError as msg: + raise DistutilsOptionError(msg) + + def parse_config_files(self, filenames=None, ignore_option_errors=False): + """Parses configuration files from various levels + and loads configuration. + + """ + self._parse_config_files(filenames=filenames) + + parse_configuration(self, self.command_options, + ignore_option_errors=ignore_option_errors) + self._finalize_requires() + + def parse_command_line(self): + """Process features after parsing command line options""" + result = _Distribution.parse_command_line(self) + if self.features: + self._finalize_features() + return result + + def _feature_attrname(self, name): + """Convert feature name to corresponding option attribute name""" + return 'with_' + name.replace('-', '_') + + def fetch_build_eggs(self, requires): + """Resolve pre-setup requirements""" + resolved_dists = pkg_resources.working_set.resolve( + pkg_resources.parse_requirements(requires), + installer=self.fetch_build_egg, + replace_conflicting=True, + ) + for dist in resolved_dists: + pkg_resources.working_set.add(dist, replace=True) + return resolved_dists + + def finalize_options(self): + _Distribution.finalize_options(self) + if self.features: + self._set_global_opts_from_features() + + for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): + value = getattr(self, ep.name, None) + if value is not None: + ep.require(installer=self.fetch_build_egg) + ep.load()(self, ep.name, value) + if getattr(self, 'convert_2to3_doctests', None): + # XXX may convert to set here when we can rely on set being builtin + self.convert_2to3_doctests = [ + os.path.abspath(p) + for p in self.convert_2to3_doctests + ] + else: + self.convert_2to3_doctests = [] + + def get_egg_cache_dir(self): + egg_cache_dir = os.path.join(os.curdir, '.eggs') + if not os.path.exists(egg_cache_dir): + os.mkdir(egg_cache_dir) + windows_support.hide_file(egg_cache_dir) + readme_txt_filename = os.path.join(egg_cache_dir, 'README.txt') + with open(readme_txt_filename, 'w') as f: + f.write('This directory contains eggs that were downloaded ' + 'by setuptools to build, test, and run plug-ins.\n\n') + f.write('This directory caches those eggs to prevent ' + 'repeated downloads.\n\n') + f.write('However, it is safe to delete this directory.\n\n') + + return egg_cache_dir + + def fetch_build_egg(self, req): + """Fetch an egg needed for building""" + from setuptools.command.easy_install import easy_install + dist = self.__class__({'script_args': ['easy_install']}) + opts = dist.get_option_dict('easy_install') + opts.clear() + opts.update( + (k, v) + for k, v in self.get_option_dict('easy_install').items() + if k in ( + # don't use any other settings + 'find_links', 'site_dirs', 'index_url', + 'optimize', 'site_dirs', 'allow_hosts', + )) + if self.dependency_links: + links = self.dependency_links[:] + if 'find_links' in opts: + links = opts['find_links'][1] + links + opts['find_links'] = ('setup', links) + install_dir = self.get_egg_cache_dir() + cmd = easy_install( + dist, args=["x"], install_dir=install_dir, + exclude_scripts=True, + always_copy=False, build_directory=None, editable=False, + upgrade=False, multi_version=True, no_report=True, user=False + ) + cmd.ensure_finalized() + return cmd.easy_install(req) + + def _set_global_opts_from_features(self): + """Add --with-X/--without-X options based on optional features""" + + go = [] + no = self.negative_opt.copy() + + for name, feature in self.features.items(): + self._set_feature(name, None) + feature.validate(self) + + if feature.optional: + descr = feature.description + incdef = ' (default)' + excdef = '' + if not feature.include_by_default(): + excdef, incdef = incdef, excdef + + new = ( + ('with-' + name, None, 'include ' + descr + incdef), + ('without-' + name, None, 'exclude ' + descr + excdef), + ) + go.extend(new) + no['without-' + name] = 'with-' + name + + self.global_options = self.feature_options = go + self.global_options + self.negative_opt = self.feature_negopt = no + + def _finalize_features(self): + """Add/remove features and resolve dependencies between them""" + + # First, flag all the enabled items (and thus their dependencies) + for name, feature in self.features.items(): + enabled = self.feature_is_included(name) + if enabled or (enabled is None and feature.include_by_default()): + feature.include_in(self) + self._set_feature(name, 1) + + # Then disable the rest, so that off-by-default features don't + # get flagged as errors when they're required by an enabled feature + for name, feature in self.features.items(): + if not self.feature_is_included(name): + feature.exclude_from(self) + self._set_feature(name, 0) + + def get_command_class(self, command): + """Pluggable version of get_command_class()""" + if command in self.cmdclass: + return self.cmdclass[command] + + eps = pkg_resources.iter_entry_points('distutils.commands', command) + for ep in eps: + ep.require(installer=self.fetch_build_egg) + self.cmdclass[command] = cmdclass = ep.load() + return cmdclass + else: + return _Distribution.get_command_class(self, command) + + def print_commands(self): + for ep in pkg_resources.iter_entry_points('distutils.commands'): + if ep.name not in self.cmdclass: + # don't require extras as the commands won't be invoked + cmdclass = ep.resolve() + self.cmdclass[ep.name] = cmdclass + return _Distribution.print_commands(self) + + def get_command_list(self): + for ep in pkg_resources.iter_entry_points('distutils.commands'): + if ep.name not in self.cmdclass: + # don't require extras as the commands won't be invoked + cmdclass = ep.resolve() + self.cmdclass[ep.name] = cmdclass + return _Distribution.get_command_list(self) + + def _set_feature(self, name, status): + """Set feature's inclusion status""" + setattr(self, self._feature_attrname(name), status) + + def feature_is_included(self, name): + """Return 1 if feature is included, 0 if excluded, 'None' if unknown""" + return getattr(self, self._feature_attrname(name)) + + def include_feature(self, name): + """Request inclusion of feature named 'name'""" + + if self.feature_is_included(name) == 0: + descr = self.features[name].description + raise DistutilsOptionError( + descr + " is required, but was excluded or is not available" + ) + self.features[name].include_in(self) + self._set_feature(name, 1) + + def include(self, **attrs): + """Add items to distribution that are named in keyword arguments + + For example, 'dist.include(py_modules=["x"])' would add 'x' to + the distribution's 'py_modules' attribute, if it was not already + there. + + Currently, this method only supports inclusion for attributes that are + lists or tuples. If you need to add support for adding to other + attributes in this or a subclass, you can add an '_include_X' method, + where 'X' is the name of the attribute. The method will be called with + the value passed to 'include()'. So, 'dist.include(foo={"bar":"baz"})' + will try to call 'dist._include_foo({"bar":"baz"})', which can then + handle whatever special inclusion logic is needed. + """ + for k, v in attrs.items(): + include = getattr(self, '_include_' + k, None) + if include: + include(v) + else: + self._include_misc(k, v) + + def exclude_package(self, package): + """Remove packages, modules, and extensions in named package""" + + pfx = package + '.' + if self.packages: + self.packages = [ + p for p in self.packages + if p != package and not p.startswith(pfx) + ] + + if self.py_modules: + self.py_modules = [ + p for p in self.py_modules + if p != package and not p.startswith(pfx) + ] + + if self.ext_modules: + self.ext_modules = [ + p for p in self.ext_modules + if p.name != package and not p.name.startswith(pfx) + ] + + def has_contents_for(self, package): + """Return true if 'exclude_package(package)' would do something""" + + pfx = package + '.' + + for p in self.iter_distribution_names(): + if p == package or p.startswith(pfx): + return True + + def _exclude_misc(self, name, value): + """Handle 'exclude()' for list/tuple attrs without a special handler""" + if not isinstance(value, sequence): + raise DistutilsSetupError( + "%s: setting must be a list or tuple (%r)" % (name, value) + ) + try: + old = getattr(self, name) + except AttributeError: + raise DistutilsSetupError( + "%s: No such distribution setting" % name + ) + if old is not None and not isinstance(old, sequence): + raise DistutilsSetupError( + name + ": this setting cannot be changed via include/exclude" + ) + elif old: + setattr(self, name, [item for item in old if item not in value]) + + def _include_misc(self, name, value): + """Handle 'include()' for list/tuple attrs without a special handler""" + + if not isinstance(value, sequence): + raise DistutilsSetupError( + "%s: setting must be a list (%r)" % (name, value) + ) + try: + old = getattr(self, name) + except AttributeError: + raise DistutilsSetupError( + "%s: No such distribution setting" % name + ) + if old is None: + setattr(self, name, value) + elif not isinstance(old, sequence): + raise DistutilsSetupError( + name + ": this setting cannot be changed via include/exclude" + ) + else: + new = [item for item in value if item not in old] + setattr(self, name, old + new) + + def exclude(self, **attrs): + """Remove items from distribution that are named in keyword arguments + + For example, 'dist.exclude(py_modules=["x"])' would remove 'x' from + the distribution's 'py_modules' attribute. Excluding packages uses + the 'exclude_package()' method, so all of the package's contained + packages, modules, and extensions are also excluded. + + Currently, this method only supports exclusion from attributes that are + lists or tuples. If you need to add support for excluding from other + attributes in this or a subclass, you can add an '_exclude_X' method, + where 'X' is the name of the attribute. The method will be called with + the value passed to 'exclude()'. So, 'dist.exclude(foo={"bar":"baz"})' + will try to call 'dist._exclude_foo({"bar":"baz"})', which can then + handle whatever special exclusion logic is needed. + """ + for k, v in attrs.items(): + exclude = getattr(self, '_exclude_' + k, None) + if exclude: + exclude(v) + else: + self._exclude_misc(k, v) + + def _exclude_packages(self, packages): + if not isinstance(packages, sequence): + raise DistutilsSetupError( + "packages: setting must be a list or tuple (%r)" % (packages,) + ) + list(map(self.exclude_package, packages)) + + def _parse_command_opts(self, parser, args): + # Remove --with-X/--without-X options when processing command args + self.global_options = self.__class__.global_options + self.negative_opt = self.__class__.negative_opt + + # First, expand any aliases + command = args[0] + aliases = self.get_option_dict('aliases') + while command in aliases: + src, alias = aliases[command] + del aliases[command] # ensure each alias can expand only once! + import shlex + args[:1] = shlex.split(alias, True) + command = args[0] + + nargs = _Distribution._parse_command_opts(self, parser, args) + + # Handle commands that want to consume all remaining arguments + cmd_class = self.get_command_class(command) + if getattr(cmd_class, 'command_consumes_arguments', None): + self.get_option_dict(command)['args'] = ("command line", nargs) + if nargs is not None: + return [] + + return nargs + + def get_cmdline_options(self): + """Return a '{cmd: {opt:val}}' map of all command-line options + + Option names are all long, but do not include the leading '--', and + contain dashes rather than underscores. If the option doesn't take + an argument (e.g. '--quiet'), the 'val' is 'None'. + + Note that options provided by config files are intentionally excluded. + """ + + d = {} + + for cmd, opts in self.command_options.items(): + + for opt, (src, val) in opts.items(): + + if src != "command line": + continue + + opt = opt.replace('_', '-') + + if val == 0: + cmdobj = self.get_command_obj(cmd) + neg_opt = self.negative_opt.copy() + neg_opt.update(getattr(cmdobj, 'negative_opt', {})) + for neg, pos in neg_opt.items(): + if pos == opt: + opt = neg + val = None + break + else: + raise AssertionError("Shouldn't be able to get here") + + elif val == 1: + val = None + + d.setdefault(cmd, {})[opt] = val + + return d + + def iter_distribution_names(self): + """Yield all packages, modules, and extension names in distribution""" + + for pkg in self.packages or (): + yield pkg + + for module in self.py_modules or (): + yield module + + for ext in self.ext_modules or (): + if isinstance(ext, tuple): + name, buildinfo = ext + else: + name = ext.name + if name.endswith('module'): + name = name[:-6] + yield name + + def handle_display_options(self, option_order): + """If there were any non-global "display-only" options + (--help-commands or the metadata display options) on the command + line, display the requested info and return true; else return + false. + """ + import sys + + if six.PY2 or self.help_commands: + return _Distribution.handle_display_options(self, option_order) + + # Stdout may be StringIO (e.g. in tests) + if not isinstance(sys.stdout, io.TextIOWrapper): + return _Distribution.handle_display_options(self, option_order) + + # Don't wrap stdout if utf-8 is already the encoding. Provides + # workaround for #334. + if sys.stdout.encoding.lower() in ('utf-8', 'utf8'): + return _Distribution.handle_display_options(self, option_order) + + # Print metadata in UTF-8 no matter the platform + encoding = sys.stdout.encoding + errors = sys.stdout.errors + newline = sys.platform != 'win32' and '\n' or None + line_buffering = sys.stdout.line_buffering + + sys.stdout = io.TextIOWrapper( + sys.stdout.detach(), 'utf-8', errors, newline, line_buffering) + try: + return _Distribution.handle_display_options(self, option_order) + finally: + sys.stdout = io.TextIOWrapper( + sys.stdout.detach(), encoding, errors, newline, line_buffering) + + +class Feature: + """ + **deprecated** -- The `Feature` facility was never completely implemented + or supported, `has reported issues + <https://github.com/pypa/setuptools/issues/58>`_ and will be removed in + a future version. + + A subset of the distribution that can be excluded if unneeded/wanted + + Features are created using these keyword arguments: + + 'description' -- a short, human readable description of the feature, to + be used in error messages, and option help messages. + + 'standard' -- if true, the feature is included by default if it is + available on the current system. Otherwise, the feature is only + included if requested via a command line '--with-X' option, or if + another included feature requires it. The default setting is 'False'. + + 'available' -- if true, the feature is available for installation on the + current system. The default setting is 'True'. + + 'optional' -- if true, the feature's inclusion can be controlled from the + command line, using the '--with-X' or '--without-X' options. If + false, the feature's inclusion status is determined automatically, + based on 'availabile', 'standard', and whether any other feature + requires it. The default setting is 'True'. + + 'require_features' -- a string or sequence of strings naming features + that should also be included if this feature is included. Defaults to + empty list. May also contain 'Require' objects that should be + added/removed from the distribution. + + 'remove' -- a string or list of strings naming packages to be removed + from the distribution if this feature is *not* included. If the + feature *is* included, this argument is ignored. This argument exists + to support removing features that "crosscut" a distribution, such as + defining a 'tests' feature that removes all the 'tests' subpackages + provided by other features. The default for this argument is an empty + list. (Note: the named package(s) or modules must exist in the base + distribution when the 'setup()' function is initially called.) + + other keywords -- any other keyword arguments are saved, and passed to + the distribution's 'include()' and 'exclude()' methods when the + feature is included or excluded, respectively. So, for example, you + could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be + added or removed from the distribution as appropriate. + + A feature must include at least one 'requires', 'remove', or other + keyword argument. Otherwise, it can't affect the distribution in any way. + Note also that you can subclass 'Feature' to create your own specialized + feature types that modify the distribution in other ways when included or + excluded. See the docstrings for the various methods here for more detail. + Aside from the methods, the only feature attributes that distributions look + at are 'description' and 'optional'. + """ + + @staticmethod + def warn_deprecated(): + msg = ( + "Features are deprecated and will be removed in a future " + "version. See https://github.com/pypa/setuptools/issues/65." + ) + warnings.warn(msg, DistDeprecationWarning, stacklevel=3) + + def __init__( + self, description, standard=False, available=True, + optional=True, require_features=(), remove=(), **extras): + self.warn_deprecated() + + self.description = description + self.standard = standard + self.available = available + self.optional = optional + if isinstance(require_features, (str, Require)): + require_features = require_features, + + self.require_features = [ + r for r in require_features if isinstance(r, str) + ] + er = [r for r in require_features if not isinstance(r, str)] + if er: + extras['require_features'] = er + + if isinstance(remove, str): + remove = remove, + self.remove = remove + self.extras = extras + + if not remove and not require_features and not extras: + raise DistutilsSetupError( + "Feature %s: must define 'require_features', 'remove', or " + "at least one of 'packages', 'py_modules', etc." + ) + + def include_by_default(self): + """Should this feature be included by default?""" + return self.available and self.standard + + def include_in(self, dist): + """Ensure feature and its requirements are included in distribution + + You may override this in a subclass to perform additional operations on + the distribution. Note that this method may be called more than once + per feature, and so should be idempotent. + + """ + + if not self.available: + raise DistutilsPlatformError( + self.description + " is required, " + "but is not available on this platform" + ) + + dist.include(**self.extras) + + for f in self.require_features: + dist.include_feature(f) + + def exclude_from(self, dist): + """Ensure feature is excluded from distribution + + You may override this in a subclass to perform additional operations on + the distribution. This method will be called at most once per + feature, and only after all included features have been asked to + include themselves. + """ + + dist.exclude(**self.extras) + + if self.remove: + for item in self.remove: + dist.exclude_package(item) + + def validate(self, dist): + """Verify that feature makes sense in context of distribution + + This method is called by the distribution just before it parses its + command line. It checks to ensure that the 'remove' attribute, if any, + contains only valid package/module names that are present in the base + distribution when 'setup()' is called. You may override it in a + subclass to perform any other required validation of the feature + against a target distribution. + """ + + for item in self.remove: + if not dist.has_contents_for(item): + raise DistutilsSetupError( + "%s wants to be able to remove %s, but the distribution" + " doesn't contain any packages or modules under %s" + % (self.description, item, item) + ) + + +class DistDeprecationWarning(SetuptoolsDeprecationWarning): + """Class for warning about deprecations in dist in + setuptools. Not ignored by default, unlike DeprecationWarning.""" diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/extension.py b/mongo_mac/lib/python3.6/site-packages/setuptools/extension.py new file mode 100644 index 0000000..2946889 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/extension.py @@ -0,0 +1,57 @@ +import re +import functools +import distutils.core +import distutils.errors +import distutils.extension + +from setuptools.extern.six.moves import map + +from .monkey import get_unpatched + + +def _have_cython(): + """ + Return True if Cython can be imported. + """ + cython_impl = 'Cython.Distutils.build_ext' + try: + # from (cython_impl) import build_ext + __import__(cython_impl, fromlist=['build_ext']).build_ext + return True + except Exception: + pass + return False + + +# for compatibility +have_pyrex = _have_cython + +_Extension = get_unpatched(distutils.core.Extension) + + +class Extension(_Extension): + """Extension that uses '.c' files in place of '.pyx' files""" + + def __init__(self, name, sources, *args, **kw): + # The *args is needed for compatibility as calls may use positional + # arguments. py_limited_api may be set only via keyword. + self.py_limited_api = kw.pop("py_limited_api", False) + _Extension.__init__(self, name, sources, *args, **kw) + + def _convert_pyx_sources_to_lang(self): + """ + Replace sources with .pyx extensions to sources with the target + language extension. This mechanism allows language authors to supply + pre-converted sources but to prefer the .pyx sources. + """ + if _have_cython(): + # the build has Cython, so allow it to compile the .pyx files + return + lang = self.language or '' + target_ext = '.cpp' if lang.lower() == 'c++' else '.c' + sub = functools.partial(re.sub, '.pyx$', target_ext) + self.sources = list(map(sub, self.sources)) + + +class Library(Extension): + """Just like a regular Extension, but built as a library instead""" diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/extern/__init__.py b/mongo_mac/lib/python3.6/site-packages/setuptools/extern/__init__.py new file mode 100644 index 0000000..cb2fa32 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/extern/__init__.py @@ -0,0 +1,73 @@ +import sys + + +class VendorImporter: + """ + A PEP 302 meta path importer for finding optionally-vendored + or otherwise naturally-installed packages from root_name. + """ + + def __init__(self, root_name, vendored_names=(), vendor_pkg=None): + self.root_name = root_name + self.vendored_names = set(vendored_names) + self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor') + + @property + def search_path(self): + """ + Search first the vendor package then as a natural package. + """ + yield self.vendor_pkg + '.' + yield '' + + def find_module(self, fullname, path=None): + """ + Return self when fullname starts with root_name and the + target module is one vendored through this importer. + """ + root, base, target = fullname.partition(self.root_name + '.') + if root: + return + if not any(map(target.startswith, self.vendored_names)): + return + return self + + def load_module(self, fullname): + """ + Iterate over the search path to locate and load fullname. + """ + root, base, target = fullname.partition(self.root_name + '.') + for prefix in self.search_path: + try: + extant = prefix + target + __import__(extant) + mod = sys.modules[extant] + sys.modules[fullname] = mod + # mysterious hack: + # Remove the reference to the extant package/module + # on later Python versions to cause relative imports + # in the vendor package to resolve the same modules + # as those going through this importer. + if sys.version_info >= (3, ): + del sys.modules[extant] + return mod + except ImportError: + pass + else: + raise ImportError( + "The '{target}' package is required; " + "normally this is bundled with this package so if you get " + "this warning, consult the packager of your " + "distribution.".format(**locals()) + ) + + def install(self): + """ + Install this importer into sys.meta_path if not already present. + """ + if self not in sys.meta_path: + sys.meta_path.append(self) + + +names = 'six', 'packaging', 'pyparsing', +VendorImporter(__name__, names, 'setuptools._vendor').install() diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/extern/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/setuptools/extern/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05ceea29109494ac8c3bd92398a2d1d8b43bf1de GIT binary patch literal 2436 zcmZ`*&u<$=6rR~%UT>U$DwNO)s*ykxOT=zz5eNz@q7|w@QPoxjtfJM%Gfp;H?`&tr zNo+P39C1S2xO3(2;K2VdSHz+J0w>;^wUe|_C)zjToge$&`@Z*0ZmzB-|Nim!)4$q; z{6o&Q0LFLV(LFGna9WT7`I>N#`zM6^b8kR-Jn#e+zVLW!?(YS2LSfw_(rrJ7J!ET$ zcG-Lw+<`~m1tSRTCIgStfj@#XM{p_+PUs*IArE<ULgsW3@m1d9F}!W@Hcw8-Am%H) z1AUu&@Rc>Y_C%Cis{7+gDkIeFBw^6LWDo8=U^lOS$i~8Ctjf$T%NI-7NGdkUOP-fI zOjahBWmXi^%>#Fk;O+oeBF(N)hq)H4%*;f&HF>EG3<QTGhx^%%&}^jSm?<euT4rO> zbGx^Om^y6OW7uE8qu&El)0(8j(At~h$gBP8YEAciPPsSt;7z~@1m<rIB5?!(m9~{O zo^?apKK+jMwJ>&V>9hN`wk;*9A{z>uG!tpHztatDphYoK=!%Na#9;m;DuM35gMOv* zgUpEjL8kg6S#Y6rf4JW_#f{PS(E-1uKTbayZcq1b+#Jmg$HVK;cFO+aewA07i+pU} z8jBg%N4gJQO)4X0@xri)q@SjFnVU52RZ|-;f1no{-6Axi37u^`c>&Pga@~;P8fe&i z@F2DHI+&X50p~Wz6Xc%ftPd#+X5Tt6kPnYUriQzKy3&RLuB^$=5=DGfvP`pViS=@( z!4r?Lv}egym%8jh2gTB)(B)CBz)!oP-FH&t+iU2aqe0lAvnww}b#CDh`GF0SfEyfF zK7j%70)wL%+?+o3kNxA|IIMkj70GWr<JaL{04u^duu0#-x3y!>?3dHf9|9t(WJm#a zh+&Q<MS)ahKxJh#JItXtPKm{`l4Ckf_rszcVc1ymNg-ISnJky-gEBC?N=|lmp@*4e zg`Fi$twI=E-N?2p_*Ra!=6GoRtejeZoK-ey+(0iJJG+rft&Nv{+5ppO19Z^_+nE+N zYMg2^j|5tzAFDcTJl%k|x&wxU>okDBOYmHP;oOEHata$(2X1sQ{0f5$Fn9>WQ3Z+j z?vfuLABWRV>#z<s$Z-UaL~}}s3HHJ|x=fB+b<2(EZG0E;a6eRoX7+PZw;loFrnR4_ ziUNBn`GGvU`aL|~!CUU{#Uo<cbMhOV)1N61fYs6Ln^S1+gFZmzGI<~rVg?{Pnmf5O zk`;1@(}-vxGk%KvOZYrT0?vMa3<q5Msmbi|wPgVy;z~T5<Vx_*SSi&Qg>ZqlX4{jJ zqZ~RCIT9>{k!i{D5u3^hL;AR>!%USRx*xEiEcK*lDsizM^wzCbjOW^@e0zdq>0!ZL z0r$FzdL6n(#IUq%0>a=FJxxIjryza}@Y;4D9U3-++Ki-KX|9HQN=aoS(Ef2|Y=o&P zbT@9w_zgT7r9>fZ)SGyIR4FmakDLr=r2(=^et~e9)&=3-flc}<7!s`04)tgZe+f;Z z1p0uk(Zus;<X@oRxg#z}oTDIyUlRj5u-{Va*zdtTfh2Pmtv7pkMu_Hmda)W=UIG^& zLp{6;oi-sdr8F!nl*ss$L8w}k=8P9xU0=Ng-?i=2JvPd!3Z(fJ($`vC1$SUqBYOde z`T9$;w^-DrTipb&0MsGC53p>&gK;NKpG`8SQ1Gjjrd$rwRAEKhxKgqb%1jkfKwU=j zE}Cm-oDiHDRAhxkjhgDDAPxd=E$qZeCw|+_0CDmo)F!;kftfIzf>3D~&Muu@WxeGM t?5j;Y6#pGkeK6h7WvMwU#9*{~A17bskBx6PfqsFvn7j63f9-BS{|EC7he-ec literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/glibc.py b/mongo_mac/lib/python3.6/site-packages/setuptools/glibc.py new file mode 100644 index 0000000..a134591 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/glibc.py @@ -0,0 +1,86 @@ +# This file originally from pip: +# https://github.com/pypa/pip/blob/8f4f15a5a95d7d5b511ceaee9ed261176c181970/src/pip/_internal/utils/glibc.py +from __future__ import absolute_import + +import ctypes +import re +import warnings + + +def glibc_version_string(): + "Returns glibc version string, or None if not using glibc." + + # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen + # manpage says, "If filename is NULL, then the returned handle is for the + # main program". This way we can let the linker do the work to figure out + # which libc our process is actually using. + process_namespace = ctypes.CDLL(None) + try: + gnu_get_libc_version = process_namespace.gnu_get_libc_version + except AttributeError: + # Symbol doesn't exist -> therefore, we are not linked to + # glibc. + return None + + # Call gnu_get_libc_version, which returns a string like "2.5" + gnu_get_libc_version.restype = ctypes.c_char_p + version_str = gnu_get_libc_version() + # py2 / py3 compatibility: + if not isinstance(version_str, str): + version_str = version_str.decode("ascii") + + return version_str + + +# Separated out from have_compatible_glibc for easier unit testing +def check_glibc_version(version_str, required_major, minimum_minor): + # Parse string and check against requested version. + # + # We use a regexp instead of str.split because we want to discard any + # random junk that might come after the minor version -- this might happen + # in patched/forked versions of glibc (e.g. Linaro's version of glibc + # uses version strings like "2.20-2014.11"). See gh-3588. + m = re.match(r"(?P<major>[0-9]+)\.(?P<minor>[0-9]+)", version_str) + if not m: + warnings.warn("Expected glibc version with 2 components major.minor," + " got: %s" % version_str, RuntimeWarning) + return False + return (int(m.group("major")) == required_major and + int(m.group("minor")) >= minimum_minor) + + +def have_compatible_glibc(required_major, minimum_minor): + version_str = glibc_version_string() + if version_str is None: + return False + return check_glibc_version(version_str, required_major, minimum_minor) + + +# platform.libc_ver regularly returns completely nonsensical glibc +# versions. E.g. on my computer, platform says: +# +# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.7') +# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.9') +# +# But the truth is: +# +# ~$ ldd --version +# ldd (Debian GLIBC 2.22-11) 2.22 +# +# This is unfortunate, because it means that the linehaul data on libc +# versions that was generated by pip 8.1.2 and earlier is useless and +# misleading. Solution: instead of using platform, use our code that actually +# works. +def libc_ver(): + """Try to determine the glibc version + + Returns a tuple of strings (lib, version) which default to empty strings + in case the lookup fails. + """ + glibc_version = glibc_version_string() + if glibc_version is None: + return ("", "") + else: + return ("glibc", glibc_version) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/glob.py b/mongo_mac/lib/python3.6/site-packages/setuptools/glob.py new file mode 100644 index 0000000..9d7cbc5 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/glob.py @@ -0,0 +1,174 @@ +""" +Filename globbing utility. Mostly a copy of `glob` from Python 3.5. + +Changes include: + * `yield from` and PEP3102 `*` removed. + * Hidden files are not ignored. +""" + +import os +import re +import fnmatch + +__all__ = ["glob", "iglob", "escape"] + + +def glob(pathname, recursive=False): + """Return a list of paths matching a pathname pattern. + + The pattern may contain simple shell-style wildcards a la + fnmatch. However, unlike fnmatch, filenames starting with a + dot are special cases that are not matched by '*' and '?' + patterns. + + If recursive is true, the pattern '**' will match any files and + zero or more directories and subdirectories. + """ + return list(iglob(pathname, recursive=recursive)) + + +def iglob(pathname, recursive=False): + """Return an iterator which yields the paths matching a pathname pattern. + + The pattern may contain simple shell-style wildcards a la + fnmatch. However, unlike fnmatch, filenames starting with a + dot are special cases that are not matched by '*' and '?' + patterns. + + If recursive is true, the pattern '**' will match any files and + zero or more directories and subdirectories. + """ + it = _iglob(pathname, recursive) + if recursive and _isrecursive(pathname): + s = next(it) # skip empty string + assert not s + return it + + +def _iglob(pathname, recursive): + dirname, basename = os.path.split(pathname) + if not has_magic(pathname): + if basename: + if os.path.lexists(pathname): + yield pathname + else: + # Patterns ending with a slash should match only directories + if os.path.isdir(dirname): + yield pathname + return + if not dirname: + if recursive and _isrecursive(basename): + for x in glob2(dirname, basename): + yield x + else: + for x in glob1(dirname, basename): + yield x + return + # `os.path.split()` returns the argument itself as a dirname if it is a + # drive or UNC path. Prevent an infinite recursion if a drive or UNC path + # contains magic characters (i.e. r'\\?\C:'). + if dirname != pathname and has_magic(dirname): + dirs = _iglob(dirname, recursive) + else: + dirs = [dirname] + if has_magic(basename): + if recursive and _isrecursive(basename): + glob_in_dir = glob2 + else: + glob_in_dir = glob1 + else: + glob_in_dir = glob0 + for dirname in dirs: + for name in glob_in_dir(dirname, basename): + yield os.path.join(dirname, name) + + +# These 2 helper functions non-recursively glob inside a literal directory. +# They return a list of basenames. `glob1` accepts a pattern while `glob0` +# takes a literal basename (so it only has to check for its existence). + + +def glob1(dirname, pattern): + if not dirname: + if isinstance(pattern, bytes): + dirname = os.curdir.encode('ASCII') + else: + dirname = os.curdir + try: + names = os.listdir(dirname) + except OSError: + return [] + return fnmatch.filter(names, pattern) + + +def glob0(dirname, basename): + if not basename: + # `os.path.split()` returns an empty basename for paths ending with a + # directory separator. 'q*x/' should match only directories. + if os.path.isdir(dirname): + return [basename] + else: + if os.path.lexists(os.path.join(dirname, basename)): + return [basename] + return [] + + +# This helper function recursively yields relative pathnames inside a literal +# directory. + + +def glob2(dirname, pattern): + assert _isrecursive(pattern) + yield pattern[:0] + for x in _rlistdir(dirname): + yield x + + +# Recursively yields relative pathnames inside a literal directory. +def _rlistdir(dirname): + if not dirname: + if isinstance(dirname, bytes): + dirname = os.curdir.encode('ASCII') + else: + dirname = os.curdir + try: + names = os.listdir(dirname) + except os.error: + return + for x in names: + yield x + path = os.path.join(dirname, x) if dirname else x + for y in _rlistdir(path): + yield os.path.join(x, y) + + +magic_check = re.compile('([*?[])') +magic_check_bytes = re.compile(b'([*?[])') + + +def has_magic(s): + if isinstance(s, bytes): + match = magic_check_bytes.search(s) + else: + match = magic_check.search(s) + return match is not None + + +def _isrecursive(pattern): + if isinstance(pattern, bytes): + return pattern == b'**' + else: + return pattern == '**' + + +def escape(pathname): + """Escape all special characters. + """ + # Escaping is done by wrapping any of "*?[" between square brackets. + # Metacharacters do not work in the drive part and shouldn't be escaped. + drive, pathname = os.path.splitdrive(pathname) + if isinstance(pathname, bytes): + pathname = magic_check_bytes.sub(br'[\1]', pathname) + else: + pathname = magic_check.sub(r'[\1]', pathname) + return drive + pathname diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/gui-32.exe b/mongo_mac/lib/python3.6/site-packages/setuptools/gui-32.exe new file mode 100644 index 0000000000000000000000000000000000000000..f8d3509653ba8f80ca7f3aa7f95616142ba83a94 GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/gui-64.exe b/mongo_mac/lib/python3.6/site-packages/setuptools/gui-64.exe new file mode 100644 index 0000000000000000000000000000000000000000..330c51a5dde15a0bb610a48cd0ca11770c914dae GIT binary patch literal 75264 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/gui.exe b/mongo_mac/lib/python3.6/site-packages/setuptools/gui.exe new file mode 100644 index 0000000000000000000000000000000000000000..f8d3509653ba8f80ca7f3aa7f95616142ba83a94 GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/launch.py b/mongo_mac/lib/python3.6/site-packages/setuptools/launch.py new file mode 100644 index 0000000..308283e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/launch.py @@ -0,0 +1,35 @@ +""" +Launch the Python script on the command line after +setuptools is bootstrapped via import. +""" + +# Note that setuptools gets imported implicitly by the +# invocation of this script using python -m setuptools.launch + +import tokenize +import sys + + +def run(): + """ + Run the script in sys.argv[1] as if it had + been invoked naturally. + """ + __builtins__ + script_name = sys.argv[1] + namespace = dict( + __file__=script_name, + __name__='__main__', + __doc__=None, + ) + sys.argv[:] = sys.argv[1:] + + open_ = getattr(tokenize, 'open', open) + script = open_(script_name).read() + norm_script = script.replace('\\r\\n', '\\n') + code = compile(norm_script, script_name, 'exec') + exec(code, namespace) + + +if __name__ == '__main__': + run() diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/lib2to3_ex.py b/mongo_mac/lib/python3.6/site-packages/setuptools/lib2to3_ex.py new file mode 100644 index 0000000..4b1a73f --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/lib2to3_ex.py @@ -0,0 +1,62 @@ +""" +Customized Mixin2to3 support: + + - adds support for converting doctests + + +This module raises an ImportError on Python 2. +""" + +from distutils.util import Mixin2to3 as _Mixin2to3 +from distutils import log +from lib2to3.refactor import RefactoringTool, get_fixers_from_package + +import setuptools + + +class DistutilsRefactoringTool(RefactoringTool): + def log_error(self, msg, *args, **kw): + log.error(msg, *args) + + def log_message(self, msg, *args): + log.info(msg, *args) + + def log_debug(self, msg, *args): + log.debug(msg, *args) + + +class Mixin2to3(_Mixin2to3): + def run_2to3(self, files, doctests=False): + # See of the distribution option has been set, otherwise check the + # setuptools default. + if self.distribution.use_2to3 is not True: + return + if not files: + return + log.info("Fixing " + " ".join(files)) + self.__build_fixer_names() + self.__exclude_fixers() + if doctests: + if setuptools.run_2to3_on_doctests: + r = DistutilsRefactoringTool(self.fixer_names) + r.refactor(files, write=True, doctests_only=True) + else: + _Mixin2to3.run_2to3(self, files) + + def __build_fixer_names(self): + if self.fixer_names: + return + self.fixer_names = [] + for p in setuptools.lib2to3_fixer_packages: + self.fixer_names.extend(get_fixers_from_package(p)) + if self.distribution.use_2to3_fixers is not None: + for p in self.distribution.use_2to3_fixers: + self.fixer_names.extend(get_fixers_from_package(p)) + + def __exclude_fixers(self): + excluded_fixers = getattr(self, 'exclude_fixers', []) + if self.distribution.use_2to3_exclude_fixers is not None: + excluded_fixers.extend(self.distribution.use_2to3_exclude_fixers) + for fixer_name in excluded_fixers: + if fixer_name in self.fixer_names: + self.fixer_names.remove(fixer_name) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/monkey.py b/mongo_mac/lib/python3.6/site-packages/setuptools/monkey.py new file mode 100644 index 0000000..3c77f8c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/monkey.py @@ -0,0 +1,179 @@ +""" +Monkey patching of distutils. +""" + +import sys +import distutils.filelist +import platform +import types +import functools +from importlib import import_module +import inspect + +from setuptools.extern import six + +import setuptools + +__all__ = [] +""" +Everything is private. Contact the project team +if you think you need this functionality. +""" + + +def _get_mro(cls): + """ + Returns the bases classes for cls sorted by the MRO. + + Works around an issue on Jython where inspect.getmro will not return all + base classes if multiple classes share the same name. Instead, this + function will return a tuple containing the class itself, and the contents + of cls.__bases__. See https://github.com/pypa/setuptools/issues/1024. + """ + if platform.python_implementation() == "Jython": + return (cls,) + cls.__bases__ + return inspect.getmro(cls) + + +def get_unpatched(item): + lookup = ( + get_unpatched_class if isinstance(item, six.class_types) else + get_unpatched_function if isinstance(item, types.FunctionType) else + lambda item: None + ) + return lookup(item) + + +def get_unpatched_class(cls): + """Protect against re-patching the distutils if reloaded + + Also ensures that no other distutils extension monkeypatched the distutils + first. + """ + external_bases = ( + cls + for cls in _get_mro(cls) + if not cls.__module__.startswith('setuptools') + ) + base = next(external_bases) + if not base.__module__.startswith('distutils'): + msg = "distutils has already been patched by %r" % cls + raise AssertionError(msg) + return base + + +def patch_all(): + # we can't patch distutils.cmd, alas + distutils.core.Command = setuptools.Command + + has_issue_12885 = sys.version_info <= (3, 5, 3) + + if has_issue_12885: + # fix findall bug in distutils (http://bugs.python.org/issue12885) + distutils.filelist.findall = setuptools.findall + + needs_warehouse = ( + sys.version_info < (2, 7, 13) + or + (3, 4) < sys.version_info < (3, 4, 6) + or + (3, 5) < sys.version_info <= (3, 5, 3) + ) + + if needs_warehouse: + warehouse = 'https://upload.pypi.org/legacy/' + distutils.config.PyPIRCCommand.DEFAULT_REPOSITORY = warehouse + + _patch_distribution_metadata() + + # Install Distribution throughout the distutils + for module in distutils.dist, distutils.core, distutils.cmd: + module.Distribution = setuptools.dist.Distribution + + # Install the patched Extension + distutils.core.Extension = setuptools.extension.Extension + distutils.extension.Extension = setuptools.extension.Extension + if 'distutils.command.build_ext' in sys.modules: + sys.modules['distutils.command.build_ext'].Extension = ( + setuptools.extension.Extension + ) + + patch_for_msvc_specialized_compiler() + + +def _patch_distribution_metadata(): + """Patch write_pkg_file and read_pkg_file for higher metadata standards""" + for attr in ('write_pkg_file', 'read_pkg_file', 'get_metadata_version'): + new_val = getattr(setuptools.dist, attr) + setattr(distutils.dist.DistributionMetadata, attr, new_val) + + +def patch_func(replacement, target_mod, func_name): + """ + Patch func_name in target_mod with replacement + + Important - original must be resolved by name to avoid + patching an already patched function. + """ + original = getattr(target_mod, func_name) + + # set the 'unpatched' attribute on the replacement to + # point to the original. + vars(replacement).setdefault('unpatched', original) + + # replace the function in the original module + setattr(target_mod, func_name, replacement) + + +def get_unpatched_function(candidate): + return getattr(candidate, 'unpatched') + + +def patch_for_msvc_specialized_compiler(): + """ + Patch functions in distutils to use standalone Microsoft Visual C++ + compilers. + """ + # import late to avoid circular imports on Python < 3.5 + msvc = import_module('setuptools.msvc') + + if platform.system() != 'Windows': + # Compilers only availables on Microsoft Windows + return + + def patch_params(mod_name, func_name): + """ + Prepare the parameters for patch_func to patch indicated function. + """ + repl_prefix = 'msvc9_' if 'msvc9' in mod_name else 'msvc14_' + repl_name = repl_prefix + func_name.lstrip('_') + repl = getattr(msvc, repl_name) + mod = import_module(mod_name) + if not hasattr(mod, func_name): + raise ImportError(func_name) + return repl, mod, func_name + + # Python 2.7 to 3.4 + msvc9 = functools.partial(patch_params, 'distutils.msvc9compiler') + + # Python 3.5+ + msvc14 = functools.partial(patch_params, 'distutils._msvccompiler') + + try: + # Patch distutils.msvc9compiler + patch_func(*msvc9('find_vcvarsall')) + patch_func(*msvc9('query_vcvarsall')) + except ImportError: + pass + + try: + # Patch distutils._msvccompiler._get_vc_env + patch_func(*msvc14('_get_vc_env')) + except ImportError: + pass + + try: + # Patch distutils._msvccompiler.gen_lib_options for Numpy + patch_func(*msvc14('gen_lib_options')) + except ImportError: + pass diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/msvc.py b/mongo_mac/lib/python3.6/site-packages/setuptools/msvc.py new file mode 100644 index 0000000..b9c472f --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/msvc.py @@ -0,0 +1,1301 @@ +""" +Improved support for Microsoft Visual C++ compilers. + +Known supported compilers: +-------------------------- +Microsoft Visual C++ 9.0: + Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) + Microsoft Windows SDK 6.1 (x86, x64, ia64) + Microsoft Windows SDK 7.0 (x86, x64, ia64) + +Microsoft Visual C++ 10.0: + Microsoft Windows SDK 7.1 (x86, x64, ia64) + +Microsoft Visual C++ 14.0: + Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) + Microsoft Visual Studio 2017 (x86, x64, arm, arm64) + Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) +""" + +import os +import sys +import platform +import itertools +import distutils.errors +from setuptools.extern.packaging.version import LegacyVersion + +from setuptools.extern.six.moves import filterfalse + +from .monkey import get_unpatched + +if platform.system() == 'Windows': + from setuptools.extern.six.moves import winreg + safe_env = os.environ +else: + """ + Mock winreg and environ so the module can be imported + on this platform. + """ + + class winreg: + HKEY_USERS = None + HKEY_CURRENT_USER = None + HKEY_LOCAL_MACHINE = None + HKEY_CLASSES_ROOT = None + + safe_env = dict() + +_msvc9_suppress_errors = ( + # msvc9compiler isn't available on some platforms + ImportError, + + # msvc9compiler raises DistutilsPlatformError in some + # environments. See #1118. + distutils.errors.DistutilsPlatformError, +) + +try: + from distutils.msvc9compiler import Reg +except _msvc9_suppress_errors: + pass + + +def msvc9_find_vcvarsall(version): + """ + Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone + compiler build for Python (VCForPython). Fall back to original behavior + when the standalone compiler is not available. + + Redirect the path of "vcvarsall.bat". + + Known supported compilers + ------------------------- + Microsoft Visual C++ 9.0: + Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) + + Parameters + ---------- + version: float + Required Microsoft Visual C++ version. + + Return + ------ + vcvarsall.bat path: str + """ + VC_BASE = r'Software\%sMicrosoft\DevDiv\VCForPython\%0.1f' + key = VC_BASE % ('', version) + try: + # Per-user installs register the compiler path here + productdir = Reg.get_value(key, "installdir") + except KeyError: + try: + # All-user installs on a 64-bit system register here + key = VC_BASE % ('Wow6432Node\\', version) + productdir = Reg.get_value(key, "installdir") + except KeyError: + productdir = None + + if productdir: + vcvarsall = os.path.os.path.join(productdir, "vcvarsall.bat") + if os.path.isfile(vcvarsall): + return vcvarsall + + return get_unpatched(msvc9_find_vcvarsall)(version) + + +def msvc9_query_vcvarsall(ver, arch='x86', *args, **kwargs): + """ + Patched "distutils.msvc9compiler.query_vcvarsall" for support extra + compilers. + + Set environment without use of "vcvarsall.bat". + + Known supported compilers + ------------------------- + Microsoft Visual C++ 9.0: + Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) + Microsoft Windows SDK 6.1 (x86, x64, ia64) + Microsoft Windows SDK 7.0 (x86, x64, ia64) + + Microsoft Visual C++ 10.0: + Microsoft Windows SDK 7.1 (x86, x64, ia64) + + Parameters + ---------- + ver: float + Required Microsoft Visual C++ version. + arch: str + Target architecture. + + Return + ------ + environment: dict + """ + # Try to get environement from vcvarsall.bat (Classical way) + try: + orig = get_unpatched(msvc9_query_vcvarsall) + return orig(ver, arch, *args, **kwargs) + except distutils.errors.DistutilsPlatformError: + # Pass error if Vcvarsall.bat is missing + pass + except ValueError: + # Pass error if environment not set after executing vcvarsall.bat + pass + + # If error, try to set environment directly + try: + return EnvironmentInfo(arch, ver).return_env() + except distutils.errors.DistutilsPlatformError as exc: + _augment_exception(exc, ver, arch) + raise + + +def msvc14_get_vc_env(plat_spec): + """ + Patched "distutils._msvccompiler._get_vc_env" for support extra + compilers. + + Set environment without use of "vcvarsall.bat". + + Known supported compilers + ------------------------- + Microsoft Visual C++ 14.0: + Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) + Microsoft Visual Studio 2017 (x86, x64, arm, arm64) + Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) + + Parameters + ---------- + plat_spec: str + Target architecture. + + Return + ------ + environment: dict + """ + # Try to get environment from vcvarsall.bat (Classical way) + try: + return get_unpatched(msvc14_get_vc_env)(plat_spec) + except distutils.errors.DistutilsPlatformError: + # Pass error Vcvarsall.bat is missing + pass + + # If error, try to set environment directly + try: + return EnvironmentInfo(plat_spec, vc_min_ver=14.0).return_env() + except distutils.errors.DistutilsPlatformError as exc: + _augment_exception(exc, 14.0) + raise + + +def msvc14_gen_lib_options(*args, **kwargs): + """ + Patched "distutils._msvccompiler.gen_lib_options" for fix + compatibility between "numpy.distutils" and "distutils._msvccompiler" + (for Numpy < 1.11.2) + """ + if "numpy.distutils" in sys.modules: + import numpy as np + if LegacyVersion(np.__version__) < LegacyVersion('1.11.2'): + return np.distutils.ccompiler.gen_lib_options(*args, **kwargs) + return get_unpatched(msvc14_gen_lib_options)(*args, **kwargs) + + +def _augment_exception(exc, version, arch=''): + """ + Add details to the exception message to help guide the user + as to what action will resolve it. + """ + # Error if MSVC++ directory not found or environment not set + message = exc.args[0] + + if "vcvarsall" in message.lower() or "visual c" in message.lower(): + # Special error message if MSVC++ not installed + tmpl = 'Microsoft Visual C++ {version:0.1f} is required.' + message = tmpl.format(**locals()) + msdownload = 'www.microsoft.com/download/details.aspx?id=%d' + if version == 9.0: + if arch.lower().find('ia64') > -1: + # For VC++ 9.0, if IA64 support is needed, redirect user + # to Windows SDK 7.0 + message += ' Get it with "Microsoft Windows SDK 7.0": ' + message += msdownload % 3138 + else: + # For VC++ 9.0 redirect user to Vc++ for Python 2.7 : + # This redirection link is maintained by Microsoft. + # Contact vspython@microsoft.com if it needs updating. + message += ' Get it from http://aka.ms/vcpython27' + elif version == 10.0: + # For VC++ 10.0 Redirect user to Windows SDK 7.1 + message += ' Get it with "Microsoft Windows SDK 7.1": ' + message += msdownload % 8279 + elif version >= 14.0: + # For VC++ 14.0 Redirect user to Visual C++ Build Tools + message += (' Get it with "Microsoft Visual C++ Build Tools": ' + r'https://visualstudio.microsoft.com/downloads/') + + exc.args = (message, ) + + +class PlatformInfo: + """ + Current and Target Architectures informations. + + Parameters + ---------- + arch: str + Target architecture. + """ + current_cpu = safe_env.get('processor_architecture', '').lower() + + def __init__(self, arch): + self.arch = arch.lower().replace('x64', 'amd64') + + @property + def target_cpu(self): + return self.arch[self.arch.find('_') + 1:] + + def target_is_x86(self): + return self.target_cpu == 'x86' + + def current_is_x86(self): + return self.current_cpu == 'x86' + + def current_dir(self, hidex86=False, x64=False): + """ + Current platform specific subfolder. + + Parameters + ---------- + hidex86: bool + return '' and not '\x86' if architecture is x86. + x64: bool + return '\x64' and not '\amd64' if architecture is amd64. + + Return + ------ + subfolder: str + '\target', or '' (see hidex86 parameter) + """ + return ( + '' if (self.current_cpu == 'x86' and hidex86) else + r'\x64' if (self.current_cpu == 'amd64' and x64) else + r'\%s' % self.current_cpu + ) + + def target_dir(self, hidex86=False, x64=False): + r""" + Target platform specific subfolder. + + Parameters + ---------- + hidex86: bool + return '' and not '\x86' if architecture is x86. + x64: bool + return '\x64' and not '\amd64' if architecture is amd64. + + Return + ------ + subfolder: str + '\current', or '' (see hidex86 parameter) + """ + return ( + '' if (self.target_cpu == 'x86' and hidex86) else + r'\x64' if (self.target_cpu == 'amd64' and x64) else + r'\%s' % self.target_cpu + ) + + def cross_dir(self, forcex86=False): + r""" + Cross platform specific subfolder. + + Parameters + ---------- + forcex86: bool + Use 'x86' as current architecture even if current acritecture is + not x86. + + Return + ------ + subfolder: str + '' if target architecture is current architecture, + '\current_target' if not. + """ + current = 'x86' if forcex86 else self.current_cpu + return ( + '' if self.target_cpu == current else + self.target_dir().replace('\\', '\\%s_' % current) + ) + + +class RegistryInfo: + """ + Microsoft Visual Studio related registry informations. + + Parameters + ---------- + platform_info: PlatformInfo + "PlatformInfo" instance. + """ + HKEYS = (winreg.HKEY_USERS, + winreg.HKEY_CURRENT_USER, + winreg.HKEY_LOCAL_MACHINE, + winreg.HKEY_CLASSES_ROOT) + + def __init__(self, platform_info): + self.pi = platform_info + + @property + def visualstudio(self): + """ + Microsoft Visual Studio root registry key. + """ + return 'VisualStudio' + + @property + def sxs(self): + """ + Microsoft Visual Studio SxS registry key. + """ + return os.path.join(self.visualstudio, 'SxS') + + @property + def vc(self): + """ + Microsoft Visual C++ VC7 registry key. + """ + return os.path.join(self.sxs, 'VC7') + + @property + def vs(self): + """ + Microsoft Visual Studio VS7 registry key. + """ + return os.path.join(self.sxs, 'VS7') + + @property + def vc_for_python(self): + """ + Microsoft Visual C++ for Python registry key. + """ + return r'DevDiv\VCForPython' + + @property + def microsoft_sdk(self): + """ + Microsoft SDK registry key. + """ + return 'Microsoft SDKs' + + @property + def windows_sdk(self): + """ + Microsoft Windows/Platform SDK registry key. + """ + return os.path.join(self.microsoft_sdk, 'Windows') + + @property + def netfx_sdk(self): + """ + Microsoft .NET Framework SDK registry key. + """ + return os.path.join(self.microsoft_sdk, 'NETFXSDK') + + @property + def windows_kits_roots(self): + """ + Microsoft Windows Kits Roots registry key. + """ + return r'Windows Kits\Installed Roots' + + def microsoft(self, key, x86=False): + """ + Return key in Microsoft software registry. + + Parameters + ---------- + key: str + Registry key path where look. + x86: str + Force x86 software registry. + + Return + ------ + str: value + """ + node64 = '' if self.pi.current_is_x86() or x86 else 'Wow6432Node' + return os.path.join('Software', node64, 'Microsoft', key) + + def lookup(self, key, name): + """ + Look for values in registry in Microsoft software registry. + + Parameters + ---------- + key: str + Registry key path where look. + name: str + Value name to find. + + Return + ------ + str: value + """ + KEY_READ = winreg.KEY_READ + openkey = winreg.OpenKey + ms = self.microsoft + for hkey in self.HKEYS: + try: + bkey = openkey(hkey, ms(key), 0, KEY_READ) + except (OSError, IOError): + if not self.pi.current_is_x86(): + try: + bkey = openkey(hkey, ms(key, True), 0, KEY_READ) + except (OSError, IOError): + continue + else: + continue + try: + return winreg.QueryValueEx(bkey, name)[0] + except (OSError, IOError): + pass + + +class SystemInfo: + """ + Microsoft Windows and Visual Studio related system inormations. + + Parameters + ---------- + registry_info: RegistryInfo + "RegistryInfo" instance. + vc_ver: float + Required Microsoft Visual C++ version. + """ + + # Variables and properties in this class use originals CamelCase variables + # names from Microsoft source files for more easy comparaison. + WinDir = safe_env.get('WinDir', '') + ProgramFiles = safe_env.get('ProgramFiles', '') + ProgramFilesx86 = safe_env.get('ProgramFiles(x86)', ProgramFiles) + + def __init__(self, registry_info, vc_ver=None): + self.ri = registry_info + self.pi = self.ri.pi + self.vc_ver = vc_ver or self._find_latest_available_vc_ver() + + def _find_latest_available_vc_ver(self): + try: + return self.find_available_vc_vers()[-1] + except IndexError: + err = 'No Microsoft Visual C++ version found' + raise distutils.errors.DistutilsPlatformError(err) + + def find_available_vc_vers(self): + """ + Find all available Microsoft Visual C++ versions. + """ + ms = self.ri.microsoft + vckeys = (self.ri.vc, self.ri.vc_for_python, self.ri.vs) + vc_vers = [] + for hkey in self.ri.HKEYS: + for key in vckeys: + try: + bkey = winreg.OpenKey(hkey, ms(key), 0, winreg.KEY_READ) + except (OSError, IOError): + continue + subkeys, values, _ = winreg.QueryInfoKey(bkey) + for i in range(values): + try: + ver = float(winreg.EnumValue(bkey, i)[0]) + if ver not in vc_vers: + vc_vers.append(ver) + except ValueError: + pass + for i in range(subkeys): + try: + ver = float(winreg.EnumKey(bkey, i)) + if ver not in vc_vers: + vc_vers.append(ver) + except ValueError: + pass + return sorted(vc_vers) + + @property + def VSInstallDir(self): + """ + Microsoft Visual Studio directory. + """ + # Default path + name = 'Microsoft Visual Studio %0.1f' % self.vc_ver + default = os.path.join(self.ProgramFilesx86, name) + + # Try to get path from registry, if fail use default path + return self.ri.lookup(self.ri.vs, '%0.1f' % self.vc_ver) or default + + @property + def VCInstallDir(self): + """ + Microsoft Visual C++ directory. + """ + self.VSInstallDir + + guess_vc = self._guess_vc() or self._guess_vc_legacy() + + # Try to get "VC++ for Python" path from registry as default path + reg_path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) + python_vc = self.ri.lookup(reg_path, 'installdir') + default_vc = os.path.join(python_vc, 'VC') if python_vc else guess_vc + + # Try to get path from registry, if fail use default path + path = self.ri.lookup(self.ri.vc, '%0.1f' % self.vc_ver) or default_vc + + if not os.path.isdir(path): + msg = 'Microsoft Visual C++ directory not found' + raise distutils.errors.DistutilsPlatformError(msg) + + return path + + def _guess_vc(self): + """ + Locate Visual C for 2017 + """ + if self.vc_ver <= 14.0: + return + + default = r'VC\Tools\MSVC' + guess_vc = os.path.join(self.VSInstallDir, default) + # Subdir with VC exact version as name + try: + vc_exact_ver = os.listdir(guess_vc)[-1] + return os.path.join(guess_vc, vc_exact_ver) + except (OSError, IOError, IndexError): + pass + + def _guess_vc_legacy(self): + """ + Locate Visual C for versions prior to 2017 + """ + default = r'Microsoft Visual Studio %0.1f\VC' % self.vc_ver + return os.path.join(self.ProgramFilesx86, default) + + @property + def WindowsSdkVersion(self): + """ + Microsoft Windows SDK versions for specified MSVC++ version. + """ + if self.vc_ver <= 9.0: + return ('7.0', '6.1', '6.0a') + elif self.vc_ver == 10.0: + return ('7.1', '7.0a') + elif self.vc_ver == 11.0: + return ('8.0', '8.0a') + elif self.vc_ver == 12.0: + return ('8.1', '8.1a') + elif self.vc_ver >= 14.0: + return ('10.0', '8.1') + + @property + def WindowsSdkLastVersion(self): + """ + Microsoft Windows SDK last version + """ + return self._use_last_dir_name(os.path.join( + self.WindowsSdkDir, 'lib')) + + @property + def WindowsSdkDir(self): + """ + Microsoft Windows SDK directory. + """ + sdkdir = '' + for ver in self.WindowsSdkVersion: + # Try to get it from registry + loc = os.path.join(self.ri.windows_sdk, 'v%s' % ver) + sdkdir = self.ri.lookup(loc, 'installationfolder') + if sdkdir: + break + if not sdkdir or not os.path.isdir(sdkdir): + # Try to get "VC++ for Python" version from registry + path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) + install_base = self.ri.lookup(path, 'installdir') + if install_base: + sdkdir = os.path.join(install_base, 'WinSDK') + if not sdkdir or not os.path.isdir(sdkdir): + # If fail, use default new path + for ver in self.WindowsSdkVersion: + intver = ver[:ver.rfind('.')] + path = r'Microsoft SDKs\Windows Kits\%s' % (intver) + d = os.path.join(self.ProgramFiles, path) + if os.path.isdir(d): + sdkdir = d + if not sdkdir or not os.path.isdir(sdkdir): + # If fail, use default old path + for ver in self.WindowsSdkVersion: + path = r'Microsoft SDKs\Windows\v%s' % ver + d = os.path.join(self.ProgramFiles, path) + if os.path.isdir(d): + sdkdir = d + if not sdkdir: + # If fail, use Platform SDK + sdkdir = os.path.join(self.VCInstallDir, 'PlatformSDK') + return sdkdir + + @property + def WindowsSDKExecutablePath(self): + """ + Microsoft Windows SDK executable directory. + """ + # Find WinSDK NetFx Tools registry dir name + if self.vc_ver <= 11.0: + netfxver = 35 + arch = '' + else: + netfxver = 40 + hidex86 = True if self.vc_ver <= 12.0 else False + arch = self.pi.current_dir(x64=True, hidex86=hidex86) + fx = 'WinSDK-NetFx%dTools%s' % (netfxver, arch.replace('\\', '-')) + + # liste all possibles registry paths + regpaths = [] + if self.vc_ver >= 14.0: + for ver in self.NetFxSdkVersion: + regpaths += [os.path.join(self.ri.netfx_sdk, ver, fx)] + + for ver in self.WindowsSdkVersion: + regpaths += [os.path.join(self.ri.windows_sdk, 'v%sA' % ver, fx)] + + # Return installation folder from the more recent path + for path in regpaths: + execpath = self.ri.lookup(path, 'installationfolder') + if execpath: + break + return execpath + + @property + def FSharpInstallDir(self): + """ + Microsoft Visual F# directory. + """ + path = r'%0.1f\Setup\F#' % self.vc_ver + path = os.path.join(self.ri.visualstudio, path) + return self.ri.lookup(path, 'productdir') or '' + + @property + def UniversalCRTSdkDir(self): + """ + Microsoft Universal CRT SDK directory. + """ + # Set Kit Roots versions for specified MSVC++ version + if self.vc_ver >= 14.0: + vers = ('10', '81') + else: + vers = () + + # Find path of the more recent Kit + for ver in vers: + sdkdir = self.ri.lookup(self.ri.windows_kits_roots, + 'kitsroot%s' % ver) + if sdkdir: + break + return sdkdir or '' + + @property + def UniversalCRTSdkLastVersion(self): + """ + Microsoft Universal C Runtime SDK last version + """ + return self._use_last_dir_name(os.path.join( + self.UniversalCRTSdkDir, 'lib')) + + @property + def NetFxSdkVersion(self): + """ + Microsoft .NET Framework SDK versions. + """ + # Set FxSdk versions for specified MSVC++ version + if self.vc_ver >= 14.0: + return ('4.6.1', '4.6') + else: + return () + + @property + def NetFxSdkDir(self): + """ + Microsoft .NET Framework SDK directory. + """ + for ver in self.NetFxSdkVersion: + loc = os.path.join(self.ri.netfx_sdk, ver) + sdkdir = self.ri.lookup(loc, 'kitsinstallationfolder') + if sdkdir: + break + return sdkdir or '' + + @property + def FrameworkDir32(self): + """ + Microsoft .NET Framework 32bit directory. + """ + # Default path + guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework') + + # Try to get path from registry, if fail use default path + return self.ri.lookup(self.ri.vc, 'frameworkdir32') or guess_fw + + @property + def FrameworkDir64(self): + """ + Microsoft .NET Framework 64bit directory. + """ + # Default path + guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework64') + + # Try to get path from registry, if fail use default path + return self.ri.lookup(self.ri.vc, 'frameworkdir64') or guess_fw + + @property + def FrameworkVersion32(self): + """ + Microsoft .NET Framework 32bit versions. + """ + return self._find_dot_net_versions(32) + + @property + def FrameworkVersion64(self): + """ + Microsoft .NET Framework 64bit versions. + """ + return self._find_dot_net_versions(64) + + def _find_dot_net_versions(self, bits): + """ + Find Microsoft .NET Framework versions. + + Parameters + ---------- + bits: int + Platform number of bits: 32 or 64. + """ + # Find actual .NET version in registry + reg_ver = self.ri.lookup(self.ri.vc, 'frameworkver%d' % bits) + dot_net_dir = getattr(self, 'FrameworkDir%d' % bits) + ver = reg_ver or self._use_last_dir_name(dot_net_dir, 'v') or '' + + # Set .NET versions for specified MSVC++ version + if self.vc_ver >= 12.0: + frameworkver = (ver, 'v4.0') + elif self.vc_ver >= 10.0: + frameworkver = ('v4.0.30319' if ver.lower()[:2] != 'v4' else ver, + 'v3.5') + elif self.vc_ver == 9.0: + frameworkver = ('v3.5', 'v2.0.50727') + if self.vc_ver == 8.0: + frameworkver = ('v3.0', 'v2.0.50727') + return frameworkver + + def _use_last_dir_name(self, path, prefix=''): + """ + Return name of the last dir in path or '' if no dir found. + + Parameters + ---------- + path: str + Use dirs in this path + prefix: str + Use only dirs startings by this prefix + """ + matching_dirs = ( + dir_name + for dir_name in reversed(os.listdir(path)) + if os.path.isdir(os.path.join(path, dir_name)) and + dir_name.startswith(prefix) + ) + return next(matching_dirs, None) or '' + + +class EnvironmentInfo: + """ + Return environment variables for specified Microsoft Visual C++ version + and platform : Lib, Include, Path and libpath. + + This function is compatible with Microsoft Visual C++ 9.0 to 14.0. + + Script created by analysing Microsoft environment configuration files like + "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ... + + Parameters + ---------- + arch: str + Target architecture. + vc_ver: float + Required Microsoft Visual C++ version. If not set, autodetect the last + version. + vc_min_ver: float + Minimum Microsoft Visual C++ version. + """ + + # Variables and properties in this class use originals CamelCase variables + # names from Microsoft source files for more easy comparaison. + + def __init__(self, arch, vc_ver=None, vc_min_ver=0): + self.pi = PlatformInfo(arch) + self.ri = RegistryInfo(self.pi) + self.si = SystemInfo(self.ri, vc_ver) + + if self.vc_ver < vc_min_ver: + err = 'No suitable Microsoft Visual C++ version found' + raise distutils.errors.DistutilsPlatformError(err) + + @property + def vc_ver(self): + """ + Microsoft Visual C++ version. + """ + return self.si.vc_ver + + @property + def VSTools(self): + """ + Microsoft Visual Studio Tools + """ + paths = [r'Common7\IDE', r'Common7\Tools'] + + if self.vc_ver >= 14.0: + arch_subdir = self.pi.current_dir(hidex86=True, x64=True) + paths += [r'Common7\IDE\CommonExtensions\Microsoft\TestWindow'] + paths += [r'Team Tools\Performance Tools'] + paths += [r'Team Tools\Performance Tools%s' % arch_subdir] + + return [os.path.join(self.si.VSInstallDir, path) for path in paths] + + @property + def VCIncludes(self): + """ + Microsoft Visual C++ & Microsoft Foundation Class Includes + """ + return [os.path.join(self.si.VCInstallDir, 'Include'), + os.path.join(self.si.VCInstallDir, r'ATLMFC\Include')] + + @property + def VCLibraries(self): + """ + Microsoft Visual C++ & Microsoft Foundation Class Libraries + """ + if self.vc_ver >= 15.0: + arch_subdir = self.pi.target_dir(x64=True) + else: + arch_subdir = self.pi.target_dir(hidex86=True) + paths = ['Lib%s' % arch_subdir, r'ATLMFC\Lib%s' % arch_subdir] + + if self.vc_ver >= 14.0: + paths += [r'Lib\store%s' % arch_subdir] + + return [os.path.join(self.si.VCInstallDir, path) for path in paths] + + @property + def VCStoreRefs(self): + """ + Microsoft Visual C++ store references Libraries + """ + if self.vc_ver < 14.0: + return [] + return [os.path.join(self.si.VCInstallDir, r'Lib\store\references')] + + @property + def VCTools(self): + """ + Microsoft Visual C++ Tools + """ + si = self.si + tools = [os.path.join(si.VCInstallDir, 'VCPackages')] + + forcex86 = True if self.vc_ver <= 10.0 else False + arch_subdir = self.pi.cross_dir(forcex86) + if arch_subdir: + tools += [os.path.join(si.VCInstallDir, 'Bin%s' % arch_subdir)] + + if self.vc_ver == 14.0: + path = 'Bin%s' % self.pi.current_dir(hidex86=True) + tools += [os.path.join(si.VCInstallDir, path)] + + elif self.vc_ver >= 15.0: + host_dir = (r'bin\HostX86%s' if self.pi.current_is_x86() else + r'bin\HostX64%s') + tools += [os.path.join( + si.VCInstallDir, host_dir % self.pi.target_dir(x64=True))] + + if self.pi.current_cpu != self.pi.target_cpu: + tools += [os.path.join( + si.VCInstallDir, host_dir % self.pi.current_dir(x64=True))] + + else: + tools += [os.path.join(si.VCInstallDir, 'Bin')] + + return tools + + @property + def OSLibraries(self): + """ + Microsoft Windows SDK Libraries + """ + if self.vc_ver <= 10.0: + arch_subdir = self.pi.target_dir(hidex86=True, x64=True) + return [os.path.join(self.si.WindowsSdkDir, 'Lib%s' % arch_subdir)] + + else: + arch_subdir = self.pi.target_dir(x64=True) + lib = os.path.join(self.si.WindowsSdkDir, 'lib') + libver = self._sdk_subdir + return [os.path.join(lib, '%sum%s' % (libver , arch_subdir))] + + @property + def OSIncludes(self): + """ + Microsoft Windows SDK Include + """ + include = os.path.join(self.si.WindowsSdkDir, 'include') + + if self.vc_ver <= 10.0: + return [include, os.path.join(include, 'gl')] + + else: + if self.vc_ver >= 14.0: + sdkver = self._sdk_subdir + else: + sdkver = '' + return [os.path.join(include, '%sshared' % sdkver), + os.path.join(include, '%sum' % sdkver), + os.path.join(include, '%swinrt' % sdkver)] + + @property + def OSLibpath(self): + """ + Microsoft Windows SDK Libraries Paths + """ + ref = os.path.join(self.si.WindowsSdkDir, 'References') + libpath = [] + + if self.vc_ver <= 9.0: + libpath += self.OSLibraries + + if self.vc_ver >= 11.0: + libpath += [os.path.join(ref, r'CommonConfiguration\Neutral')] + + if self.vc_ver >= 14.0: + libpath += [ + ref, + os.path.join(self.si.WindowsSdkDir, 'UnionMetadata'), + os.path.join( + ref, + 'Windows.Foundation.UniversalApiContract', + '1.0.0.0', + ), + os.path.join( + ref, + 'Windows.Foundation.FoundationContract', + '1.0.0.0', + ), + os.path.join( + ref, + 'Windows.Networking.Connectivity.WwanContract', + '1.0.0.0', + ), + os.path.join( + self.si.WindowsSdkDir, + 'ExtensionSDKs', + 'Microsoft.VCLibs', + '%0.1f' % self.vc_ver, + 'References', + 'CommonConfiguration', + 'neutral', + ), + ] + return libpath + + @property + def SdkTools(self): + """ + Microsoft Windows SDK Tools + """ + return list(self._sdk_tools()) + + def _sdk_tools(self): + """ + Microsoft Windows SDK Tools paths generator + """ + if self.vc_ver < 15.0: + bin_dir = 'Bin' if self.vc_ver <= 11.0 else r'Bin\x86' + yield os.path.join(self.si.WindowsSdkDir, bin_dir) + + if not self.pi.current_is_x86(): + arch_subdir = self.pi.current_dir(x64=True) + path = 'Bin%s' % arch_subdir + yield os.path.join(self.si.WindowsSdkDir, path) + + if self.vc_ver == 10.0 or self.vc_ver == 11.0: + if self.pi.target_is_x86(): + arch_subdir = '' + else: + arch_subdir = self.pi.current_dir(hidex86=True, x64=True) + path = r'Bin\NETFX 4.0 Tools%s' % arch_subdir + yield os.path.join(self.si.WindowsSdkDir, path) + + elif self.vc_ver >= 15.0: + path = os.path.join(self.si.WindowsSdkDir, 'Bin') + arch_subdir = self.pi.current_dir(x64=True) + sdkver = self.si.WindowsSdkLastVersion + yield os.path.join(path, '%s%s' % (sdkver, arch_subdir)) + + if self.si.WindowsSDKExecutablePath: + yield self.si.WindowsSDKExecutablePath + + @property + def _sdk_subdir(self): + """ + Microsoft Windows SDK version subdir + """ + ucrtver = self.si.WindowsSdkLastVersion + return ('%s\\' % ucrtver) if ucrtver else '' + + @property + def SdkSetup(self): + """ + Microsoft Windows SDK Setup + """ + if self.vc_ver > 9.0: + return [] + + return [os.path.join(self.si.WindowsSdkDir, 'Setup')] + + @property + def FxTools(self): + """ + Microsoft .NET Framework Tools + """ + pi = self.pi + si = self.si + + if self.vc_ver <= 10.0: + include32 = True + include64 = not pi.target_is_x86() and not pi.current_is_x86() + else: + include32 = pi.target_is_x86() or pi.current_is_x86() + include64 = pi.current_cpu == 'amd64' or pi.target_cpu == 'amd64' + + tools = [] + if include32: + tools += [os.path.join(si.FrameworkDir32, ver) + for ver in si.FrameworkVersion32] + if include64: + tools += [os.path.join(si.FrameworkDir64, ver) + for ver in si.FrameworkVersion64] + return tools + + @property + def NetFxSDKLibraries(self): + """ + Microsoft .Net Framework SDK Libraries + """ + if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: + return [] + + arch_subdir = self.pi.target_dir(x64=True) + return [os.path.join(self.si.NetFxSdkDir, r'lib\um%s' % arch_subdir)] + + @property + def NetFxSDKIncludes(self): + """ + Microsoft .Net Framework SDK Includes + """ + if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: + return [] + + return [os.path.join(self.si.NetFxSdkDir, r'include\um')] + + @property + def VsTDb(self): + """ + Microsoft Visual Studio Team System Database + """ + return [os.path.join(self.si.VSInstallDir, r'VSTSDB\Deploy')] + + @property + def MSBuild(self): + """ + Microsoft Build Engine + """ + if self.vc_ver < 12.0: + return [] + elif self.vc_ver < 15.0: + base_path = self.si.ProgramFilesx86 + arch_subdir = self.pi.current_dir(hidex86=True) + else: + base_path = self.si.VSInstallDir + arch_subdir = '' + + path = r'MSBuild\%0.1f\bin%s' % (self.vc_ver, arch_subdir) + build = [os.path.join(base_path, path)] + + if self.vc_ver >= 15.0: + # Add Roslyn C# & Visual Basic Compiler + build += [os.path.join(base_path, path, 'Roslyn')] + + return build + + @property + def HTMLHelpWorkshop(self): + """ + Microsoft HTML Help Workshop + """ + if self.vc_ver < 11.0: + return [] + + return [os.path.join(self.si.ProgramFilesx86, 'HTML Help Workshop')] + + @property + def UCRTLibraries(self): + """ + Microsoft Universal C Runtime SDK Libraries + """ + if self.vc_ver < 14.0: + return [] + + arch_subdir = self.pi.target_dir(x64=True) + lib = os.path.join(self.si.UniversalCRTSdkDir, 'lib') + ucrtver = self._ucrt_subdir + return [os.path.join(lib, '%sucrt%s' % (ucrtver, arch_subdir))] + + @property + def UCRTIncludes(self): + """ + Microsoft Universal C Runtime SDK Include + """ + if self.vc_ver < 14.0: + return [] + + include = os.path.join(self.si.UniversalCRTSdkDir, 'include') + return [os.path.join(include, '%sucrt' % self._ucrt_subdir)] + + @property + def _ucrt_subdir(self): + """ + Microsoft Universal C Runtime SDK version subdir + """ + ucrtver = self.si.UniversalCRTSdkLastVersion + return ('%s\\' % ucrtver) if ucrtver else '' + + @property + def FSharp(self): + """ + Microsoft Visual F# + """ + if self.vc_ver < 11.0 and self.vc_ver > 12.0: + return [] + + return self.si.FSharpInstallDir + + @property + def VCRuntimeRedist(self): + """ + Microsoft Visual C++ runtime redistribuable dll + """ + arch_subdir = self.pi.target_dir(x64=True) + if self.vc_ver < 15: + redist_path = self.si.VCInstallDir + vcruntime = 'redist%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll' + else: + redist_path = self.si.VCInstallDir.replace('\\Tools', '\\Redist') + vcruntime = 'onecore%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll' + + # Visual Studio 2017 is still Visual C++ 14.0 + dll_ver = 14.0 if self.vc_ver == 15 else self.vc_ver + + vcruntime = vcruntime % (arch_subdir, self.vc_ver, dll_ver) + return os.path.join(redist_path, vcruntime) + + def return_env(self, exists=True): + """ + Return environment dict. + + Parameters + ---------- + exists: bool + It True, only return existing paths. + """ + env = dict( + include=self._build_paths('include', + [self.VCIncludes, + self.OSIncludes, + self.UCRTIncludes, + self.NetFxSDKIncludes], + exists), + lib=self._build_paths('lib', + [self.VCLibraries, + self.OSLibraries, + self.FxTools, + self.UCRTLibraries, + self.NetFxSDKLibraries], + exists), + libpath=self._build_paths('libpath', + [self.VCLibraries, + self.FxTools, + self.VCStoreRefs, + self.OSLibpath], + exists), + path=self._build_paths('path', + [self.VCTools, + self.VSTools, + self.VsTDb, + self.SdkTools, + self.SdkSetup, + self.FxTools, + self.MSBuild, + self.HTMLHelpWorkshop, + self.FSharp], + exists), + ) + if self.vc_ver >= 14 and os.path.isfile(self.VCRuntimeRedist): + env['py_vcruntime_redist'] = self.VCRuntimeRedist + return env + + def _build_paths(self, name, spec_path_lists, exists): + """ + Given an environment variable name and specified paths, + return a pathsep-separated string of paths containing + unique, extant, directories from those paths and from + the environment variable. Raise an error if no paths + are resolved. + """ + # flatten spec_path_lists + spec_paths = itertools.chain.from_iterable(spec_path_lists) + env_paths = safe_env.get(name, '').split(os.pathsep) + paths = itertools.chain(spec_paths, env_paths) + extant_paths = list(filter(os.path.isdir, paths)) if exists else paths + if not extant_paths: + msg = "%s environment variable is empty" % name.upper() + raise distutils.errors.DistutilsPlatformError(msg) + unique_paths = self._unique_everseen(extant_paths) + return os.pathsep.join(unique_paths) + + # from Python docs + def _unique_everseen(self, iterable, key=None): + """ + List unique elements, preserving order. + Remember all elements ever seen. + + _unique_everseen('AAAABBBCCDAABBB') --> A B C D + + _unique_everseen('ABBCcAD', str.lower) --> A B C D + """ + seen = set() + seen_add = seen.add + if key is None: + for element in filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/namespaces.py b/mongo_mac/lib/python3.6/site-packages/setuptools/namespaces.py new file mode 100644 index 0000000..dc16106 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/namespaces.py @@ -0,0 +1,107 @@ +import os +from distutils import log +import itertools + +from setuptools.extern.six.moves import map + + +flatten = itertools.chain.from_iterable + + +class Installer: + + nspkg_ext = '-nspkg.pth' + + def install_namespaces(self): + nsp = self._get_all_ns_packages() + if not nsp: + return + filename, ext = os.path.splitext(self._get_target()) + filename += self.nspkg_ext + self.outputs.append(filename) + log.info("Installing %s", filename) + lines = map(self._gen_nspkg_line, nsp) + + if self.dry_run: + # always generate the lines, even in dry run + list(lines) + return + + with open(filename, 'wt') as f: + f.writelines(lines) + + def uninstall_namespaces(self): + filename, ext = os.path.splitext(self._get_target()) + filename += self.nspkg_ext + if not os.path.exists(filename): + return + log.info("Removing %s", filename) + os.remove(filename) + + def _get_target(self): + return self.target + + _nspkg_tmpl = ( + "import sys, types, os", + "has_mfs = sys.version_info > (3, 5)", + "p = os.path.join(%(root)s, *%(pth)r)", + "importlib = has_mfs and __import__('importlib.util')", + "has_mfs and __import__('importlib.machinery')", + "m = has_mfs and " + "sys.modules.setdefault(%(pkg)r, " + "importlib.util.module_from_spec(" + "importlib.machinery.PathFinder.find_spec(%(pkg)r, " + "[os.path.dirname(p)])))", + "m = m or " + "sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))", + "mp = (m or []) and m.__dict__.setdefault('__path__',[])", + "(p not in mp) and mp.append(p)", + ) + "lines for the namespace installer" + + _nspkg_tmpl_multi = ( + 'm and setattr(sys.modules[%(parent)r], %(child)r, m)', + ) + "additional line(s) when a parent package is indicated" + + def _get_root(self): + return "sys._getframe(1).f_locals['sitedir']" + + def _gen_nspkg_line(self, pkg): + # ensure pkg is not a unicode string under Python 2.7 + pkg = str(pkg) + pth = tuple(pkg.split('.')) + root = self._get_root() + tmpl_lines = self._nspkg_tmpl + parent, sep, child = pkg.rpartition('.') + if parent: + tmpl_lines += self._nspkg_tmpl_multi + return ';'.join(tmpl_lines) % locals() + '\n' + + def _get_all_ns_packages(self): + """Return sorted list of all package namespaces""" + pkgs = self.distribution.namespace_packages or [] + return sorted(flatten(map(self._pkg_names, pkgs))) + + @staticmethod + def _pkg_names(pkg): + """ + Given a namespace package, yield the components of that + package. + + >>> names = Installer._pkg_names('a.b.c') + >>> set(names) == set(['a', 'a.b', 'a.b.c']) + True + """ + parts = pkg.split('.') + while parts: + yield '.'.join(parts) + parts.pop() + + +class DevelopInstaller(Installer): + def _get_root(self): + return repr(str(self.egg_path)) + + def _get_target(self): + return self.egg_link diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/package_index.py b/mongo_mac/lib/python3.6/site-packages/setuptools/package_index.py new file mode 100644 index 0000000..6b06f2c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/package_index.py @@ -0,0 +1,1136 @@ +"""PyPI and direct package downloading""" +import sys +import os +import re +import shutil +import socket +import base64 +import hashlib +import itertools +import warnings +from functools import wraps + +from setuptools.extern import six +from setuptools.extern.six.moves import urllib, http_client, configparser, map + +import setuptools +from pkg_resources import ( + CHECKOUT_DIST, Distribution, BINARY_DIST, normalize_path, SOURCE_DIST, + Environment, find_distributions, safe_name, safe_version, + to_filename, Requirement, DEVELOP_DIST, EGG_DIST, +) +from setuptools import ssl_support +from distutils import log +from distutils.errors import DistutilsError +from fnmatch import translate +from setuptools.py27compat import get_all_headers +from setuptools.py33compat import unescape +from setuptools.wheel import Wheel + +__metaclass__ = type + +EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.+!]+)$') +HREF = re.compile(r"""href\s*=\s*['"]?([^'"> ]+)""", re.I) +PYPI_MD5 = re.compile( + r'<a href="([^"#]+)">([^<]+)</a>\n\s+\(<a (?:title="MD5 hash"\n\s+)' + r'href="[^?]+\?:action=show_md5&digest=([0-9a-f]{32})">md5</a>\)' +) +URL_SCHEME = re.compile('([-+.a-z0-9]{2,}):', re.I).match +EXTENSIONS = ".tar.gz .tar.bz2 .tar .zip .tgz".split() + +__all__ = [ + 'PackageIndex', 'distros_for_url', 'parse_bdist_wininst', + 'interpret_distro_name', +] + +_SOCKET_TIMEOUT = 15 + +_tmpl = "setuptools/{setuptools.__version__} Python-urllib/{py_major}" +user_agent = _tmpl.format(py_major=sys.version[:3], setuptools=setuptools) + + +def parse_requirement_arg(spec): + try: + return Requirement.parse(spec) + except ValueError: + raise DistutilsError( + "Not a URL, existing file, or requirement spec: %r" % (spec,) + ) + + +def parse_bdist_wininst(name): + """Return (base,pyversion) or (None,None) for possible .exe name""" + + lower = name.lower() + base, py_ver, plat = None, None, None + + if lower.endswith('.exe'): + if lower.endswith('.win32.exe'): + base = name[:-10] + plat = 'win32' + elif lower.startswith('.win32-py', -16): + py_ver = name[-7:-4] + base = name[:-16] + plat = 'win32' + elif lower.endswith('.win-amd64.exe'): + base = name[:-14] + plat = 'win-amd64' + elif lower.startswith('.win-amd64-py', -20): + py_ver = name[-7:-4] + base = name[:-20] + plat = 'win-amd64' + return base, py_ver, plat + + +def egg_info_for_url(url): + parts = urllib.parse.urlparse(url) + scheme, server, path, parameters, query, fragment = parts + base = urllib.parse.unquote(path.split('/')[-1]) + if server == 'sourceforge.net' and base == 'download': # XXX Yuck + base = urllib.parse.unquote(path.split('/')[-2]) + if '#' in base: + base, fragment = base.split('#', 1) + return base, fragment + + +def distros_for_url(url, metadata=None): + """Yield egg or source distribution objects that might be found at a URL""" + base, fragment = egg_info_for_url(url) + for dist in distros_for_location(url, base, metadata): + yield dist + if fragment: + match = EGG_FRAGMENT.match(fragment) + if match: + for dist in interpret_distro_name( + url, match.group(1), metadata, precedence=CHECKOUT_DIST + ): + yield dist + + +def distros_for_location(location, basename, metadata=None): + """Yield egg or source distribution objects based on basename""" + if basename.endswith('.egg.zip'): + basename = basename[:-4] # strip the .zip + if basename.endswith('.egg') and '-' in basename: + # only one, unambiguous interpretation + return [Distribution.from_location(location, basename, metadata)] + if basename.endswith('.whl') and '-' in basename: + wheel = Wheel(basename) + if not wheel.is_compatible(): + return [] + return [Distribution( + location=location, + project_name=wheel.project_name, + version=wheel.version, + # Increase priority over eggs. + precedence=EGG_DIST + 1, + )] + if basename.endswith('.exe'): + win_base, py_ver, platform = parse_bdist_wininst(basename) + if win_base is not None: + return interpret_distro_name( + location, win_base, metadata, py_ver, BINARY_DIST, platform + ) + # Try source distro extensions (.zip, .tgz, etc.) + # + for ext in EXTENSIONS: + if basename.endswith(ext): + basename = basename[:-len(ext)] + return interpret_distro_name(location, basename, metadata) + return [] # no extension matched + + +def distros_for_filename(filename, metadata=None): + """Yield possible egg or source distribution objects based on a filename""" + return distros_for_location( + normalize_path(filename), os.path.basename(filename), metadata + ) + + +def interpret_distro_name( + location, basename, metadata, py_version=None, precedence=SOURCE_DIST, + platform=None +): + """Generate alternative interpretations of a source distro name + + Note: if `location` is a filesystem filename, you should call + ``pkg_resources.normalize_path()`` on it before passing it to this + routine! + """ + # Generate alternative interpretations of a source distro name + # Because some packages are ambiguous as to name/versions split + # e.g. "adns-python-1.1.0", "egenix-mx-commercial", etc. + # So, we generate each possible interepretation (e.g. "adns, python-1.1.0" + # "adns-python, 1.1.0", and "adns-python-1.1.0, no version"). In practice, + # the spurious interpretations should be ignored, because in the event + # there's also an "adns" package, the spurious "python-1.1.0" version will + # compare lower than any numeric version number, and is therefore unlikely + # to match a request for it. It's still a potential problem, though, and + # in the long run PyPI and the distutils should go for "safe" names and + # versions in distribution archive names (sdist and bdist). + + parts = basename.split('-') + if not py_version and any(re.match(r'py\d\.\d$', p) for p in parts[2:]): + # it is a bdist_dumb, not an sdist -- bail out + return + + for p in range(1, len(parts) + 1): + yield Distribution( + location, metadata, '-'.join(parts[:p]), '-'.join(parts[p:]), + py_version=py_version, precedence=precedence, + platform=platform + ) + + +# From Python 2.7 docs +def unique_everseen(iterable, key=None): + "List unique elements, preserving order. Remember all elements ever seen." + # unique_everseen('AAAABBBCCDAABBB') --> A B C D + # unique_everseen('ABBCcAD', str.lower) --> A B C D + seen = set() + seen_add = seen.add + if key is None: + for element in six.moves.filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element + + +def unique_values(func): + """ + Wrap a function returning an iterable such that the resulting iterable + only ever yields unique items. + """ + + @wraps(func) + def wrapper(*args, **kwargs): + return unique_everseen(func(*args, **kwargs)) + + return wrapper + + +REL = re.compile(r"""<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>""", re.I) +# this line is here to fix emacs' cruddy broken syntax highlighting + + +@unique_values +def find_external_links(url, page): + """Find rel="homepage" and rel="download" links in `page`, yielding URLs""" + + for match in REL.finditer(page): + tag, rel = match.groups() + rels = set(map(str.strip, rel.lower().split(','))) + if 'homepage' in rels or 'download' in rels: + for match in HREF.finditer(tag): + yield urllib.parse.urljoin(url, htmldecode(match.group(1))) + + for tag in ("<th>Home Page", "<th>Download URL"): + pos = page.find(tag) + if pos != -1: + match = HREF.search(page, pos) + if match: + yield urllib.parse.urljoin(url, htmldecode(match.group(1))) + + +class ContentChecker: + """ + A null content checker that defines the interface for checking content + """ + + def feed(self, block): + """ + Feed a block of data to the hash. + """ + return + + def is_valid(self): + """ + Check the hash. Return False if validation fails. + """ + return True + + def report(self, reporter, template): + """ + Call reporter with information about the checker (hash name) + substituted into the template. + """ + return + + +class HashChecker(ContentChecker): + pattern = re.compile( + r'(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=' + r'(?P<expected>[a-f0-9]+)' + ) + + def __init__(self, hash_name, expected): + self.hash_name = hash_name + self.hash = hashlib.new(hash_name) + self.expected = expected + + @classmethod + def from_url(cls, url): + "Construct a (possibly null) ContentChecker from a URL" + fragment = urllib.parse.urlparse(url)[-1] + if not fragment: + return ContentChecker() + match = cls.pattern.search(fragment) + if not match: + return ContentChecker() + return cls(**match.groupdict()) + + def feed(self, block): + self.hash.update(block) + + def is_valid(self): + return self.hash.hexdigest() == self.expected + + def report(self, reporter, template): + msg = template % self.hash_name + return reporter(msg) + + +class PackageIndex(Environment): + """A distribution index that scans web pages for download URLs""" + + def __init__( + self, index_url="https://pypi.org/simple/", hosts=('*',), + ca_bundle=None, verify_ssl=True, *args, **kw + ): + Environment.__init__(self, *args, **kw) + self.index_url = index_url + "/" [:not index_url.endswith('/')] + self.scanned_urls = {} + self.fetched_urls = {} + self.package_pages = {} + self.allows = re.compile('|'.join(map(translate, hosts))).match + self.to_scan = [] + use_ssl = ( + verify_ssl + and ssl_support.is_available + and (ca_bundle or ssl_support.find_ca_bundle()) + ) + if use_ssl: + self.opener = ssl_support.opener_for(ca_bundle) + else: + self.opener = urllib.request.urlopen + + def process_url(self, url, retrieve=False): + """Evaluate a URL as a possible download, and maybe retrieve it""" + if url in self.scanned_urls and not retrieve: + return + self.scanned_urls[url] = True + if not URL_SCHEME(url): + self.process_filename(url) + return + else: + dists = list(distros_for_url(url)) + if dists: + if not self.url_ok(url): + return + self.debug("Found link: %s", url) + + if dists or not retrieve or url in self.fetched_urls: + list(map(self.add, dists)) + return # don't need the actual page + + if not self.url_ok(url): + self.fetched_urls[url] = True + return + + self.info("Reading %s", url) + self.fetched_urls[url] = True # prevent multiple fetch attempts + tmpl = "Download error on %s: %%s -- Some packages may not be found!" + f = self.open_url(url, tmpl % url) + if f is None: + return + self.fetched_urls[f.url] = True + if 'html' not in f.headers.get('content-type', '').lower(): + f.close() # not html, we can't process it + return + + base = f.url # handle redirects + page = f.read() + if not isinstance(page, str): + # In Python 3 and got bytes but want str. + if isinstance(f, urllib.error.HTTPError): + # Errors have no charset, assume latin1: + charset = 'latin-1' + else: + charset = f.headers.get_param('charset') or 'latin-1' + page = page.decode(charset, "ignore") + f.close() + for match in HREF.finditer(page): + link = urllib.parse.urljoin(base, htmldecode(match.group(1))) + self.process_url(link) + if url.startswith(self.index_url) and getattr(f, 'code', None) != 404: + page = self.process_index(url, page) + + def process_filename(self, fn, nested=False): + # process filenames or directories + if not os.path.exists(fn): + self.warn("Not found: %s", fn) + return + + if os.path.isdir(fn) and not nested: + path = os.path.realpath(fn) + for item in os.listdir(path): + self.process_filename(os.path.join(path, item), True) + + dists = distros_for_filename(fn) + if dists: + self.debug("Found: %s", fn) + list(map(self.add, dists)) + + def url_ok(self, url, fatal=False): + s = URL_SCHEME(url) + is_file = s and s.group(1).lower() == 'file' + if is_file or self.allows(urllib.parse.urlparse(url)[1]): + return True + msg = ( + "\nNote: Bypassing %s (disallowed host; see " + "http://bit.ly/2hrImnY for details).\n") + if fatal: + raise DistutilsError(msg % url) + else: + self.warn(msg, url) + + def scan_egg_links(self, search_path): + dirs = filter(os.path.isdir, search_path) + egg_links = ( + (path, entry) + for path in dirs + for entry in os.listdir(path) + if entry.endswith('.egg-link') + ) + list(itertools.starmap(self.scan_egg_link, egg_links)) + + def scan_egg_link(self, path, entry): + with open(os.path.join(path, entry)) as raw_lines: + # filter non-empty lines + lines = list(filter(None, map(str.strip, raw_lines))) + + if len(lines) != 2: + # format is not recognized; punt + return + + egg_path, setup_path = lines + + for dist in find_distributions(os.path.join(path, egg_path)): + dist.location = os.path.join(path, *lines) + dist.precedence = SOURCE_DIST + self.add(dist) + + def process_index(self, url, page): + """Process the contents of a PyPI page""" + + def scan(link): + # Process a URL to see if it's for a package page + if link.startswith(self.index_url): + parts = list(map( + urllib.parse.unquote, link[len(self.index_url):].split('/') + )) + if len(parts) == 2 and '#' not in parts[1]: + # it's a package page, sanitize and index it + pkg = safe_name(parts[0]) + ver = safe_version(parts[1]) + self.package_pages.setdefault(pkg.lower(), {})[link] = True + return to_filename(pkg), to_filename(ver) + return None, None + + # process an index page into the package-page index + for match in HREF.finditer(page): + try: + scan(urllib.parse.urljoin(url, htmldecode(match.group(1)))) + except ValueError: + pass + + pkg, ver = scan(url) # ensure this page is in the page index + if pkg: + # process individual package page + for new_url in find_external_links(url, page): + # Process the found URL + base, frag = egg_info_for_url(new_url) + if base.endswith('.py') and not frag: + if ver: + new_url += '#egg=%s-%s' % (pkg, ver) + else: + self.need_version_info(url) + self.scan_url(new_url) + + return PYPI_MD5.sub( + lambda m: '<a href="%s#md5=%s">%s</a>' % m.group(1, 3, 2), page + ) + else: + return "" # no sense double-scanning non-package pages + + def need_version_info(self, url): + self.scan_all( + "Page at %s links to .py file(s) without version info; an index " + "scan is required.", url + ) + + def scan_all(self, msg=None, *args): + if self.index_url not in self.fetched_urls: + if msg: + self.warn(msg, *args) + self.info( + "Scanning index of all packages (this may take a while)" + ) + self.scan_url(self.index_url) + + def find_packages(self, requirement): + self.scan_url(self.index_url + requirement.unsafe_name + '/') + + if not self.package_pages.get(requirement.key): + # Fall back to safe version of the name + self.scan_url(self.index_url + requirement.project_name + '/') + + if not self.package_pages.get(requirement.key): + # We couldn't find the target package, so search the index page too + self.not_found_in_index(requirement) + + for url in list(self.package_pages.get(requirement.key, ())): + # scan each page that might be related to the desired package + self.scan_url(url) + + def obtain(self, requirement, installer=None): + self.prescan() + self.find_packages(requirement) + for dist in self[requirement.key]: + if dist in requirement: + return dist + self.debug("%s does not match %s", requirement, dist) + return super(PackageIndex, self).obtain(requirement, installer) + + def check_hash(self, checker, filename, tfp): + """ + checker is a ContentChecker + """ + checker.report( + self.debug, + "Validating %%s checksum for %s" % filename) + if not checker.is_valid(): + tfp.close() + os.unlink(filename) + raise DistutilsError( + "%s validation failed for %s; " + "possible download problem?" + % (checker.hash.name, os.path.basename(filename)) + ) + + def add_find_links(self, urls): + """Add `urls` to the list that will be prescanned for searches""" + for url in urls: + if ( + self.to_scan is None # if we have already "gone online" + or not URL_SCHEME(url) # or it's a local file/directory + or url.startswith('file:') + or list(distros_for_url(url)) # or a direct package link + ): + # then go ahead and process it now + self.scan_url(url) + else: + # otherwise, defer retrieval till later + self.to_scan.append(url) + + def prescan(self): + """Scan urls scheduled for prescanning (e.g. --find-links)""" + if self.to_scan: + list(map(self.scan_url, self.to_scan)) + self.to_scan = None # from now on, go ahead and process immediately + + def not_found_in_index(self, requirement): + if self[requirement.key]: # we've seen at least one distro + meth, msg = self.info, "Couldn't retrieve index page for %r" + else: # no distros seen for this name, might be misspelled + meth, msg = ( + self.warn, + "Couldn't find index page for %r (maybe misspelled?)") + meth(msg, requirement.unsafe_name) + self.scan_all() + + def download(self, spec, tmpdir): + """Locate and/or download `spec` to `tmpdir`, returning a local path + + `spec` may be a ``Requirement`` object, or a string containing a URL, + an existing local filename, or a project/version requirement spec + (i.e. the string form of a ``Requirement`` object). If it is the URL + of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one + that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is + automatically created alongside the downloaded file. + + If `spec` is a ``Requirement`` object or a string containing a + project/version requirement spec, this method returns the location of + a matching distribution (possibly after downloading it to `tmpdir`). + If `spec` is a locally existing file or directory name, it is simply + returned unchanged. If `spec` is a URL, it is downloaded to a subpath + of `tmpdir`, and the local filename is returned. Various errors may be + raised if a problem occurs during downloading. + """ + if not isinstance(spec, Requirement): + scheme = URL_SCHEME(spec) + if scheme: + # It's a url, download it to tmpdir + found = self._download_url(scheme.group(1), spec, tmpdir) + base, fragment = egg_info_for_url(spec) + if base.endswith('.py'): + found = self.gen_setup(found, fragment, tmpdir) + return found + elif os.path.exists(spec): + # Existing file or directory, just return it + return spec + else: + spec = parse_requirement_arg(spec) + return getattr(self.fetch_distribution(spec, tmpdir), 'location', None) + + def fetch_distribution( + self, requirement, tmpdir, force_scan=False, source=False, + develop_ok=False, local_index=None): + """Obtain a distribution suitable for fulfilling `requirement` + + `requirement` must be a ``pkg_resources.Requirement`` instance. + If necessary, or if the `force_scan` flag is set, the requirement is + searched for in the (online) package index as well as the locally + installed packages. If a distribution matching `requirement` is found, + the returned distribution's ``location`` is the value you would have + gotten from calling the ``download()`` method with the matching + distribution's URL or filename. If no matching distribution is found, + ``None`` is returned. + + If the `source` flag is set, only source distributions and source + checkout links will be considered. Unless the `develop_ok` flag is + set, development and system eggs (i.e., those using the ``.egg-info`` + format) will be ignored. + """ + # process a Requirement + self.info("Searching for %s", requirement) + skipped = {} + dist = None + + def find(req, env=None): + if env is None: + env = self + # Find a matching distribution; may be called more than once + + for dist in env[req.key]: + + if dist.precedence == DEVELOP_DIST and not develop_ok: + if dist not in skipped: + self.warn( + "Skipping development or system egg: %s", dist, + ) + skipped[dist] = 1 + continue + + test = ( + dist in req + and (dist.precedence <= SOURCE_DIST or not source) + ) + if test: + loc = self.download(dist.location, tmpdir) + dist.download_location = loc + if os.path.exists(dist.download_location): + return dist + + if force_scan: + self.prescan() + self.find_packages(requirement) + dist = find(requirement) + + if not dist and local_index is not None: + dist = find(requirement, local_index) + + if dist is None: + if self.to_scan is not None: + self.prescan() + dist = find(requirement) + + if dist is None and not force_scan: + self.find_packages(requirement) + dist = find(requirement) + + if dist is None: + self.warn( + "No local packages or working download links found for %s%s", + (source and "a source distribution of " or ""), + requirement, + ) + else: + self.info("Best match: %s", dist) + return dist.clone(location=dist.download_location) + + def fetch(self, requirement, tmpdir, force_scan=False, source=False): + """Obtain a file suitable for fulfilling `requirement` + + DEPRECATED; use the ``fetch_distribution()`` method now instead. For + backward compatibility, this routine is identical but returns the + ``location`` of the downloaded distribution instead of a distribution + object. + """ + dist = self.fetch_distribution(requirement, tmpdir, force_scan, source) + if dist is not None: + return dist.location + return None + + def gen_setup(self, filename, fragment, tmpdir): + match = EGG_FRAGMENT.match(fragment) + dists = match and [ + d for d in + interpret_distro_name(filename, match.group(1), None) if d.version + ] or [] + + if len(dists) == 1: # unambiguous ``#egg`` fragment + basename = os.path.basename(filename) + + # Make sure the file has been downloaded to the temp dir. + if os.path.dirname(filename) != tmpdir: + dst = os.path.join(tmpdir, basename) + from setuptools.command.easy_install import samefile + if not samefile(filename, dst): + shutil.copy2(filename, dst) + filename = dst + + with open(os.path.join(tmpdir, 'setup.py'), 'w') as file: + file.write( + "from setuptools import setup\n" + "setup(name=%r, version=%r, py_modules=[%r])\n" + % ( + dists[0].project_name, dists[0].version, + os.path.splitext(basename)[0] + ) + ) + return filename + + elif match: + raise DistutilsError( + "Can't unambiguously interpret project/version identifier %r; " + "any dashes in the name or version should be escaped using " + "underscores. %r" % (fragment, dists) + ) + else: + raise DistutilsError( + "Can't process plain .py files without an '#egg=name-version'" + " suffix to enable automatic setup script generation." + ) + + dl_blocksize = 8192 + + def _download_to(self, url, filename): + self.info("Downloading %s", url) + # Download the file + fp = None + try: + checker = HashChecker.from_url(url) + fp = self.open_url(url) + if isinstance(fp, urllib.error.HTTPError): + raise DistutilsError( + "Can't download %s: %s %s" % (url, fp.code, fp.msg) + ) + headers = fp.info() + blocknum = 0 + bs = self.dl_blocksize + size = -1 + if "content-length" in headers: + # Some servers return multiple Content-Length headers :( + sizes = get_all_headers(headers, 'Content-Length') + size = max(map(int, sizes)) + self.reporthook(url, filename, blocknum, bs, size) + with open(filename, 'wb') as tfp: + while True: + block = fp.read(bs) + if block: + checker.feed(block) + tfp.write(block) + blocknum += 1 + self.reporthook(url, filename, blocknum, bs, size) + else: + break + self.check_hash(checker, filename, tfp) + return headers + finally: + if fp: + fp.close() + + def reporthook(self, url, filename, blocknum, blksize, size): + pass # no-op + + def open_url(self, url, warning=None): + if url.startswith('file:'): + return local_open(url) + try: + return open_with_auth(url, self.opener) + except (ValueError, http_client.InvalidURL) as v: + msg = ' '.join([str(arg) for arg in v.args]) + if warning: + self.warn(warning, msg) + else: + raise DistutilsError('%s %s' % (url, msg)) + except urllib.error.HTTPError as v: + return v + except urllib.error.URLError as v: + if warning: + self.warn(warning, v.reason) + else: + raise DistutilsError("Download error for %s: %s" + % (url, v.reason)) + except http_client.BadStatusLine as v: + if warning: + self.warn(warning, v.line) + else: + raise DistutilsError( + '%s returned a bad status line. The server might be ' + 'down, %s' % + (url, v.line) + ) + except (http_client.HTTPException, socket.error) as v: + if warning: + self.warn(warning, v) + else: + raise DistutilsError("Download error for %s: %s" + % (url, v)) + + def _download_url(self, scheme, url, tmpdir): + # Determine download filename + # + name, fragment = egg_info_for_url(url) + if name: + while '..' in name: + name = name.replace('..', '.').replace('\\', '_') + else: + name = "__downloaded__" # default if URL has no path contents + + if name.endswith('.egg.zip'): + name = name[:-4] # strip the extra .zip before download + + filename = os.path.join(tmpdir, name) + + # Download the file + # + if scheme == 'svn' or scheme.startswith('svn+'): + return self._download_svn(url, filename) + elif scheme == 'git' or scheme.startswith('git+'): + return self._download_git(url, filename) + elif scheme.startswith('hg+'): + return self._download_hg(url, filename) + elif scheme == 'file': + return urllib.request.url2pathname(urllib.parse.urlparse(url)[2]) + else: + self.url_ok(url, True) # raises error if not allowed + return self._attempt_download(url, filename) + + def scan_url(self, url): + self.process_url(url, True) + + def _attempt_download(self, url, filename): + headers = self._download_to(url, filename) + if 'html' in headers.get('content-type', '').lower(): + return self._download_html(url, headers, filename) + else: + return filename + + def _download_html(self, url, headers, filename): + file = open(filename) + for line in file: + if line.strip(): + # Check for a subversion index page + if re.search(r'<title>([^- ]+ - )?Revision \d+:', line): + # it's a subversion index page: + file.close() + os.unlink(filename) + return self._download_svn(url, filename) + break # not an index page + file.close() + os.unlink(filename) + raise DistutilsError("Unexpected HTML page found at " + url) + + def _download_svn(self, url, filename): + warnings.warn("SVN download support is deprecated", UserWarning) + url = url.split('#', 1)[0] # remove any fragment for svn's sake + creds = '' + if url.lower().startswith('svn:') and '@' in url: + scheme, netloc, path, p, q, f = urllib.parse.urlparse(url) + if not netloc and path.startswith('//') and '/' in path[2:]: + netloc, path = path[2:].split('/', 1) + auth, host = _splituser(netloc) + if auth: + if ':' in auth: + user, pw = auth.split(':', 1) + creds = " --username=%s --password=%s" % (user, pw) + else: + creds = " --username=" + auth + netloc = host + parts = scheme, netloc, url, p, q, f + url = urllib.parse.urlunparse(parts) + self.info("Doing subversion checkout from %s to %s", url, filename) + os.system("svn checkout%s -q %s %s" % (creds, url, filename)) + return filename + + @staticmethod + def _vcs_split_rev_from_url(url, pop_prefix=False): + scheme, netloc, path, query, frag = urllib.parse.urlsplit(url) + + scheme = scheme.split('+', 1)[-1] + + # Some fragment identification fails + path = path.split('#', 1)[0] + + rev = None + if '@' in path: + path, rev = path.rsplit('@', 1) + + # Also, discard fragment + url = urllib.parse.urlunsplit((scheme, netloc, path, query, '')) + + return url, rev + + def _download_git(self, url, filename): + filename = filename.split('#', 1)[0] + url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) + + self.info("Doing git clone from %s to %s", url, filename) + os.system("git clone --quiet %s %s" % (url, filename)) + + if rev is not None: + self.info("Checking out %s", rev) + os.system("git -C %s checkout --quiet %s" % ( + filename, + rev, + )) + + return filename + + def _download_hg(self, url, filename): + filename = filename.split('#', 1)[0] + url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) + + self.info("Doing hg clone from %s to %s", url, filename) + os.system("hg clone --quiet %s %s" % (url, filename)) + + if rev is not None: + self.info("Updating to %s", rev) + os.system("hg --cwd %s up -C -r %s -q" % ( + filename, + rev, + )) + + return filename + + def debug(self, msg, *args): + log.debug(msg, *args) + + def info(self, msg, *args): + log.info(msg, *args) + + def warn(self, msg, *args): + log.warn(msg, *args) + + +# This pattern matches a character entity reference (a decimal numeric +# references, a hexadecimal numeric reference, or a named reference). +entity_sub = re.compile(r'&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?').sub + + +def decode_entity(match): + what = match.group(0) + return unescape(what) + + +def htmldecode(text): + """ + Decode HTML entities in the given text. + + >>> htmldecode( + ... 'https://../package_name-0.1.2.tar.gz' + ... '?tokena=A&tokenb=B">package_name-0.1.2.tar.gz') + 'https://../package_name-0.1.2.tar.gz?tokena=A&tokenb=B">package_name-0.1.2.tar.gz' + """ + return entity_sub(decode_entity, text) + + +def socket_timeout(timeout=15): + def _socket_timeout(func): + def _socket_timeout(*args, **kwargs): + old_timeout = socket.getdefaulttimeout() + socket.setdefaulttimeout(timeout) + try: + return func(*args, **kwargs) + finally: + socket.setdefaulttimeout(old_timeout) + + return _socket_timeout + + return _socket_timeout + + +def _encode_auth(auth): + """ + A function compatible with Python 2.3-3.3 that will encode + auth from a URL suitable for an HTTP header. + >>> str(_encode_auth('username%3Apassword')) + 'dXNlcm5hbWU6cGFzc3dvcmQ=' + + Long auth strings should not cause a newline to be inserted. + >>> long_auth = 'username:' + 'password'*10 + >>> chr(10) in str(_encode_auth(long_auth)) + False + """ + auth_s = urllib.parse.unquote(auth) + # convert to bytes + auth_bytes = auth_s.encode() + encoded_bytes = base64.b64encode(auth_bytes) + # convert back to a string + encoded = encoded_bytes.decode() + # strip the trailing carriage return + return encoded.replace('\n', '') + + +class Credential: + """ + A username/password pair. Use like a namedtuple. + """ + + def __init__(self, username, password): + self.username = username + self.password = password + + def __iter__(self): + yield self.username + yield self.password + + def __str__(self): + return '%(username)s:%(password)s' % vars(self) + + +class PyPIConfig(configparser.RawConfigParser): + def __init__(self): + """ + Load from ~/.pypirc + """ + defaults = dict.fromkeys(['username', 'password', 'repository'], '') + configparser.RawConfigParser.__init__(self, defaults) + + rc = os.path.join(os.path.expanduser('~'), '.pypirc') + if os.path.exists(rc): + self.read(rc) + + @property + def creds_by_repository(self): + sections_with_repositories = [ + section for section in self.sections() + if self.get(section, 'repository').strip() + ] + + return dict(map(self._get_repo_cred, sections_with_repositories)) + + def _get_repo_cred(self, section): + repo = self.get(section, 'repository').strip() + return repo, Credential( + self.get(section, 'username').strip(), + self.get(section, 'password').strip(), + ) + + def find_credential(self, url): + """ + If the URL indicated appears to be a repository defined in this + config, return the credential for that repository. + """ + for repository, cred in self.creds_by_repository.items(): + if url.startswith(repository): + return cred + + +def open_with_auth(url, opener=urllib.request.urlopen): + """Open a urllib2 request, handling HTTP authentication""" + + parsed = urllib.parse.urlparse(url) + scheme, netloc, path, params, query, frag = parsed + + # Double scheme does not raise on Mac OS X as revealed by a + # failing test. We would expect "nonnumeric port". Refs #20. + if netloc.endswith(':'): + raise http_client.InvalidURL("nonnumeric port: ''") + + if scheme in ('http', 'https'): + auth, address = _splituser(netloc) + else: + auth = None + + if not auth: + cred = PyPIConfig().find_credential(url) + if cred: + auth = str(cred) + info = cred.username, url + log.info('Authenticating as %s for %s (from .pypirc)', *info) + + if auth: + auth = "Basic " + _encode_auth(auth) + parts = scheme, address, path, params, query, frag + new_url = urllib.parse.urlunparse(parts) + request = urllib.request.Request(new_url) + request.add_header("Authorization", auth) + else: + request = urllib.request.Request(url) + + request.add_header('User-Agent', user_agent) + fp = opener(request) + + if auth: + # Put authentication info back into request URL if same host, + # so that links found on the page will work + s2, h2, path2, param2, query2, frag2 = urllib.parse.urlparse(fp.url) + if s2 == scheme and h2 == address: + parts = s2, netloc, path2, param2, query2, frag2 + fp.url = urllib.parse.urlunparse(parts) + + return fp + + +# copy of urllib.parse._splituser from Python 3.8 +def _splituser(host): + """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" + user, delim, host = host.rpartition('@') + return (user if delim else None), host + + +# adding a timeout to avoid freezing package_index +open_with_auth = socket_timeout(_SOCKET_TIMEOUT)(open_with_auth) + + +def fix_sf_url(url): + return url # backward compatibility + + +def local_open(url): + """Read a local path, with special support for directories""" + scheme, server, path, param, query, frag = urllib.parse.urlparse(url) + filename = urllib.request.url2pathname(path) + if os.path.isfile(filename): + return urllib.request.urlopen(url) + elif path.endswith('/') and os.path.isdir(filename): + files = [] + for f in os.listdir(filename): + filepath = os.path.join(filename, f) + if f == 'index.html': + with open(filepath, 'r') as fp: + body = fp.read() + break + elif os.path.isdir(filepath): + f += '/' + files.append('<a href="{name}">{name}</a>'.format(name=f)) + else: + tmpl = ( + "<html><head><title>{url}" + "{files}") + body = tmpl.format(url=url, files='\n'.join(files)) + status, message = 200, "OK" + else: + status, message, body = 404, "Path not found", "Not found" + + headers = {'content-type': 'text/html'} + body_stream = six.StringIO(body) + return urllib.error.HTTPError(url, status, message, headers, body_stream) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/pep425tags.py b/mongo_mac/lib/python3.6/site-packages/setuptools/pep425tags.py new file mode 100644 index 0000000..48745a2 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/pep425tags.py @@ -0,0 +1,319 @@ +# This file originally from pip: +# https://github.com/pypa/pip/blob/8f4f15a5a95d7d5b511ceaee9ed261176c181970/src/pip/_internal/pep425tags.py +"""Generate and work with PEP 425 Compatibility Tags.""" +from __future__ import absolute_import + +import distutils.util +from distutils import log +import platform +import re +import sys +import sysconfig +import warnings +from collections import OrderedDict + +from .extern import six + +from . import glibc + +_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') + + +def get_config_var(var): + try: + return sysconfig.get_config_var(var) + except IOError as e: # Issue #1074 + warnings.warn("{}".format(e), RuntimeWarning) + return None + + +def get_abbr_impl(): + """Return abbreviated implementation name.""" + if hasattr(sys, 'pypy_version_info'): + pyimpl = 'pp' + elif sys.platform.startswith('java'): + pyimpl = 'jy' + elif sys.platform == 'cli': + pyimpl = 'ip' + else: + pyimpl = 'cp' + return pyimpl + + +def get_impl_ver(): + """Return implementation version.""" + impl_ver = get_config_var("py_version_nodot") + if not impl_ver or get_abbr_impl() == 'pp': + impl_ver = ''.join(map(str, get_impl_version_info())) + return impl_ver + + +def get_impl_version_info(): + """Return sys.version_info-like tuple for use in decrementing the minor + version.""" + if get_abbr_impl() == 'pp': + # as per https://github.com/pypa/pip/issues/2882 + return (sys.version_info[0], sys.pypy_version_info.major, + sys.pypy_version_info.minor) + else: + return sys.version_info[0], sys.version_info[1] + + +def get_impl_tag(): + """ + Returns the Tag for this specific implementation. + """ + return "{}{}".format(get_abbr_impl(), get_impl_ver()) + + +def get_flag(var, fallback, expected=True, warn=True): + """Use a fallback method for determining SOABI flags if the needed config + var is unset or unavailable.""" + val = get_config_var(var) + if val is None: + if warn: + log.debug("Config variable '%s' is unset, Python ABI tag may " + "be incorrect", var) + return fallback() + return val == expected + + +def get_abi_tag(): + """Return the ABI tag based on SOABI (if available) or emulate SOABI + (CPython 2, PyPy).""" + soabi = get_config_var('SOABI') + impl = get_abbr_impl() + if not soabi and impl in {'cp', 'pp'} and hasattr(sys, 'maxunicode'): + d = '' + m = '' + u = '' + if get_flag('Py_DEBUG', + lambda: hasattr(sys, 'gettotalrefcount'), + warn=(impl == 'cp')): + d = 'd' + if get_flag('WITH_PYMALLOC', + lambda: impl == 'cp', + warn=(impl == 'cp')): + m = 'm' + if get_flag('Py_UNICODE_SIZE', + lambda: sys.maxunicode == 0x10ffff, + expected=4, + warn=(impl == 'cp' and + six.PY2)) \ + and six.PY2: + u = 'u' + abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) + elif soabi and soabi.startswith('cpython-'): + abi = 'cp' + soabi.split('-')[1] + elif soabi: + abi = soabi.replace('.', '_').replace('-', '_') + else: + abi = None + return abi + + +def _is_running_32bit(): + return sys.maxsize == 2147483647 + + +def get_platform(): + """Return our platform name 'win32', 'linux_x86_64'""" + if sys.platform == 'darwin': + # distutils.util.get_platform() returns the release based on the value + # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may + # be significantly older than the user's current machine. + release, _, machine = platform.mac_ver() + split_ver = release.split('.') + + if machine == "x86_64" and _is_running_32bit(): + machine = "i386" + elif machine == "ppc64" and _is_running_32bit(): + machine = "ppc" + + return 'macosx_{}_{}_{}'.format(split_ver[0], split_ver[1], machine) + + # XXX remove distutils dependency + result = distutils.util.get_platform().replace('.', '_').replace('-', '_') + if result == "linux_x86_64" and _is_running_32bit(): + # 32 bit Python program (running on a 64 bit Linux): pip should only + # install and run 32 bit compiled extensions in that case. + result = "linux_i686" + + return result + + +def is_manylinux1_compatible(): + # Only Linux, and only x86-64 / i686 + if get_platform() not in {"linux_x86_64", "linux_i686"}: + return False + + # Check for presence of _manylinux module + try: + import _manylinux + return bool(_manylinux.manylinux1_compatible) + except (ImportError, AttributeError): + # Fall through to heuristic check below + pass + + # Check glibc version. CentOS 5 uses glibc 2.5. + return glibc.have_compatible_glibc(2, 5) + + +def get_darwin_arches(major, minor, machine): + """Return a list of supported arches (including group arches) for + the given major, minor and machine architecture of a macOS machine. + """ + arches = [] + + def _supports_arch(major, minor, arch): + # Looking at the application support for macOS versions in the chart + # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears + # our timeline looks roughly like: + # + # 10.0 - Introduces ppc support. + # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64 + # and x86_64 support is CLI only, and cannot be used for GUI + # applications. + # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications. + # 10.6 - Drops support for ppc64 + # 10.7 - Drops support for ppc + # + # Given that we do not know if we're installing a CLI or a GUI + # application, we must be conservative and assume it might be a GUI + # application and behave as if ppc64 and x86_64 support did not occur + # until 10.5. + # + # Note: The above information is taken from the "Application support" + # column in the chart not the "Processor support" since I believe + # that we care about what instruction sets an application can use + # not which processors the OS supports. + if arch == 'ppc': + return (major, minor) <= (10, 5) + if arch == 'ppc64': + return (major, minor) == (10, 5) + if arch == 'i386': + return (major, minor) >= (10, 4) + if arch == 'x86_64': + return (major, minor) >= (10, 5) + if arch in groups: + for garch in groups[arch]: + if _supports_arch(major, minor, garch): + return True + return False + + groups = OrderedDict([ + ("fat", ("i386", "ppc")), + ("intel", ("x86_64", "i386")), + ("fat64", ("x86_64", "ppc64")), + ("fat32", ("x86_64", "i386", "ppc")), + ]) + + if _supports_arch(major, minor, machine): + arches.append(machine) + + for garch in groups: + if machine in groups[garch] and _supports_arch(major, minor, garch): + arches.append(garch) + + arches.append('universal') + + return arches + + +def get_supported(versions=None, noarch=False, platform=None, + impl=None, abi=None): + """Return a list of supported tags for each version specified in + `versions`. + + :param versions: a list of string versions, of the form ["33", "32"], + or None. The first version will be assumed to support our ABI. + :param platform: specify the exact platform you want valid + tags for, or None. If None, use the local system platform. + :param impl: specify the exact implementation you want valid + tags for, or None. If None, use the local interpreter impl. + :param abi: specify the exact abi you want valid + tags for, or None. If None, use the local interpreter abi. + """ + supported = [] + + # Versions must be given with respect to the preference + if versions is None: + versions = [] + version_info = get_impl_version_info() + major = version_info[:-1] + # Support all previous minor Python versions. + for minor in range(version_info[-1], -1, -1): + versions.append(''.join(map(str, major + (minor,)))) + + impl = impl or get_abbr_impl() + + abis = [] + + abi = abi or get_abi_tag() + if abi: + abis[0:0] = [abi] + + abi3s = set() + import imp + for suffix in imp.get_suffixes(): + if suffix[0].startswith('.abi'): + abi3s.add(suffix[0].split('.', 2)[1]) + + abis.extend(sorted(list(abi3s))) + + abis.append('none') + + if not noarch: + arch = platform or get_platform() + if arch.startswith('macosx'): + # support macosx-10.6-intel on macosx-10.9-x86_64 + match = _osx_arch_pat.match(arch) + if match: + name, major, minor, actual_arch = match.groups() + tpl = '{}_{}_%i_%s'.format(name, major) + arches = [] + for m in reversed(range(int(minor) + 1)): + for a in get_darwin_arches(int(major), m, actual_arch): + arches.append(tpl % (m, a)) + else: + # arch pattern didn't match (?!) + arches = [arch] + elif platform is None and is_manylinux1_compatible(): + arches = [arch.replace('linux', 'manylinux1'), arch] + else: + arches = [arch] + + # Current version, current API (built specifically for our Python): + for abi in abis: + for arch in arches: + supported.append(('%s%s' % (impl, versions[0]), abi, arch)) + + # abi3 modules compatible with older version of Python + for version in versions[1:]: + # abi3 was introduced in Python 3.2 + if version in {'31', '30'}: + break + for abi in abi3s: # empty set if not Python 3 + for arch in arches: + supported.append(("%s%s" % (impl, version), abi, arch)) + + # Has binaries, does not use the Python API: + for arch in arches: + supported.append(('py%s' % (versions[0][0]), 'none', arch)) + + # No abi / arch, but requires our implementation: + supported.append(('%s%s' % (impl, versions[0]), 'none', 'any')) + # Tagged specifically as being cross-version compatible + # (with just the major version specified) + supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) + + # No abi / arch, generic Python + for i, version in enumerate(versions): + supported.append(('py%s' % (version,), 'none', 'any')) + if i == 0: + supported.append(('py%s' % (version[0]), 'none', 'any')) + + return supported + + +implementation_tag = get_impl_tag() diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/py27compat.py b/mongo_mac/lib/python3.6/site-packages/setuptools/py27compat.py new file mode 100644 index 0000000..2985011 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/py27compat.py @@ -0,0 +1,28 @@ +""" +Compatibility Support for Python 2.7 and earlier +""" + +import platform + +from setuptools.extern import six + + +def get_all_headers(message, key): + """ + Given an HTTPMessage, return all headers matching a given key. + """ + return message.get_all(key) + + +if six.PY2: + def get_all_headers(message, key): + return message.getheaders(key) + + +linux_py2_ascii = ( + platform.system() == 'Linux' and + six.PY2 +) + +rmtree_safe = str if linux_py2_ascii else lambda x: x +"""Workaround for http://bugs.python.org/issue24672""" diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/py31compat.py b/mongo_mac/lib/python3.6/site-packages/setuptools/py31compat.py new file mode 100644 index 0000000..e1da7ee --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/py31compat.py @@ -0,0 +1,32 @@ +__all__ = [] + +__metaclass__ = type + + +try: + # Python >=3.2 + from tempfile import TemporaryDirectory +except ImportError: + import shutil + import tempfile + + class TemporaryDirectory: + """ + Very simple temporary directory context manager. + Will try to delete afterward, but will also ignore OS and similar + errors on deletion. + """ + + def __init__(self, **kwargs): + self.name = None # Handle mkdtemp raising an exception + self.name = tempfile.mkdtemp(**kwargs) + + def __enter__(self): + return self.name + + def __exit__(self, exctype, excvalue, exctrace): + try: + shutil.rmtree(self.name, True) + except OSError: # removal errors are not the only possible + pass + self.name = None diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/py33compat.py b/mongo_mac/lib/python3.6/site-packages/setuptools/py33compat.py new file mode 100644 index 0000000..87cf539 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/py33compat.py @@ -0,0 +1,55 @@ +import dis +import array +import collections + +try: + import html +except ImportError: + html = None + +from setuptools.extern import six +from setuptools.extern.six.moves import html_parser + +__metaclass__ = type + +OpArg = collections.namedtuple('OpArg', 'opcode arg') + + +class Bytecode_compat: + def __init__(self, code): + self.code = code + + def __iter__(self): + """Yield '(op,arg)' pair for each operation in code object 'code'""" + + bytes = array.array('b', self.code.co_code) + eof = len(self.code.co_code) + + ptr = 0 + extended_arg = 0 + + while ptr < eof: + + op = bytes[ptr] + + if op >= dis.HAVE_ARGUMENT: + + arg = bytes[ptr + 1] + bytes[ptr + 2] * 256 + extended_arg + ptr += 3 + + if op == dis.EXTENDED_ARG: + long_type = six.integer_types[-1] + extended_arg = arg * long_type(65536) + continue + + else: + arg = None + ptr += 1 + + yield OpArg(op, arg) + + +Bytecode = getattr(dis, 'Bytecode', Bytecode_compat) + + +unescape = getattr(html, 'unescape', html_parser.HTMLParser().unescape) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/sandbox.py b/mongo_mac/lib/python3.6/site-packages/setuptools/sandbox.py new file mode 100644 index 0000000..685f3f7 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/sandbox.py @@ -0,0 +1,491 @@ +import os +import sys +import tempfile +import operator +import functools +import itertools +import re +import contextlib +import pickle +import textwrap + +from setuptools.extern import six +from setuptools.extern.six.moves import builtins, map + +import pkg_resources.py31compat + +if sys.platform.startswith('java'): + import org.python.modules.posix.PosixModule as _os +else: + _os = sys.modules[os.name] +try: + _file = file +except NameError: + _file = None +_open = open +from distutils.errors import DistutilsError +from pkg_resources import working_set + + +__all__ = [ + "AbstractSandbox", "DirectorySandbox", "SandboxViolation", "run_setup", +] + + +def _execfile(filename, globals, locals=None): + """ + Python 3 implementation of execfile. + """ + mode = 'rb' + with open(filename, mode) as stream: + script = stream.read() + if locals is None: + locals = globals + code = compile(script, filename, 'exec') + exec(code, globals, locals) + + +@contextlib.contextmanager +def save_argv(repl=None): + saved = sys.argv[:] + if repl is not None: + sys.argv[:] = repl + try: + yield saved + finally: + sys.argv[:] = saved + + +@contextlib.contextmanager +def save_path(): + saved = sys.path[:] + try: + yield saved + finally: + sys.path[:] = saved + + +@contextlib.contextmanager +def override_temp(replacement): + """ + Monkey-patch tempfile.tempdir with replacement, ensuring it exists + """ + pkg_resources.py31compat.makedirs(replacement, exist_ok=True) + + saved = tempfile.tempdir + + tempfile.tempdir = replacement + + try: + yield + finally: + tempfile.tempdir = saved + + +@contextlib.contextmanager +def pushd(target): + saved = os.getcwd() + os.chdir(target) + try: + yield saved + finally: + os.chdir(saved) + + +class UnpickleableException(Exception): + """ + An exception representing another Exception that could not be pickled. + """ + + @staticmethod + def dump(type, exc): + """ + Always return a dumped (pickled) type and exc. If exc can't be pickled, + wrap it in UnpickleableException first. + """ + try: + return pickle.dumps(type), pickle.dumps(exc) + except Exception: + # get UnpickleableException inside the sandbox + from setuptools.sandbox import UnpickleableException as cls + return cls.dump(cls, cls(repr(exc))) + + +class ExceptionSaver: + """ + A Context Manager that will save an exception, serialized, and restore it + later. + """ + + def __enter__(self): + return self + + def __exit__(self, type, exc, tb): + if not exc: + return + + # dump the exception + self._saved = UnpickleableException.dump(type, exc) + self._tb = tb + + # suppress the exception + return True + + def resume(self): + "restore and re-raise any exception" + + if '_saved' not in vars(self): + return + + type, exc = map(pickle.loads, self._saved) + six.reraise(type, exc, self._tb) + + +@contextlib.contextmanager +def save_modules(): + """ + Context in which imported modules are saved. + + Translates exceptions internal to the context into the equivalent exception + outside the context. + """ + saved = sys.modules.copy() + with ExceptionSaver() as saved_exc: + yield saved + + sys.modules.update(saved) + # remove any modules imported since + del_modules = ( + mod_name for mod_name in sys.modules + if mod_name not in saved + # exclude any encodings modules. See #285 + and not mod_name.startswith('encodings.') + ) + _clear_modules(del_modules) + + saved_exc.resume() + + +def _clear_modules(module_names): + for mod_name in list(module_names): + del sys.modules[mod_name] + + +@contextlib.contextmanager +def save_pkg_resources_state(): + saved = pkg_resources.__getstate__() + try: + yield saved + finally: + pkg_resources.__setstate__(saved) + + +@contextlib.contextmanager +def setup_context(setup_dir): + temp_dir = os.path.join(setup_dir, 'temp') + with save_pkg_resources_state(): + with save_modules(): + hide_setuptools() + with save_path(): + with save_argv(): + with override_temp(temp_dir): + with pushd(setup_dir): + # ensure setuptools commands are available + __import__('setuptools') + yield + + +def _needs_hiding(mod_name): + """ + >>> _needs_hiding('setuptools') + True + >>> _needs_hiding('pkg_resources') + True + >>> _needs_hiding('setuptools_plugin') + False + >>> _needs_hiding('setuptools.__init__') + True + >>> _needs_hiding('distutils') + True + >>> _needs_hiding('os') + False + >>> _needs_hiding('Cython') + True + """ + pattern = re.compile(r'(setuptools|pkg_resources|distutils|Cython)(\.|$)') + return bool(pattern.match(mod_name)) + + +def hide_setuptools(): + """ + Remove references to setuptools' modules from sys.modules to allow the + invocation to import the most appropriate setuptools. This technique is + necessary to avoid issues such as #315 where setuptools upgrading itself + would fail to find a function declared in the metadata. + """ + modules = filter(_needs_hiding, sys.modules) + _clear_modules(modules) + + +def run_setup(setup_script, args): + """Run a distutils setup script, sandboxed in its directory""" + setup_dir = os.path.abspath(os.path.dirname(setup_script)) + with setup_context(setup_dir): + try: + sys.argv[:] = [setup_script] + list(args) + sys.path.insert(0, setup_dir) + # reset to include setup dir, w/clean callback list + working_set.__init__() + working_set.callbacks.append(lambda dist: dist.activate()) + + # __file__ should be a byte string on Python 2 (#712) + dunder_file = ( + setup_script + if isinstance(setup_script, str) else + setup_script.encode(sys.getfilesystemencoding()) + ) + + with DirectorySandbox(setup_dir): + ns = dict(__file__=dunder_file, __name__='__main__') + _execfile(setup_script, ns) + except SystemExit as v: + if v.args and v.args[0]: + raise + # Normal exit, just return + + +class AbstractSandbox: + """Wrap 'os' module and 'open()' builtin for virtualizing setup scripts""" + + _active = False + + def __init__(self): + self._attrs = [ + name for name in dir(_os) + if not name.startswith('_') and hasattr(self, name) + ] + + def _copy(self, source): + for name in self._attrs: + setattr(os, name, getattr(source, name)) + + def __enter__(self): + self._copy(self) + if _file: + builtins.file = self._file + builtins.open = self._open + self._active = True + + def __exit__(self, exc_type, exc_value, traceback): + self._active = False + if _file: + builtins.file = _file + builtins.open = _open + self._copy(_os) + + def run(self, func): + """Run 'func' under os sandboxing""" + with self: + return func() + + def _mk_dual_path_wrapper(name): + original = getattr(_os, name) + + def wrap(self, src, dst, *args, **kw): + if self._active: + src, dst = self._remap_pair(name, src, dst, *args, **kw) + return original(src, dst, *args, **kw) + + return wrap + + for name in ["rename", "link", "symlink"]: + if hasattr(_os, name): + locals()[name] = _mk_dual_path_wrapper(name) + + def _mk_single_path_wrapper(name, original=None): + original = original or getattr(_os, name) + + def wrap(self, path, *args, **kw): + if self._active: + path = self._remap_input(name, path, *args, **kw) + return original(path, *args, **kw) + + return wrap + + if _file: + _file = _mk_single_path_wrapper('file', _file) + _open = _mk_single_path_wrapper('open', _open) + for name in [ + "stat", "listdir", "chdir", "open", "chmod", "chown", "mkdir", + "remove", "unlink", "rmdir", "utime", "lchown", "chroot", "lstat", + "startfile", "mkfifo", "mknod", "pathconf", "access" + ]: + if hasattr(_os, name): + locals()[name] = _mk_single_path_wrapper(name) + + def _mk_single_with_return(name): + original = getattr(_os, name) + + def wrap(self, path, *args, **kw): + if self._active: + path = self._remap_input(name, path, *args, **kw) + return self._remap_output(name, original(path, *args, **kw)) + return original(path, *args, **kw) + + return wrap + + for name in ['readlink', 'tempnam']: + if hasattr(_os, name): + locals()[name] = _mk_single_with_return(name) + + def _mk_query(name): + original = getattr(_os, name) + + def wrap(self, *args, **kw): + retval = original(*args, **kw) + if self._active: + return self._remap_output(name, retval) + return retval + + return wrap + + for name in ['getcwd', 'tmpnam']: + if hasattr(_os, name): + locals()[name] = _mk_query(name) + + def _validate_path(self, path): + """Called to remap or validate any path, whether input or output""" + return path + + def _remap_input(self, operation, path, *args, **kw): + """Called for path inputs""" + return self._validate_path(path) + + def _remap_output(self, operation, path): + """Called for path outputs""" + return self._validate_path(path) + + def _remap_pair(self, operation, src, dst, *args, **kw): + """Called for path pairs like rename, link, and symlink operations""" + return ( + self._remap_input(operation + '-from', src, *args, **kw), + self._remap_input(operation + '-to', dst, *args, **kw) + ) + + +if hasattr(os, 'devnull'): + _EXCEPTIONS = [os.devnull,] +else: + _EXCEPTIONS = [] + + +class DirectorySandbox(AbstractSandbox): + """Restrict operations to a single subdirectory - pseudo-chroot""" + + write_ops = dict.fromkeys([ + "open", "chmod", "chown", "mkdir", "remove", "unlink", "rmdir", + "utime", "lchown", "chroot", "mkfifo", "mknod", "tempnam", + ]) + + _exception_patterns = [ + # Allow lib2to3 to attempt to save a pickled grammar object (#121) + r'.*lib2to3.*\.pickle$', + ] + "exempt writing to paths that match the pattern" + + def __init__(self, sandbox, exceptions=_EXCEPTIONS): + self._sandbox = os.path.normcase(os.path.realpath(sandbox)) + self._prefix = os.path.join(self._sandbox, '') + self._exceptions = [ + os.path.normcase(os.path.realpath(path)) + for path in exceptions + ] + AbstractSandbox.__init__(self) + + def _violation(self, operation, *args, **kw): + from setuptools.sandbox import SandboxViolation + raise SandboxViolation(operation, args, kw) + + if _file: + + def _file(self, path, mode='r', *args, **kw): + if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): + self._violation("file", path, mode, *args, **kw) + return _file(path, mode, *args, **kw) + + def _open(self, path, mode='r', *args, **kw): + if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): + self._violation("open", path, mode, *args, **kw) + return _open(path, mode, *args, **kw) + + def tmpnam(self): + self._violation("tmpnam") + + def _ok(self, path): + active = self._active + try: + self._active = False + realpath = os.path.normcase(os.path.realpath(path)) + return ( + self._exempted(realpath) + or realpath == self._sandbox + or realpath.startswith(self._prefix) + ) + finally: + self._active = active + + def _exempted(self, filepath): + start_matches = ( + filepath.startswith(exception) + for exception in self._exceptions + ) + pattern_matches = ( + re.match(pattern, filepath) + for pattern in self._exception_patterns + ) + candidates = itertools.chain(start_matches, pattern_matches) + return any(candidates) + + def _remap_input(self, operation, path, *args, **kw): + """Called for path inputs""" + if operation in self.write_ops and not self._ok(path): + self._violation(operation, os.path.realpath(path), *args, **kw) + return path + + def _remap_pair(self, operation, src, dst, *args, **kw): + """Called for path pairs like rename, link, and symlink operations""" + if not self._ok(src) or not self._ok(dst): + self._violation(operation, src, dst, *args, **kw) + return (src, dst) + + def open(self, file, flags, mode=0o777, *args, **kw): + """Called for low-level os.open()""" + if flags & WRITE_FLAGS and not self._ok(file): + self._violation("os.open", file, flags, mode, *args, **kw) + return _os.open(file, flags, mode, *args, **kw) + + +WRITE_FLAGS = functools.reduce( + operator.or_, [getattr(_os, a, 0) for a in + "O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARY".split()] +) + + +class SandboxViolation(DistutilsError): + """A setup script attempted to modify the filesystem outside the sandbox""" + + tmpl = textwrap.dedent(""" + SandboxViolation: {cmd}{args!r} {kwargs} + + The package setup script has attempted to modify files on your system + that are not within the EasyInstall build area, and has been aborted. + + This package cannot be safely installed by EasyInstall, and may not + support alternate installation locations even if you run its setup + script by hand. Please inform the package's author and the EasyInstall + maintainers to find out if a fix or workaround is available. + """).lstrip() + + def __str__(self): + cmd, args, kwargs = self.args + return self.tmpl.format(**locals()) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/script (dev).tmpl b/mongo_mac/lib/python3.6/site-packages/setuptools/script (dev).tmpl new file mode 100644 index 0000000..39a24b0 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/script (dev).tmpl @@ -0,0 +1,6 @@ +# EASY-INSTALL-DEV-SCRIPT: %(spec)r,%(script_name)r +__requires__ = %(spec)r +__import__('pkg_resources').require(%(spec)r) +__file__ = %(dev_path)r +with open(__file__) as f: + exec(compile(f.read(), __file__, 'exec')) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/script.tmpl b/mongo_mac/lib/python3.6/site-packages/setuptools/script.tmpl new file mode 100644 index 0000000..ff5efbc --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/script.tmpl @@ -0,0 +1,3 @@ +# EASY-INSTALL-SCRIPT: %(spec)r,%(script_name)r +__requires__ = %(spec)r +__import__('pkg_resources').run_script(%(spec)r, %(script_name)r) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/site-patch.py b/mongo_mac/lib/python3.6/site-packages/setuptools/site-patch.py new file mode 100644 index 0000000..40b00de --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/site-patch.py @@ -0,0 +1,74 @@ +def __boot(): + import sys + import os + PYTHONPATH = os.environ.get('PYTHONPATH') + if PYTHONPATH is None or (sys.platform == 'win32' and not PYTHONPATH): + PYTHONPATH = [] + else: + PYTHONPATH = PYTHONPATH.split(os.pathsep) + + pic = getattr(sys, 'path_importer_cache', {}) + stdpath = sys.path[len(PYTHONPATH):] + mydir = os.path.dirname(__file__) + + for item in stdpath: + if item == mydir or not item: + continue # skip if current dir. on Windows, or my own directory + importer = pic.get(item) + if importer is not None: + loader = importer.find_module('site') + if loader is not None: + # This should actually reload the current module + loader.load_module('site') + break + else: + try: + import imp # Avoid import loop in Python 3 + stream, path, descr = imp.find_module('site', [item]) + except ImportError: + continue + if stream is None: + continue + try: + # This should actually reload the current module + imp.load_module('site', stream, path, descr) + finally: + stream.close() + break + else: + raise ImportError("Couldn't find the real 'site' module") + + known_paths = dict([(makepath(item)[1], 1) for item in sys.path]) # 2.2 comp + + oldpos = getattr(sys, '__egginsert', 0) # save old insertion position + sys.__egginsert = 0 # and reset the current one + + for item in PYTHONPATH: + addsitedir(item) + + sys.__egginsert += oldpos # restore effective old position + + d, nd = makepath(stdpath[0]) + insert_at = None + new_path = [] + + for item in sys.path: + p, np = makepath(item) + + if np == nd and insert_at is None: + # We've hit the first 'system' path entry, so added entries go here + insert_at = len(new_path) + + if np in known_paths or insert_at is None: + new_path.append(item) + else: + # new path after the insert point, back-insert it + new_path.insert(insert_at, item) + insert_at += 1 + + sys.path[:] = new_path + + +if __name__ == 'site': + __boot() + del __boot diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/ssl_support.py b/mongo_mac/lib/python3.6/site-packages/setuptools/ssl_support.py new file mode 100644 index 0000000..226db69 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/ssl_support.py @@ -0,0 +1,260 @@ +import os +import socket +import atexit +import re +import functools + +from setuptools.extern.six.moves import urllib, http_client, map, filter + +from pkg_resources import ResolutionError, ExtractionError + +try: + import ssl +except ImportError: + ssl = None + +__all__ = [ + 'VerifyingHTTPSHandler', 'find_ca_bundle', 'is_available', 'cert_paths', + 'opener_for' +] + +cert_paths = """ +/etc/pki/tls/certs/ca-bundle.crt +/etc/ssl/certs/ca-certificates.crt +/usr/share/ssl/certs/ca-bundle.crt +/usr/local/share/certs/ca-root.crt +/etc/ssl/cert.pem +/System/Library/OpenSSL/certs/cert.pem +/usr/local/share/certs/ca-root-nss.crt +/etc/ssl/ca-bundle.pem +""".strip().split() + +try: + HTTPSHandler = urllib.request.HTTPSHandler + HTTPSConnection = http_client.HTTPSConnection +except AttributeError: + HTTPSHandler = HTTPSConnection = object + +is_available = ssl is not None and object not in (HTTPSHandler, HTTPSConnection) + + +try: + from ssl import CertificateError, match_hostname +except ImportError: + try: + from backports.ssl_match_hostname import CertificateError + from backports.ssl_match_hostname import match_hostname + except ImportError: + CertificateError = None + match_hostname = None + +if not CertificateError: + + class CertificateError(ValueError): + pass + + +if not match_hostname: + + def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + https://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + # Ported from python3-syntax: + # leftmost, *remainder = dn.split(r'.') + parts = dn.split(r'.') + leftmost = parts[0] + remainder = parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") + + +class VerifyingHTTPSHandler(HTTPSHandler): + """Simple verifying handler: no auth, subclasses, timeouts, etc.""" + + def __init__(self, ca_bundle): + self.ca_bundle = ca_bundle + HTTPSHandler.__init__(self) + + def https_open(self, req): + return self.do_open( + lambda host, **kw: VerifyingHTTPSConn(host, self.ca_bundle, **kw), req + ) + + +class VerifyingHTTPSConn(HTTPSConnection): + """Simple verifying connection: no auth, subclasses, timeouts, etc.""" + + def __init__(self, host, ca_bundle, **kw): + HTTPSConnection.__init__(self, host, **kw) + self.ca_bundle = ca_bundle + + def connect(self): + sock = socket.create_connection( + (self.host, self.port), getattr(self, 'source_address', None) + ) + + # Handle the socket if a (proxy) tunnel is present + if hasattr(self, '_tunnel') and getattr(self, '_tunnel_host', None): + self.sock = sock + self._tunnel() + # http://bugs.python.org/issue7776: Python>=3.4.1 and >=2.7.7 + # change self.host to mean the proxy server host when tunneling is + # being used. Adapt, since we are interested in the destination + # host for the match_hostname() comparison. + actual_host = self._tunnel_host + else: + actual_host = self.host + + if hasattr(ssl, 'create_default_context'): + ctx = ssl.create_default_context(cafile=self.ca_bundle) + self.sock = ctx.wrap_socket(sock, server_hostname=actual_host) + else: + # This is for python < 2.7.9 and < 3.4? + self.sock = ssl.wrap_socket( + sock, cert_reqs=ssl.CERT_REQUIRED, ca_certs=self.ca_bundle + ) + try: + match_hostname(self.sock.getpeercert(), actual_host) + except CertificateError: + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + +def opener_for(ca_bundle=None): + """Get a urlopen() replacement that uses ca_bundle for verification""" + return urllib.request.build_opener( + VerifyingHTTPSHandler(ca_bundle or find_ca_bundle()) + ).open + + +# from jaraco.functools +def once(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + if not hasattr(func, 'always_returns'): + func.always_returns = func(*args, **kwargs) + return func.always_returns + return wrapper + + +@once +def get_win_certfile(): + try: + import wincertstore + except ImportError: + return None + + class CertFile(wincertstore.CertFile): + def __init__(self): + super(CertFile, self).__init__() + atexit.register(self.close) + + def close(self): + try: + super(CertFile, self).close() + except OSError: + pass + + _wincerts = CertFile() + _wincerts.addstore('CA') + _wincerts.addstore('ROOT') + return _wincerts.name + + +def find_ca_bundle(): + """Return an existing CA bundle path, or None""" + extant_cert_paths = filter(os.path.isfile, cert_paths) + return ( + get_win_certfile() + or next(extant_cert_paths, None) + or _certifi_where() + ) + + +def _certifi_where(): + try: + return __import__('certifi').where() + except (ImportError, ResolutionError, ExtractionError): + pass diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/unicode_utils.py b/mongo_mac/lib/python3.6/site-packages/setuptools/unicode_utils.py new file mode 100644 index 0000000..7c63efd --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/unicode_utils.py @@ -0,0 +1,44 @@ +import unicodedata +import sys + +from setuptools.extern import six + + +# HFS Plus uses decomposed UTF-8 +def decompose(path): + if isinstance(path, six.text_type): + return unicodedata.normalize('NFD', path) + try: + path = path.decode('utf-8') + path = unicodedata.normalize('NFD', path) + path = path.encode('utf-8') + except UnicodeError: + pass # Not UTF-8 + return path + + +def filesys_decode(path): + """ + Ensure that the given path is decoded, + NONE when no expected encoding works + """ + + if isinstance(path, six.text_type): + return path + + fs_enc = sys.getfilesystemencoding() or 'utf-8' + candidates = fs_enc, 'utf-8' + + for enc in candidates: + try: + return path.decode(enc) + except UnicodeDecodeError: + continue + + +def try_encode(string, enc): + "turn unicode encoding into a functional routine" + try: + return string.encode(enc) + except UnicodeEncodeError: + return None diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/version.py b/mongo_mac/lib/python3.6/site-packages/setuptools/version.py new file mode 100644 index 0000000..95e1869 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/version.py @@ -0,0 +1,6 @@ +import pkg_resources + +try: + __version__ = pkg_resources.get_distribution('setuptools').version +except Exception: + __version__ = 'unknown' diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/wheel.py b/mongo_mac/lib/python3.6/site-packages/setuptools/wheel.py new file mode 100644 index 0000000..e11f0a1 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/wheel.py @@ -0,0 +1,211 @@ +"""Wheels support.""" + +from distutils.util import get_platform +import email +import itertools +import os +import posixpath +import re +import zipfile + +import pkg_resources +import setuptools +from pkg_resources import parse_version +from setuptools.extern.packaging.utils import canonicalize_name +from setuptools.extern.six import PY3 +from setuptools import pep425tags +from setuptools.command.egg_info import write_requirements + + +__metaclass__ = type + + +WHEEL_NAME = re.compile( + r"""^(?P.+?)-(?P\d.*?) + ((-(?P\d.*?))?-(?P.+?)-(?P.+?)-(?P.+?) + )\.whl$""", + re.VERBOSE).match + +NAMESPACE_PACKAGE_INIT = '''\ +try: + __import__('pkg_resources').declare_namespace(__name__) +except ImportError: + __path__ = __import__('pkgutil').extend_path(__path__, __name__) +''' + + +def unpack(src_dir, dst_dir): + '''Move everything under `src_dir` to `dst_dir`, and delete the former.''' + for dirpath, dirnames, filenames in os.walk(src_dir): + subdir = os.path.relpath(dirpath, src_dir) + for f in filenames: + src = os.path.join(dirpath, f) + dst = os.path.join(dst_dir, subdir, f) + os.renames(src, dst) + for n, d in reversed(list(enumerate(dirnames))): + src = os.path.join(dirpath, d) + dst = os.path.join(dst_dir, subdir, d) + if not os.path.exists(dst): + # Directory does not exist in destination, + # rename it and prune it from os.walk list. + os.renames(src, dst) + del dirnames[n] + # Cleanup. + for dirpath, dirnames, filenames in os.walk(src_dir, topdown=True): + assert not filenames + os.rmdir(dirpath) + + +class Wheel: + + def __init__(self, filename): + match = WHEEL_NAME(os.path.basename(filename)) + if match is None: + raise ValueError('invalid wheel name: %r' % filename) + self.filename = filename + for k, v in match.groupdict().items(): + setattr(self, k, v) + + def tags(self): + '''List tags (py_version, abi, platform) supported by this wheel.''' + return itertools.product( + self.py_version.split('.'), + self.abi.split('.'), + self.platform.split('.'), + ) + + def is_compatible(self): + '''Is the wheel is compatible with the current platform?''' + supported_tags = pep425tags.get_supported() + return next((True for t in self.tags() if t in supported_tags), False) + + def egg_name(self): + return pkg_resources.Distribution( + project_name=self.project_name, version=self.version, + platform=(None if self.platform == 'any' else get_platform()), + ).egg_name() + '.egg' + + def get_dist_info(self, zf): + # find the correct name of the .dist-info dir in the wheel file + for member in zf.namelist(): + dirname = posixpath.dirname(member) + if (dirname.endswith('.dist-info') and + canonicalize_name(dirname).startswith( + canonicalize_name(self.project_name))): + return dirname + raise ValueError("unsupported wheel format. .dist-info not found") + + def install_as_egg(self, destination_eggdir): + '''Install wheel as an egg directory.''' + with zipfile.ZipFile(self.filename) as zf: + self._install_as_egg(destination_eggdir, zf) + + def _install_as_egg(self, destination_eggdir, zf): + dist_basename = '%s-%s' % (self.project_name, self.version) + dist_info = self.get_dist_info(zf) + dist_data = '%s.data' % dist_basename + egg_info = os.path.join(destination_eggdir, 'EGG-INFO') + + self._convert_metadata(zf, destination_eggdir, dist_info, egg_info) + self._move_data_entries(destination_eggdir, dist_data) + self._fix_namespace_packages(egg_info, destination_eggdir) + + @staticmethod + def _convert_metadata(zf, destination_eggdir, dist_info, egg_info): + def get_metadata(name): + with zf.open(posixpath.join(dist_info, name)) as fp: + value = fp.read().decode('utf-8') if PY3 else fp.read() + return email.parser.Parser().parsestr(value) + + wheel_metadata = get_metadata('WHEEL') + # Check wheel format version is supported. + wheel_version = parse_version(wheel_metadata.get('Wheel-Version')) + wheel_v1 = ( + parse_version('1.0') <= wheel_version < parse_version('2.0dev0') + ) + if not wheel_v1: + raise ValueError( + 'unsupported wheel format version: %s' % wheel_version) + # Extract to target directory. + os.mkdir(destination_eggdir) + zf.extractall(destination_eggdir) + # Convert metadata. + dist_info = os.path.join(destination_eggdir, dist_info) + dist = pkg_resources.Distribution.from_location( + destination_eggdir, dist_info, + metadata=pkg_resources.PathMetadata(destination_eggdir, dist_info), + ) + + # Note: Evaluate and strip markers now, + # as it's difficult to convert back from the syntax: + # foobar; "linux" in sys_platform and extra == 'test' + def raw_req(req): + req.marker = None + return str(req) + install_requires = list(sorted(map(raw_req, dist.requires()))) + extras_require = { + extra: sorted( + req + for req in map(raw_req, dist.requires((extra,))) + if req not in install_requires + ) + for extra in dist.extras + } + os.rename(dist_info, egg_info) + os.rename( + os.path.join(egg_info, 'METADATA'), + os.path.join(egg_info, 'PKG-INFO'), + ) + setup_dist = setuptools.Distribution( + attrs=dict( + install_requires=install_requires, + extras_require=extras_require, + ), + ) + write_requirements( + setup_dist.get_command_obj('egg_info'), + None, + os.path.join(egg_info, 'requires.txt'), + ) + + @staticmethod + def _move_data_entries(destination_eggdir, dist_data): + """Move data entries to their correct location.""" + dist_data = os.path.join(destination_eggdir, dist_data) + dist_data_scripts = os.path.join(dist_data, 'scripts') + if os.path.exists(dist_data_scripts): + egg_info_scripts = os.path.join( + destination_eggdir, 'EGG-INFO', 'scripts') + os.mkdir(egg_info_scripts) + for entry in os.listdir(dist_data_scripts): + # Remove bytecode, as it's not properly handled + # during easy_install scripts install phase. + if entry.endswith('.pyc'): + os.unlink(os.path.join(dist_data_scripts, entry)) + else: + os.rename( + os.path.join(dist_data_scripts, entry), + os.path.join(egg_info_scripts, entry), + ) + os.rmdir(dist_data_scripts) + for subdir in filter(os.path.exists, ( + os.path.join(dist_data, d) + for d in ('data', 'headers', 'purelib', 'platlib') + )): + unpack(subdir, destination_eggdir) + if os.path.exists(dist_data): + os.rmdir(dist_data) + + @staticmethod + def _fix_namespace_packages(egg_info, destination_eggdir): + namespace_packages = os.path.join( + egg_info, 'namespace_packages.txt') + if os.path.exists(namespace_packages): + with open(namespace_packages) as fp: + namespace_packages = fp.read().split() + for mod in namespace_packages: + mod_dir = os.path.join(destination_eggdir, *mod.split('.')) + mod_init = os.path.join(mod_dir, '__init__.py') + if os.path.exists(mod_dir) and not os.path.exists(mod_init): + with open(mod_init, 'w') as fp: + fp.write(NAMESPACE_PACKAGE_INIT) diff --git a/mongo_mac/lib/python3.6/site-packages/setuptools/windows_support.py b/mongo_mac/lib/python3.6/site-packages/setuptools/windows_support.py new file mode 100644 index 0000000..cb977cf --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/setuptools/windows_support.py @@ -0,0 +1,29 @@ +import platform +import ctypes + + +def windows_only(func): + if platform.system() != 'Windows': + return lambda *args, **kwargs: None + return func + + +@windows_only +def hide_file(path): + """ + Set the hidden attribute on a file or directory. + + From http://stackoverflow.com/questions/19622133/ + + `path` must be text. + """ + __import__('ctypes.wintypes') + SetFileAttributes = ctypes.windll.kernel32.SetFileAttributesW + SetFileAttributes.argtypes = ctypes.wintypes.LPWSTR, ctypes.wintypes.DWORD + SetFileAttributes.restype = ctypes.wintypes.BOOL + + FILE_ATTRIBUTE_HIDDEN = 0x02 + + ret = SetFileAttributes(path, FILE_ATTRIBUTE_HIDDEN) + if not ret: + raise ctypes.WinError() diff --git a/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/INSTALLER b/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/LICENSE.txt b/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..c3441e6 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/LICENSE.txt @@ -0,0 +1,22 @@ +"wheel" copyright (c) 2012-2014 Daniel Holth and +contributors. + +The MIT License + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/METADATA b/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/METADATA new file mode 100644 index 0000000..2354dd4 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/METADATA @@ -0,0 +1,60 @@ +Metadata-Version: 2.1 +Name: wheel +Version: 0.33.1 +Summary: A built-package format for Python. +Home-page: https://github.com/pypa/wheel +Author: Daniel Holth +Author-email: dholth@fastmail.fm +Maintainer: Alex Grönholm +Maintainer-email: alex.gronholm@nextday.fi +License: MIT +Project-URL: Issue Tracker, https://github.com/pypa/wheel/issues +Project-URL: Documentation, https://wheel.readthedocs.io/ +Project-URL: Changelog, https://wheel.readthedocs.io/en/stable/news.html +Keywords: wheel,packaging +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Topic :: System :: Archiving :: Packaging +Classifier: License :: OSI Approved :: MIT License +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 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Provides-Extra: test +Requires-Dist: pytest (>=3.0.0) ; extra == 'test' +Requires-Dist: pytest-cov ; extra == 'test' + +wheel +===== + +This library is the reference implementation of the Python wheel packaging +standard, as defined in `PEP 427`_. + +It has two different roles: + +#. A setuptools_ extension for building wheels that provides the + ``bdist_wheel`` setuptools command +#. A command line tool for working with wheel files + +It should be noted that wheel is **not** intended to be used as a library, and +as such there is no stable, public API. + +.. _PEP 427: https://www.python.org/dev/peps/pep-0427/ +.. _setuptools: https://pypi.org/project/setuptools/ + + +Code of Conduct +--------------- + +Everyone interacting in the wheel project's codebases, issue trackers, chat +rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_. + +.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + + diff --git a/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/RECORD b/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/RECORD new file mode 100644 index 0000000..03190b1 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/RECORD @@ -0,0 +1,32 @@ +wheel/__init__.py,sha256=OyOAcqlvJaBEASYRGijJyAkY_HL_5HR3alvjO5BEwKg,96 +wheel/__main__.py,sha256=lF-YLO4hdQmoWuh4eWZd8YL1U95RSdm76sNLBXa0vjE,417 +wheel/bdist_wheel.py,sha256=x2beC81u8AzTNVLwD36EPkVX5AxAYs2q70N09BxvMN0,14756 +wheel/metadata.py,sha256=uBv2aOz4U2sERF834C8DeNo235drcsp3ypTzT7MTWEA,4699 +wheel/pep425tags.py,sha256=Jdjbnq17kqwPRKJCMb2E1VccNgnC3H6iQL7VGaxkPao,5908 +wheel/pkginfo.py,sha256=GR76kupQzn1x9sKDaXuE6B6FsZ4OkfRtG7pndlXPvQ4,1257 +wheel/util.py,sha256=zwVIk-9qWVQLRMgkgQTMp4TRE4HY03-tCUxLrtCpsfU,924 +wheel/wheelfile.py,sha256=U_13q1XpVt02704XXkFRzmUbz_0R9-GgNxMOZFP3tOs,7168 +wheel/cli/__init__.py,sha256=GWSoGUpRabTf8bk3FsNTPrc5Fsr8YOv2dX55iY2W7eY,2572 +wheel/cli/convert.py,sha256=me0l6G4gSw-EBVhzjSr7yWYWBp9spMz7mnXlyJTiXso,9497 +wheel/cli/pack.py,sha256=vkvZc4-rRZyWiwc6sHjpqIjzwDRMEF5u3JUNU9NY_jA,2263 +wheel/cli/unpack.py,sha256=0VWzT7U_xyenTPwEVavxqvdee93GPvAFHnR3Uu91aRc,673 +wheel-0.33.1.dist-info/LICENSE.txt,sha256=zKniDGrx_Pv2lAjzd3aShsvuvN7TNhAMm0o_NfvmNeQ,1125 +wheel-0.33.1.dist-info/METADATA,sha256=ZKo4q8P_vXXg-OGjDZGlaIf4gafusgkeCd6jDxbrJLA,2082 +wheel-0.33.1.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 +wheel-0.33.1.dist-info/entry_points.txt,sha256=N8HbYFST3yrNQYeB2wXWBEPUhFsEtKNRPaCFGJPyqyc,108 +wheel-0.33.1.dist-info/top_level.txt,sha256=HxSBIbgEstMPe4eFawhA66Mq-QYHMopXVoAncfjb_1c,6 +wheel-0.33.1.dist-info/RECORD,, +../../../bin/wheel,sha256=wD78P3Wvii2rRkEAHFY8u_KUdswpCcQsNkp8ZowzWVk,257 +wheel-0.33.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +wheel/__pycache__/util.cpython-36.pyc,, +wheel/__pycache__/wheelfile.cpython-36.pyc,, +wheel/__pycache__/bdist_wheel.cpython-36.pyc,, +wheel/__pycache__/__main__.cpython-36.pyc,, +wheel/__pycache__/pep425tags.cpython-36.pyc,, +wheel/__pycache__/pkginfo.cpython-36.pyc,, +wheel/__pycache__/metadata.cpython-36.pyc,, +wheel/__pycache__/__init__.cpython-36.pyc,, +wheel/cli/__pycache__/convert.cpython-36.pyc,, +wheel/cli/__pycache__/pack.cpython-36.pyc,, +wheel/cli/__pycache__/unpack.cpython-36.pyc,, +wheel/cli/__pycache__/__init__.cpython-36.pyc,, diff --git a/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/WHEEL b/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/WHEEL new file mode 100644 index 0000000..c8240f0 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/entry_points.txt b/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/entry_points.txt new file mode 100644 index 0000000..b27acad --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/entry_points.txt @@ -0,0 +1,6 @@ +[console_scripts] +wheel = wheel.cli:main + +[distutils.commands] +bdist_wheel = wheel.bdist_wheel:bdist_wheel + diff --git a/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/top_level.txt b/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/top_level.txt new file mode 100644 index 0000000..2309722 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/wheel-0.33.1.dist-info/top_level.txt @@ -0,0 +1 @@ +wheel diff --git a/mongo_mac/lib/python3.6/site-packages/wheel/__init__.py b/mongo_mac/lib/python3.6/site-packages/wheel/__init__.py new file mode 100644 index 0000000..745cefc --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/wheel/__init__.py @@ -0,0 +1,2 @@ +# __variables__ with double-quoted values will be available in setup.py: +__version__ = "0.33.1" diff --git a/mongo_mac/lib/python3.6/site-packages/wheel/__main__.py b/mongo_mac/lib/python3.6/site-packages/wheel/__main__.py new file mode 100644 index 0000000..b3773a2 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/wheel/__main__.py @@ -0,0 +1,19 @@ +""" +Wheel command line tool (enable python -m wheel syntax) +""" + +import sys + + +def main(): # needed for console script + if __package__ == '': + # To be able to run 'python wheel-0.9.whl/wheel': + import os.path + path = os.path.dirname(os.path.dirname(__file__)) + sys.path[0:0] = [path] + import wheel.cli + sys.exit(wheel.cli.main()) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/mongo_mac/lib/python3.6/site-packages/wheel/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/wheel/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc2a3a8f5d1c8bb08b9bab5931fb5d63bf66d8f6 GIT binary patch literal 206 zcmXr!<>h*|;CM^|0|UcjAcg}*Aj<)Wi#dQq3PTh_3S%&XCQ}ugfu6Cko}r&6<1Oy^ z__EZZ;>`TK`1q9!MNB}2VB%M*enC-YSz<}5epzCXep-G`3Q(DTa<+a+j$v9-MOlhT zv3a~{a#Cfsp>bMOd2X@+5Txhnhv*k%7U*W?6_+ID(6vzLEA-USCWH)pADWp@ns3m>$w~a@?$`AXjL>iNBnX^80L&{Ofu=}cK@^^1 z5s2^`ni3g^Xhrmy#APVS0Ua<#f_z5l(e_>Zbt$Dv@}{bIEfQ7KGO2HL&prY`2>1vvpMWgbfT0sX1X6g9cBmv}aL+b8-~-;{ z9bRA?l>{{8JGlf?pgr0Xs10_cq~-9zECRE^l|veKM``Si8EbjI;tR=`8#HFza=Ub4 z&jV5Dnpe_M#^#0ciokScI_&+Ab5*!dZVKyy{#fy%P6J08qa%3SMZN4N($69LC$m-; zYi?z><~o}+`nMmLF+ZBIaog!*m_-5R84$vhP<)DCVv75Y-{fAKMsC2EXmZB1*FU!X!cZIf dnm7K0UO?*TWz~oqCExphGX82vXh36%{{!peo3#J{ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/wheel/__pycache__/bdist_wheel.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/wheel/__pycache__/bdist_wheel.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87b678e276becc8ba80b08b7ecb1a2ed372c1cb9 GIT binary patch literal 10311 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/wheel/__pycache__/wheelfile.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/wheel/__pycache__/wheelfile.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e790ee30d1a894765c49467e3c1c3a342d28ee5 GIT binary patch literal 5457 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 Sbf8(p5vF6?rimj;-TQw~z-A!; literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/wheel/bdist_wheel.py b/mongo_mac/lib/python3.6/site-packages/wheel/bdist_wheel.py new file mode 100644 index 0000000..4f06d36 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/wheel/bdist_wheel.py @@ -0,0 +1,372 @@ +""" +Create a wheel (.whl) distribution. + +A wheel is a built archive format. +""" + +import os +import shutil +import sys +import re +from email.generator import Generator +from distutils.core import Command +from distutils.sysconfig import get_python_version +from distutils import log as logger +from glob import iglob +from shutil import rmtree +from warnings import warn + +import pkg_resources + +from .pep425tags import get_abbr_impl, get_impl_ver, get_abi_tag, get_platform +from .pkginfo import write_pkg_info +from .metadata import pkginfo_to_metadata +from .wheelfile import WheelFile +from . import pep425tags +from . import __version__ as wheel_version + + +safe_name = pkg_resources.safe_name +safe_version = pkg_resources.safe_version + +PY_LIMITED_API_PATTERN = r'cp3\d' + + +def safer_name(name): + return safe_name(name).replace('-', '_') + + +def safer_version(version): + return safe_version(version).replace('-', '_') + + +class bdist_wheel(Command): + + description = 'create a wheel distribution' + + user_options = [('bdist-dir=', 'b', + "temporary directory for creating the distribution"), + ('plat-name=', 'p', + "platform name to embed in generated filenames " + "(default: %s)" % get_platform()), + ('keep-temp', 'k', + "keep the pseudo-installation tree around after " + + "creating the distribution archive"), + ('dist-dir=', 'd', + "directory to put final built distributions in"), + ('skip-build', None, + "skip rebuilding everything (for testing/debugging)"), + ('relative', None, + "build the archive using relative paths" + "(default: false)"), + ('owner=', 'u', + "Owner name used when creating a tar file" + " [default: current user]"), + ('group=', 'g', + "Group name used when creating a tar file" + " [default: current group]"), + ('universal', None, + "make a universal wheel" + " (default: false)"), + ('python-tag=', None, + "Python implementation compatibility tag" + " (default: py%s)" % get_impl_ver()[0]), + ('build-number=', None, + "Build number for this particular version. " + "As specified in PEP-0427, this must start with a digit. " + "[default: None]"), + ('py-limited-api=', None, + "Python tag (cp32|cp33|cpNN) for abi3 wheel tag" + " (default: false)"), + ] + + boolean_options = ['keep-temp', 'skip-build', 'relative', 'universal'] + + def initialize_options(self): + self.bdist_dir = None + self.data_dir = None + self.plat_name = None + self.plat_tag = None + self.format = 'zip' + self.keep_temp = False + self.dist_dir = None + self.egginfo_dir = None + self.root_is_pure = None + self.skip_build = None + self.relative = False + self.owner = None + self.group = None + self.universal = False + self.python_tag = 'py' + get_impl_ver()[0] + self.build_number = None + self.py_limited_api = False + self.plat_name_supplied = False + + def finalize_options(self): + if self.bdist_dir is None: + bdist_base = self.get_finalized_command('bdist').bdist_base + self.bdist_dir = os.path.join(bdist_base, 'wheel') + + self.data_dir = self.wheel_dist_name + '.data' + self.plat_name_supplied = self.plat_name is not None + + need_options = ('dist_dir', 'plat_name', 'skip_build') + + self.set_undefined_options('bdist', + *zip(need_options, need_options)) + + self.root_is_pure = not (self.distribution.has_ext_modules() + or self.distribution.has_c_libraries()) + + if self.py_limited_api and not re.match(PY_LIMITED_API_PATTERN, self.py_limited_api): + raise ValueError("py-limited-api must match '%s'" % PY_LIMITED_API_PATTERN) + + # Support legacy [wheel] section for setting universal + wheel = self.distribution.get_option_dict('wheel') + if 'universal' in wheel: + # please don't define this in your global configs + logger.warn('The [wheel] section is deprecated. Use [bdist_wheel] instead.') + val = wheel['universal'][1].strip() + if val.lower() in ('1', 'true', 'yes'): + self.universal = True + + if self.build_number is not None and not self.build_number[:1].isdigit(): + raise ValueError("Build tag (build-number) must start with a digit.") + + @property + def wheel_dist_name(self): + """Return distribution full name with - replaced with _""" + components = (safer_name(self.distribution.get_name()), + safer_version(self.distribution.get_version())) + if self.build_number: + components += (self.build_number,) + return '-'.join(components) + + def get_tag(self): + # bdist sets self.plat_name if unset, we should only use it for purepy + # wheels if the user supplied it. + if self.plat_name_supplied: + plat_name = self.plat_name + elif self.root_is_pure: + plat_name = 'any' + else: + plat_name = self.plat_name or get_platform() + if plat_name in ('linux-x86_64', 'linux_x86_64') and sys.maxsize == 2147483647: + plat_name = 'linux_i686' + plat_name = plat_name.replace('-', '_').replace('.', '_') + + if self.root_is_pure: + if self.universal: + impl = 'py2.py3' + else: + impl = self.python_tag + tag = (impl, 'none', plat_name) + else: + impl_name = get_abbr_impl() + impl_ver = get_impl_ver() + impl = impl_name + impl_ver + # We don't work on CPython 3.1, 3.0. + if self.py_limited_api and (impl_name + impl_ver).startswith('cp3'): + impl = self.py_limited_api + abi_tag = 'abi3' + else: + abi_tag = str(get_abi_tag()).lower() + tag = (impl, abi_tag, plat_name) + supported_tags = pep425tags.get_supported( + supplied_platform=plat_name if self.plat_name_supplied else None) + # XXX switch to this alternate implementation for non-pure: + if not self.py_limited_api: + assert tag == supported_tags[0], "%s != %s" % (tag, supported_tags[0]) + assert tag in supported_tags, "would build wheel with unsupported tag {}".format(tag) + return tag + + def run(self): + build_scripts = self.reinitialize_command('build_scripts') + build_scripts.executable = 'python' + build_scripts.force = True + + build_ext = self.reinitialize_command('build_ext') + build_ext.inplace = False + + if not self.skip_build: + self.run_command('build') + + install = self.reinitialize_command('install', + reinit_subcommands=True) + install.root = self.bdist_dir + install.compile = False + install.skip_build = self.skip_build + install.warn_dir = False + + # A wheel without setuptools scripts is more cross-platform. + # Use the (undocumented) `no_ep` option to setuptools' + # install_scripts command to avoid creating entry point scripts. + install_scripts = self.reinitialize_command('install_scripts') + install_scripts.no_ep = True + + # Use a custom scheme for the archive, because we have to decide + # at installation time which scheme to use. + for key in ('headers', 'scripts', 'data', 'purelib', 'platlib'): + setattr(install, + 'install_' + key, + os.path.join(self.data_dir, key)) + + basedir_observed = '' + + if os.name == 'nt': + # win32 barfs if any of these are ''; could be '.'? + # (distutils.command.install:change_roots bug) + basedir_observed = os.path.normpath(os.path.join(self.data_dir, '..')) + self.install_libbase = self.install_lib = basedir_observed + + setattr(install, + 'install_purelib' if self.root_is_pure else 'install_platlib', + basedir_observed) + + logger.info("installing to %s", self.bdist_dir) + + self.run_command('install') + + impl_tag, abi_tag, plat_tag = self.get_tag() + archive_basename = "{}-{}-{}-{}".format(self.wheel_dist_name, impl_tag, abi_tag, plat_tag) + if not self.relative: + archive_root = self.bdist_dir + else: + archive_root = os.path.join( + self.bdist_dir, + self._ensure_relative(install.install_base)) + + self.set_undefined_options('install_egg_info', ('target', 'egginfo_dir')) + distinfo_dirname = '{}-{}.dist-info'.format( + safer_name(self.distribution.get_name()), + safer_version(self.distribution.get_version())) + distinfo_dir = os.path.join(self.bdist_dir, distinfo_dirname) + self.egg2dist(self.egginfo_dir, distinfo_dir) + + self.write_wheelfile(distinfo_dir) + + # Make the archive + if not os.path.exists(self.dist_dir): + os.makedirs(self.dist_dir) + + wheel_path = os.path.join(self.dist_dir, archive_basename + '.whl') + with WheelFile(wheel_path, 'w') as wf: + wf.write_files(archive_root) + + # Add to 'Distribution.dist_files' so that the "upload" command works + getattr(self.distribution, 'dist_files', []).append( + ('bdist_wheel', get_python_version(), wheel_path)) + + if not self.keep_temp: + logger.info('removing %s', self.bdist_dir) + if not self.dry_run: + rmtree(self.bdist_dir) + + def write_wheelfile(self, wheelfile_base, generator='bdist_wheel (' + wheel_version + ')'): + from email.message import Message + msg = Message() + msg['Wheel-Version'] = '1.0' # of the spec + msg['Generator'] = generator + msg['Root-Is-Purelib'] = str(self.root_is_pure).lower() + if self.build_number is not None: + msg['Build'] = self.build_number + + # Doesn't work for bdist_wininst + impl_tag, abi_tag, plat_tag = self.get_tag() + for impl in impl_tag.split('.'): + for abi in abi_tag.split('.'): + for plat in plat_tag.split('.'): + msg['Tag'] = '-'.join((impl, abi, plat)) + + wheelfile_path = os.path.join(wheelfile_base, 'WHEEL') + logger.info('creating %s', wheelfile_path) + with open(wheelfile_path, 'w') as f: + Generator(f, maxheaderlen=0).flatten(msg) + + def _ensure_relative(self, path): + # copied from dir_util, deleted + drive, path = os.path.splitdrive(path) + if path[0:1] == os.sep: + path = drive + path[1:] + return path + + @property + def license_paths(self): + metadata = self.distribution.get_option_dict('metadata') + files = set() + patterns = sorted({ + option for option in metadata.get('license_files', ('', ''))[1].split() + }) + + if 'license_file' in metadata: + warn('The "license_file" option is deprecated. Use "license_files" instead.', + DeprecationWarning) + files.add(metadata['license_file'][1]) + + if 'license_file' not in metadata and 'license_files' not in metadata: + patterns = ('LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*') + + for pattern in patterns: + for path in iglob(pattern): + if path not in files and os.path.isfile(path): + logger.info('adding license file "%s" (matched pattern "%s")', path, pattern) + files.add(path) + + return files + + def egg2dist(self, egginfo_path, distinfo_path): + """Convert an .egg-info directory into a .dist-info directory""" + def adios(p): + """Appropriately delete directory, file or link.""" + if os.path.exists(p) and not os.path.islink(p) and os.path.isdir(p): + shutil.rmtree(p) + elif os.path.exists(p): + os.unlink(p) + + adios(distinfo_path) + + if not os.path.exists(egginfo_path): + # There is no egg-info. This is probably because the egg-info + # file/directory is not named matching the distribution name used + # to name the archive file. Check for this case and report + # accordingly. + import glob + pat = os.path.join(os.path.dirname(egginfo_path), '*.egg-info') + possible = glob.glob(pat) + err = "Egg metadata expected at %s but not found" % (egginfo_path,) + if possible: + alt = os.path.basename(possible[0]) + err += " (%s found - possible misnamed archive file?)" % (alt,) + + raise ValueError(err) + + if os.path.isfile(egginfo_path): + # .egg-info is a single file + pkginfo_path = egginfo_path + pkg_info = pkginfo_to_metadata(egginfo_path, egginfo_path) + os.mkdir(distinfo_path) + else: + # .egg-info is a directory + pkginfo_path = os.path.join(egginfo_path, 'PKG-INFO') + pkg_info = pkginfo_to_metadata(egginfo_path, pkginfo_path) + + # ignore common egg metadata that is useless to wheel + shutil.copytree(egginfo_path, distinfo_path, + ignore=lambda x, y: {'PKG-INFO', 'requires.txt', 'SOURCES.txt', + 'not-zip-safe'} + ) + + # delete dependency_links if it is only whitespace + dependency_links_path = os.path.join(distinfo_path, 'dependency_links.txt') + with open(dependency_links_path, 'r') as dependency_links_file: + dependency_links = dependency_links_file.read().strip() + if not dependency_links: + adios(dependency_links_path) + + write_pkg_info(os.path.join(distinfo_path, 'METADATA'), pkg_info) + + for license_path in self.license_paths: + filename = os.path.basename(license_path) + shutil.copy(license_path, os.path.join(distinfo_path, filename)) + + adios(egginfo_path) diff --git a/mongo_mac/lib/python3.6/site-packages/wheel/cli/__init__.py b/mongo_mac/lib/python3.6/site-packages/wheel/cli/__init__.py new file mode 100644 index 0000000..95740bf --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/wheel/cli/__init__.py @@ -0,0 +1,88 @@ +""" +Wheel command-line utility. +""" + +from __future__ import print_function + +import argparse +import os +import sys + + +def require_pkgresources(name): + try: + import pkg_resources # noqa: F401 + except ImportError: + raise RuntimeError("'{0}' needs pkg_resources (part of setuptools).".format(name)) + + +class WheelError(Exception): + pass + + +def unpack_f(args): + from .unpack import unpack + unpack(args.wheelfile, args.dest) + + +def pack_f(args): + from .pack import pack + pack(args.directory, args.dest_dir, args.build_number) + + +def convert_f(args): + from .convert import convert + convert(args.files, args.dest_dir, args.verbose) + + +def version_f(args): + from .. import __version__ + print("wheel %s" % __version__) + + +def parser(): + p = argparse.ArgumentParser() + s = p.add_subparsers(help="commands") + + unpack_parser = s.add_parser('unpack', help='Unpack wheel') + unpack_parser.add_argument('--dest', '-d', help='Destination directory', + default='.') + unpack_parser.add_argument('wheelfile', help='Wheel file') + unpack_parser.set_defaults(func=unpack_f) + + repack_parser = s.add_parser('pack', help='Repack wheel') + repack_parser.add_argument('directory', help='Root directory of the unpacked wheel') + repack_parser.add_argument('--dest-dir', '-d', default=os.path.curdir, + help="Directory to store the wheel (default %(default)s)") + repack_parser.add_argument('--build-number', help="Build tag to use in the wheel name") + repack_parser.set_defaults(func=pack_f) + + convert_parser = s.add_parser('convert', help='Convert egg or wininst to wheel') + convert_parser.add_argument('files', nargs='*', help='Files to convert') + convert_parser.add_argument('--dest-dir', '-d', default=os.path.curdir, + help="Directory to store wheels (default %(default)s)") + convert_parser.add_argument('--verbose', '-v', action='store_true') + convert_parser.set_defaults(func=convert_f) + + version_parser = s.add_parser('version', help='Print version and exit') + version_parser.set_defaults(func=version_f) + + help_parser = s.add_parser('help', help='Show this help') + help_parser.set_defaults(func=lambda args: p.print_help()) + + return p + + +def main(): + p = parser() + args = p.parse_args() + if not hasattr(args, 'func'): + p.print_help() + else: + try: + args.func(args) + return 0 + except WheelError as e: + print(e, file=sys.stderr) + + return 1 diff --git a/mongo_mac/lib/python3.6/site-packages/wheel/cli/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/wheel/cli/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4bd2165087928b59145f814ad5d0020d2111fde GIT binary patch literal 3048 zcmb_eTW{Mo6ecCvmL1ti*EGGX7d5@Qo8xxv(1#U8x2`J&3_;Ou=xPkm6p>Dp$dXG^ zNuxP?SPHCr$bZ=De#!m=Uk426U)a;mq2wgZ`ZycBA5tIBc|6(a+}D6P&7V-BmmCWHE8!s@K?ny?0M?AimD zxvUBEP1a&F(6*Sz+R)Ch4x5G6V{_~nv~BhQI}UA!+0RIKzBt!~C$ZXIYP|(uq)T;YEaFrJ!#s^toTbYV#Rd3TP-dV!gd*=iwe0~=l8_zxoTQ5m zQFNmvmMFo$vY54QPslFarN7V@B(=VWYXb~>S>S<1|JqMCcdq#<=S=$JjnzPKndKtl z(!V|qh4QnZFS*LcD$5etUFtfz{f?NP`Fb?YgnA@ICbai7PgOkP<)}W)#3)o2SQ>BZdBI=ivETs!-@l#* zAS5Co)S@2kPyxO|BAl51P(cr%NR;Jd09qbcjDq$oUE0uGbGd74Hwf^CL7-bfFv?h- zVBZUZmwA|!E9TmVswNyN(2&RR6KGYJn(;f9MwJ;$pN9_E*-FR=EKSLTPRKeIYZqO& zwCP)f49-)}({UJWbZs#Q6S`@%GmI0i9mb_GNGMjNSv>+tyXD?scoMcs3>X6X5%bW# zgA7*;vPI~;9~q#tckO+2ViqI;onx>$;sgwJlYwO-m5FWbBDMg=18*gd6BeZTXoZWe zB~V31{3zHu9u*AF!ukQ!Q!x6Upf;i`-Q+@b9dR1b)=-I3plWmj7FIIJr}$9dD86R3 zKNwzw)dPqK_#KG*cE*)Tn-uK~5o}NB0z`17M`!shIt%D=CI|q61a=65!ZkMbuSoDl zBG6lO%}~e`9!~uS-gN))Dy$yBL$DDP^Q%LR1tH2C;9&|JZ|_Te75p&1{XcD6bVrOvVQ>;m&E zshXNOblyd_XwGvc&U#IGhgL4J%VwoEsjb(3B}2-tu&b}#QsNDU=512D-ucFw7Grj=`v?vI#mS zegPAP36;Wo$}u|1FNg({z5F!G)WMlZ?rIH^kAcEj1*TPk>A|;)PrjUnr>`Uxll9UM{&Gr-u$SX#xYOxbU!y zJfE+w`kC;zfX{*SahLhFI0I6e-YDk2!jQ!IX{=hhmKu6PZ593Z+`yaw8SZ`Xi)OD^ zMK+jYQ@6~e10{0QZ#^{W*aSaDUa{~5^R!p=dWT_-Tv8HwguOVrH_{1k9eeM zEQb0q2|*~4U33__3?FHgxgWQ5sUbg@q~kJrF>h%1UJ{O0Sa|<2j3g9NoPu;MxmdcF zWKo#N`_L&xx^3-(I?S@}d@fe=5l__Yy!*TUH+#bfyehEqA7rRE=j) z3ze`@0BEF#A250V{>Mvy1QYTmRD`rQ z!h8rt4xv(D6vJ)6cRN&B6UykWB^OO%0}G}PwmZmd6L?+$JzLKRJilu2{Q8lS9pJfQ zUezZSvKOfS3~Q1{Uu5?#u%Jj(@quI)DF9Jf~eFa8VhiQRAj literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/wheel/cli/__pycache__/convert.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/wheel/cli/__pycache__/convert.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3bdebdb8092099d19c712d77aa49bcbdcc3e317 GIT binary patch literal 6222 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/wheel/cli/__pycache__/unpack.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/wheel/cli/__pycache__/unpack.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c7bc95e1b85df8a5f5d2246c5c6da6b091ccd6b GIT binary patch literal 951 zcmYjPON$dh5bo}IB$dML>#M$YdWM=0Px_gq%>lClz zU(ln!#Q)G&LD;__9;}`O*@CL+sjkOYU-iMYYu@i~KRn7=#Dep4Q27`PLk#Dr zz#+!wOmY%h&DRcXW-&W=3O97&uFYK5`i#RCBkxeJa|yYqhxP7Qq@@}pbs4L)DvvLr zoAGx}N1W$JY0fqFW8*a9fbM|40F|G>D6~Xt{Pk!>mL$U&VR(&Kma;NCbC!5%t;xz( zE+biMX|J&X^o3xg+F2*_)(9iW+A%j6og(JEL2uCq1o5u%Fb9CP=6~Op<0w9-5uF-H zzUNVp1|E&8Qt?vJX`1KsjMKUa<&3I|E*O_;6)eiA;H$mGgp1V!Q$ldM@ilc)N!5r` z(;*siYJzE0GTOw`R7nbn5}4Wc?T;f76%emReR|Sls*!1Ds%!xoeA_sKp-*3eP0Pp- zOj#;;tST|1_Zd&3I#(t;u7xmz{J-t_4Lsd4hycR;)`o_(9724bE>^zpYqKefm+V-R z*ROhAVZ%zo>i|)5Hb`K3CR;m0QPpEjDyeM)T-#ZdmfC4nuic~)MWnPPXHvUTv8qM?Fo{HvR5=3* zgZMm9`F?VCF=2=D$>33ZHap)xNaoWbeh4xwgOgyKj`z}1ntpqS1)no{A%lk1t&Q_E z*eux}&$PQacA%-;1%o;s?&4j16MOhJ5%<8;!@@k;UR!$uc;%`Vd@vB^J?mB_eM5&Z rFIwCH6Ly+jhPZ~xrb08*6?50*wx1Rit8@Mg!=G$}>5?{Xldkm-l5P$) literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/wheel/cli/convert.py b/mongo_mac/lib/python3.6/site-packages/wheel/cli/convert.py new file mode 100644 index 0000000..f1a793a --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/wheel/cli/convert.py @@ -0,0 +1,269 @@ +import os.path +import re +import shutil +import sys +import tempfile +import zipfile +from distutils import dist +from glob import iglob + +from ..bdist_wheel import bdist_wheel +from ..wheelfile import WheelFile +from . import WheelError, require_pkgresources + +egg_info_re = re.compile(r''' + (?P.+?)-(?P.+?) + (-(?Ppy\d\.\d) + (-(?P.+?))? + )?.egg$''', re.VERBOSE) + + +class _bdist_wheel_tag(bdist_wheel): + # allow the client to override the default generated wheel tag + # The default bdist_wheel implementation uses python and abi tags + # of the running python process. This is not suitable for + # generating/repackaging prebuild binaries. + + full_tag_supplied = False + full_tag = None # None or a (pytag, soabitag, plattag) triple + + def get_tag(self): + if self.full_tag_supplied and self.full_tag is not None: + return self.full_tag + else: + return bdist_wheel.get_tag(self) + + +def egg2wheel(egg_path, dest_dir): + filename = os.path.basename(egg_path) + match = egg_info_re.match(filename) + if not match: + raise WheelError('Invalid egg file name: {}'.format(filename)) + + egg_info = match.groupdict() + dir = tempfile.mkdtemp(suffix="_e2w") + if os.path.isfile(egg_path): + # assume we have a bdist_egg otherwise + with zipfile.ZipFile(egg_path) as egg: + egg.extractall(dir) + else: + # support buildout-style installed eggs directories + for pth in os.listdir(egg_path): + src = os.path.join(egg_path, pth) + if os.path.isfile(src): + shutil.copy2(src, dir) + else: + shutil.copytree(src, os.path.join(dir, pth)) + + pyver = egg_info['pyver'] + if pyver: + pyver = egg_info['pyver'] = pyver.replace('.', '') + + arch = (egg_info['arch'] or 'any').replace('.', '_').replace('-', '_') + + # assume all binary eggs are for CPython + abi = 'cp' + pyver[2:] if arch != 'any' else 'none' + + root_is_purelib = egg_info['arch'] is None + if root_is_purelib: + bw = bdist_wheel(dist.Distribution()) + else: + bw = _bdist_wheel_tag(dist.Distribution()) + + bw.root_is_pure = root_is_purelib + bw.python_tag = pyver + bw.plat_name_supplied = True + bw.plat_name = egg_info['arch'] or 'any' + if not root_is_purelib: + bw.full_tag_supplied = True + bw.full_tag = (pyver, abi, arch) + + dist_info_dir = os.path.join(dir, '{name}-{ver}.dist-info'.format(**egg_info)) + bw.egg2dist(os.path.join(dir, 'EGG-INFO'), dist_info_dir) + bw.write_wheelfile(dist_info_dir, generator='egg2wheel') + wheel_name = '{name}-{ver}-{pyver}-{}-{}.whl'.format(abi, arch, **egg_info) + with WheelFile(os.path.join(dest_dir, wheel_name), 'w') as wf: + wf.write_files(dir) + + shutil.rmtree(dir) + + +def parse_wininst_info(wininfo_name, egginfo_name): + """Extract metadata from filenames. + + Extracts the 4 metadataitems needed (name, version, pyversion, arch) from + the installer filename and the name of the egg-info directory embedded in + the zipfile (if any). + + The egginfo filename has the format:: + + name-ver(-pyver)(-arch).egg-info + + The installer filename has the format:: + + name-ver.arch(-pyver).exe + + Some things to note: + + 1. The installer filename is not definitive. An installer can be renamed + and work perfectly well as an installer. So more reliable data should + be used whenever possible. + 2. The egg-info data should be preferred for the name and version, because + these come straight from the distutils metadata, and are mandatory. + 3. The pyver from the egg-info data should be ignored, as it is + constructed from the version of Python used to build the installer, + which is irrelevant - the installer filename is correct here (even to + the point that when it's not there, any version is implied). + 4. The architecture must be taken from the installer filename, as it is + not included in the egg-info data. + 5. Architecture-neutral installers still have an architecture because the + installer format itself (being executable) is architecture-specific. We + should therefore ignore the architecture if the content is pure-python. + """ + + egginfo = None + if egginfo_name: + egginfo = egg_info_re.search(egginfo_name) + if not egginfo: + raise ValueError("Egg info filename %s is not valid" % (egginfo_name,)) + + # Parse the wininst filename + # 1. Distribution name (up to the first '-') + w_name, sep, rest = wininfo_name.partition('-') + if not sep: + raise ValueError("Installer filename %s is not valid" % (wininfo_name,)) + + # Strip '.exe' + rest = rest[:-4] + # 2. Python version (from the last '-', must start with 'py') + rest2, sep, w_pyver = rest.rpartition('-') + if sep and w_pyver.startswith('py'): + rest = rest2 + w_pyver = w_pyver.replace('.', '') + else: + # Not version specific - use py2.py3. While it is possible that + # pure-Python code is not compatible with both Python 2 and 3, there + # is no way of knowing from the wininst format, so we assume the best + # here (the user can always manually rename the wheel to be more + # restrictive if needed). + w_pyver = 'py2.py3' + # 3. Version and architecture + w_ver, sep, w_arch = rest.rpartition('.') + if not sep: + raise ValueError("Installer filename %s is not valid" % (wininfo_name,)) + + if egginfo: + w_name = egginfo.group('name') + w_ver = egginfo.group('ver') + + return {'name': w_name, 'ver': w_ver, 'arch': w_arch, 'pyver': w_pyver} + + +def wininst2wheel(path, dest_dir): + with zipfile.ZipFile(path) as bdw: + # Search for egg-info in the archive + egginfo_name = None + for filename in bdw.namelist(): + if '.egg-info' in filename: + egginfo_name = filename + break + + info = parse_wininst_info(os.path.basename(path), egginfo_name) + + root_is_purelib = True + for zipinfo in bdw.infolist(): + if zipinfo.filename.startswith('PLATLIB'): + root_is_purelib = False + break + if root_is_purelib: + paths = {'purelib': ''} + else: + paths = {'platlib': ''} + + dist_info = "%(name)s-%(ver)s" % info + datadir = "%s.data/" % dist_info + + # rewrite paths to trick ZipFile into extracting an egg + # XXX grab wininst .ini - between .exe, padding, and first zip file. + members = [] + egginfo_name = '' + for zipinfo in bdw.infolist(): + key, basename = zipinfo.filename.split('/', 1) + key = key.lower() + basepath = paths.get(key, None) + if basepath is None: + basepath = datadir + key.lower() + '/' + oldname = zipinfo.filename + newname = basepath + basename + zipinfo.filename = newname + del bdw.NameToInfo[oldname] + bdw.NameToInfo[newname] = zipinfo + # Collect member names, but omit '' (from an entry like "PLATLIB/" + if newname: + members.append(newname) + # Remember egg-info name for the egg2dist call below + if not egginfo_name: + if newname.endswith('.egg-info'): + egginfo_name = newname + elif '.egg-info/' in newname: + egginfo_name, sep, _ = newname.rpartition('/') + dir = tempfile.mkdtemp(suffix="_b2w") + bdw.extractall(dir, members) + + # egg2wheel + abi = 'none' + pyver = info['pyver'] + arch = (info['arch'] or 'any').replace('.', '_').replace('-', '_') + # Wininst installers always have arch even if they are not + # architecture-specific (because the format itself is). + # So, assume the content is architecture-neutral if root is purelib. + if root_is_purelib: + arch = 'any' + # If the installer is architecture-specific, it's almost certainly also + # CPython-specific. + if arch != 'any': + pyver = pyver.replace('py', 'cp') + wheel_name = '-'.join((dist_info, pyver, abi, arch)) + if root_is_purelib: + bw = bdist_wheel(dist.Distribution()) + else: + bw = _bdist_wheel_tag(dist.Distribution()) + + bw.root_is_pure = root_is_purelib + bw.python_tag = pyver + bw.plat_name_supplied = True + bw.plat_name = info['arch'] or 'any' + + if not root_is_purelib: + bw.full_tag_supplied = True + bw.full_tag = (pyver, abi, arch) + + dist_info_dir = os.path.join(dir, '%s.dist-info' % dist_info) + bw.egg2dist(os.path.join(dir, egginfo_name), dist_info_dir) + bw.write_wheelfile(dist_info_dir, generator='wininst2wheel') + + wheel_path = os.path.join(dest_dir, wheel_name) + with WheelFile(wheel_path, 'w') as wf: + wf.write_files(dir) + + shutil.rmtree(dir) + + +def convert(files, dest_dir, verbose): + # Only support wheel convert if pkg_resources is present + require_pkgresources('wheel convert') + + for pat in files: + for installer in iglob(pat): + if os.path.splitext(installer)[1] == '.egg': + conv = egg2wheel + else: + conv = wininst2wheel + + if verbose: + print("{}... ".format(installer)) + sys.stdout.flush() + + conv(installer, dest_dir) + if verbose: + print("OK") diff --git a/mongo_mac/lib/python3.6/site-packages/wheel/cli/pack.py b/mongo_mac/lib/python3.6/site-packages/wheel/cli/pack.py new file mode 100644 index 0000000..af6e81c --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/wheel/cli/pack.py @@ -0,0 +1,58 @@ +from __future__ import print_function + +import os.path +import re +import sys + +from wheel.cli import WheelError +from wheel.wheelfile import WheelFile + +DIST_INFO_RE = re.compile(r"^(?P(?P.+?)-(?P\d.*?))\.dist-info$") + + +def pack(directory, dest_dir, build_number): + """Repack a previously unpacked wheel directory into a new wheel file. + + The .dist-info/WHEEL file must contain one or more tags so that the target + wheel file name can be determined. + + :param directory: The unpacked wheel directory + :param dest_dir: Destination directory (defaults to the current directory) + """ + # Find the .dist-info directory + dist_info_dirs = [fn for fn in os.listdir(directory) + if os.path.isdir(os.path.join(directory, fn)) and DIST_INFO_RE.match(fn)] + if len(dist_info_dirs) > 1: + raise WheelError('Multiple .dist-info directories found in {}'.format(directory)) + elif not dist_info_dirs: + raise WheelError('No .dist-info directories found in {}'.format(directory)) + + # Determine the target wheel filename + dist_info_dir = dist_info_dirs[0] + name_version = DIST_INFO_RE.match(dist_info_dir).group('namever') + + # Add the build number if specific + if build_number: + name_version += '-' + build_number + + # Read the tags from .dist-info/WHEEL + with open(os.path.join(directory, dist_info_dir, 'WHEEL')) as f: + tags = [line.split(' ')[1].rstrip() for line in f if line.startswith('Tag: ')] + if not tags: + raise WheelError('No tags present in {}/WHEEL; cannot determine target wheel filename' + .format(dist_info_dir)) + + # Reassemble the tags for the wheel file + impls = sorted({tag.split('-')[0] for tag in tags}) + abivers = sorted({tag.split('-')[1] for tag in tags}) + platforms = sorted({tag.split('-')[2] for tag in tags}) + tagline = '-'.join(['.'.join(impls), '.'.join(abivers), '.'.join(platforms)]) + + # Repack the wheel + wheel_path = os.path.join(dest_dir, '{}-{}.whl'.format(name_version, tagline)) + with WheelFile(wheel_path, 'w') as wf: + print("Repacking wheel as {}...".format(wheel_path), end='') + sys.stdout.flush() + wf.write_files(directory) + + print('OK') diff --git a/mongo_mac/lib/python3.6/site-packages/wheel/cli/unpack.py b/mongo_mac/lib/python3.6/site-packages/wheel/cli/unpack.py new file mode 100644 index 0000000..2e9857a --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/wheel/cli/unpack.py @@ -0,0 +1,25 @@ +from __future__ import print_function + +import os.path +import sys + +from ..wheelfile import WheelFile + + +def unpack(path, dest='.'): + """Unpack a wheel. + + Wheel content will be unpacked to {dest}/{name}-{ver}, where {name} + is the package name and {ver} its version. + + :param path: The path to the wheel. + :param dest: Destination directory (default to current directory). + """ + with WheelFile(path) as wf: + namever = wf.parsed_filename.group('namever') + destination = os.path.join(dest, namever) + print("Unpacking to: {}...".format(destination), end='') + sys.stdout.flush() + wf.extractall(destination) + + print('OK') diff --git a/mongo_mac/lib/python3.6/site-packages/wheel/metadata.py b/mongo_mac/lib/python3.6/site-packages/wheel/metadata.py new file mode 100644 index 0000000..ab0c07e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/wheel/metadata.py @@ -0,0 +1,141 @@ +""" +Tools for converting old- to new-style metadata. +""" + +import os.path +import re +import textwrap + +import pkg_resources + +from .pkginfo import read_pkg_info + +# Wheel itself is probably the only program that uses non-extras markers +# in METADATA/PKG-INFO. Support its syntax with the extra at the end only. +EXTRA_RE = re.compile( + r"""^(?P.*?)(;\s*(?P.*?)(extra == '(?P.*?)')?)$""") + + +def requires_to_requires_dist(requirement): + """Return the version specifier for a requirement in PEP 345/566 fashion.""" + if getattr(requirement, 'url', None): + return " @ " + requirement.url + + requires_dist = [] + for op, ver in requirement.specs: + requires_dist.append(op + ver) + if not requires_dist: + return '' + return " (%s)" % ','.join(sorted(requires_dist)) + + +def convert_requirements(requirements): + """Yield Requires-Dist: strings for parsed requirements strings.""" + for req in requirements: + parsed_requirement = pkg_resources.Requirement.parse(req) + spec = requires_to_requires_dist(parsed_requirement) + extras = ",".join(sorted(parsed_requirement.extras)) + if extras: + extras = "[%s]" % extras + yield (parsed_requirement.project_name + extras + spec) + + +def generate_requirements(extras_require): + """ + Convert requirements from a setup()-style dictionary to ('Requires-Dist', 'requirement') + and ('Provides-Extra', 'extra') tuples. + + extras_require is a dictionary of {extra: [requirements]} as passed to setup(), + using the empty extra {'': [requirements]} to hold install_requires. + """ + for extra, depends in extras_require.items(): + condition = '' + extra = extra or '' + if ':' in extra: # setuptools extra:condition syntax + extra, condition = extra.split(':', 1) + + extra = pkg_resources.safe_extra(extra) + if extra: + yield 'Provides-Extra', extra + if condition: + condition = "(" + condition + ") and " + condition += "extra == '%s'" % extra + + if condition: + condition = ' ; ' + condition + + for new_req in convert_requirements(depends): + yield 'Requires-Dist', new_req + condition + + +def pkginfo_to_metadata(egg_info_path, pkginfo_path): + """ + Convert .egg-info directory with PKG-INFO to the Metadata 2.1 format + """ + pkg_info = read_pkg_info(pkginfo_path) + pkg_info.replace_header('Metadata-Version', '2.1') + # Those will be regenerated from `requires.txt`. + del pkg_info['Provides-Extra'] + del pkg_info['Requires-Dist'] + requires_path = os.path.join(egg_info_path, 'requires.txt') + if os.path.exists(requires_path): + with open(requires_path) as requires_file: + requires = requires_file.read() + + parsed_requirements = sorted(pkg_resources.split_sections(requires), + key=lambda x: x[0] or '') + for extra, reqs in parsed_requirements: + for key, value in generate_requirements({extra: reqs}): + if (key, value) not in pkg_info.items(): + pkg_info[key] = value + + description = pkg_info['Description'] + if description: + pkg_info.set_payload(dedent_description(pkg_info)) + del pkg_info['Description'] + + return pkg_info + + +def pkginfo_unicode(pkg_info, field): + """Hack to coax Unicode out of an email Message() - Python 3.3+""" + text = pkg_info[field] + field = field.lower() + if not isinstance(text, str): + if not hasattr(pkg_info, 'raw_items'): # Python 3.2 + return str(text) + for item in pkg_info.raw_items(): + if item[0].lower() == field: + text = item[1].encode('ascii', 'surrogateescape') \ + .decode('utf-8') + break + + return text + + +def dedent_description(pkg_info): + """ + Dedent and convert pkg_info['Description'] to Unicode. + """ + description = pkg_info['Description'] + + # Python 3 Unicode handling, sorta. + surrogates = False + if not isinstance(description, str): + surrogates = True + description = pkginfo_unicode(pkg_info, 'Description') + + description_lines = description.splitlines() + description_dedent = '\n'.join( + # if the first line of long_description is blank, + # the first line here will be indented. + (description_lines[0].lstrip(), + textwrap.dedent('\n'.join(description_lines[1:])), + '\n')) + + if surrogates: + description_dedent = description_dedent \ + .encode("utf8") \ + .decode("ascii", "surrogateescape") + + return description_dedent diff --git a/mongo_mac/lib/python3.6/site-packages/wheel/pep425tags.py b/mongo_mac/lib/python3.6/site-packages/wheel/pep425tags.py new file mode 100644 index 0000000..13b5073 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/wheel/pep425tags.py @@ -0,0 +1,185 @@ +"""Generate and work with PEP 425 Compatibility Tags.""" + +import distutils.util +import platform +import sys +import sysconfig +import warnings + +try: + from importlib.machinery import get_all_suffixes +except ImportError: + from imp import get_suffixes as get_all_suffixes + + +def get_config_var(var): + try: + return sysconfig.get_config_var(var) + except IOError as e: # pip Issue #1074 + warnings.warn("{0}".format(e), RuntimeWarning) + return None + + +def get_abbr_impl(): + """Return abbreviated implementation name.""" + impl = platform.python_implementation() + if impl == 'PyPy': + return 'pp' + elif impl == 'Jython': + return 'jy' + elif impl == 'IronPython': + return 'ip' + elif impl == 'CPython': + return 'cp' + + raise LookupError('Unknown Python implementation: ' + impl) + + +def get_impl_ver(): + """Return implementation version.""" + impl_ver = get_config_var("py_version_nodot") + if not impl_ver or get_abbr_impl() == 'pp': + impl_ver = ''.join(map(str, get_impl_version_info())) + return impl_ver + + +def get_impl_version_info(): + """Return sys.version_info-like tuple for use in decrementing the minor + version.""" + if get_abbr_impl() == 'pp': + # as per https://github.com/pypa/pip/issues/2882 + return (sys.version_info[0], sys.pypy_version_info.major, + sys.pypy_version_info.minor) + else: + return sys.version_info[0], sys.version_info[1] + + +def get_flag(var, fallback, expected=True, warn=True): + """Use a fallback method for determining SOABI flags if the needed config + var is unset or unavailable.""" + val = get_config_var(var) + if val is None: + if warn: + warnings.warn("Config variable '{0}' is unset, Python ABI tag may " + "be incorrect".format(var), RuntimeWarning, 2) + return fallback() + return val == expected + + +def get_abi_tag(): + """Return the ABI tag based on SOABI (if available) or emulate SOABI + (CPython 2, PyPy).""" + soabi = get_config_var('SOABI') + impl = get_abbr_impl() + if not soabi and impl in ('cp', 'pp') and hasattr(sys, 'maxunicode'): + d = '' + m = '' + u = '' + if get_flag('Py_DEBUG', + lambda: hasattr(sys, 'gettotalrefcount'), + warn=(impl == 'cp')): + d = 'd' + if get_flag('WITH_PYMALLOC', + lambda: impl == 'cp', + warn=(impl == 'cp')): + m = 'm' + if get_flag('Py_UNICODE_SIZE', + lambda: sys.maxunicode == 0x10ffff, + expected=4, + warn=(impl == 'cp' and + sys.version_info < (3, 3))) \ + and sys.version_info < (3, 3): + u = 'u' + abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) + elif soabi and soabi.startswith('cpython-'): + abi = 'cp' + soabi.split('-')[1] + elif soabi: + abi = soabi.replace('.', '_').replace('-', '_') + else: + abi = None + return abi + + +def get_platform(): + """Return our platform name 'win32', 'linux_x86_64'""" + # XXX remove distutils dependency + result = distutils.util.get_platform().replace('.', '_').replace('-', '_') + if result == "linux_x86_64" and sys.maxsize == 2147483647: + # pip pull request #3497 + result = "linux_i686" + return result + + +def get_supported(versions=None, supplied_platform=None): + """Return a list of supported tags for each version specified in + `versions`. + + :param versions: a list of string versions, of the form ["33", "32"], + or None. The first version will be assumed to support our ABI. + """ + supported = [] + + # Versions must be given with respect to the preference + if versions is None: + versions = [] + version_info = get_impl_version_info() + major = version_info[:-1] + # Support all previous minor Python versions. + for minor in range(version_info[-1], -1, -1): + versions.append(''.join(map(str, major + (minor,)))) + + impl = get_abbr_impl() + + abis = [] + + abi = get_abi_tag() + if abi: + abis[0:0] = [abi] + + abi3s = set() + for suffix in get_all_suffixes(): + if suffix[0].startswith('.abi'): + abi3s.add(suffix[0].split('.', 2)[1]) + + abis.extend(sorted(list(abi3s))) + + abis.append('none') + + platforms = [] + if supplied_platform: + platforms.append(supplied_platform) + platforms.append(get_platform()) + + # Current version, current API (built specifically for our Python): + for abi in abis: + for arch in platforms: + 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 platforms: + supported.append(("%s%s" % (impl, version), abi, arch)) + + # No abi / arch, but requires our implementation: + for i, version in enumerate(versions): + supported.append(('%s%s' % (impl, version), 'none', 'any')) + if i == 0: + # Tagged specifically as being cross-version compatible + # (with just the major version specified) + supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) + + # Major Python version + platform; e.g. binaries not using the Python API + for arch in platforms: + supported.append(('py%s' % (versions[0][0]), 'none', arch)) + + # 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 diff --git a/mongo_mac/lib/python3.6/site-packages/wheel/pkginfo.py b/mongo_mac/lib/python3.6/site-packages/wheel/pkginfo.py new file mode 100644 index 0000000..115be45 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/wheel/pkginfo.py @@ -0,0 +1,43 @@ +"""Tools for reading and writing PKG-INFO / METADATA without caring +about the encoding.""" + +from email.parser import Parser + +try: + unicode + _PY3 = False +except NameError: + _PY3 = True + +if not _PY3: + from email.generator import Generator + + def read_pkg_info_bytes(bytestr): + return Parser().parsestr(bytestr) + + def read_pkg_info(path): + with open(path, "r") as headers: + message = Parser().parse(headers) + return message + + def write_pkg_info(path, message): + with open(path, 'w') as metadata: + Generator(metadata, mangle_from_=False, maxheaderlen=0).flatten(message) +else: + from email.generator import BytesGenerator + + def read_pkg_info_bytes(bytestr): + headers = bytestr.decode(encoding="ascii", errors="surrogateescape") + message = Parser().parsestr(headers) + return message + + def read_pkg_info(path): + with open(path, "r", + encoding="ascii", + errors="surrogateescape") as headers: + message = Parser().parse(headers) + return message + + def write_pkg_info(path, message): + with open(path, "wb") as out: + BytesGenerator(out, mangle_from_=False, maxheaderlen=0).flatten(message) diff --git a/mongo_mac/lib/python3.6/site-packages/wheel/util.py b/mongo_mac/lib/python3.6/site-packages/wheel/util.py new file mode 100644 index 0000000..0afb54a --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/wheel/util.py @@ -0,0 +1,46 @@ +import base64 +import io +import sys + + +if sys.version_info[0] < 3: + text_type = unicode # noqa: F821 + + StringIO = io.BytesIO + + def native(s, encoding='utf-8'): + if isinstance(s, unicode): + return s.encode(encoding) + return s +else: + text_type = str + + StringIO = io.StringIO + + def native(s, encoding='utf-8'): + if isinstance(s, bytes): + return s.decode(encoding) + return s + + +def urlsafe_b64encode(data): + """urlsafe_b64encode without padding""" + return base64.urlsafe_b64encode(data).rstrip(b'=') + + +def urlsafe_b64decode(data): + """urlsafe_b64decode without padding""" + pad = b'=' * (4 - (len(data) & 3)) + return base64.urlsafe_b64decode(data + pad) + + +def as_unicode(s): + if isinstance(s, bytes): + return s.decode('utf-8') + return s + + +def as_bytes(s): + if isinstance(s, text_type): + return s.encode('utf-8') + return s diff --git a/mongo_mac/lib/python3.6/site-packages/wheel/wheelfile.py b/mongo_mac/lib/python3.6/site-packages/wheel/wheelfile.py new file mode 100644 index 0000000..9a1c8d2 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/wheel/wheelfile.py @@ -0,0 +1,168 @@ +from __future__ import print_function + +import csv +import hashlib +import os.path +import re +import time +from collections import OrderedDict +from distutils import log as logger +from zipfile import ZIP_DEFLATED, ZipInfo, ZipFile + +from wheel.cli import WheelError +from wheel.util import urlsafe_b64decode, as_unicode, native, urlsafe_b64encode, as_bytes, StringIO + +# Non-greedy matching of an optional build number may be too clever (more +# invalid wheel filenames will match). Separate regex for .dist-info? +WHEEL_INFO_RE = re.compile( + r"""^(?P(?P.+?)-(?P.+?))(-(?P\d[^-]*))? + -(?P.+?)-(?P.+?)-(?P.+?)\.whl$""", + re.VERBOSE) + + +def get_zipinfo_datetime(timestamp=None): + # Some applications need reproducible .whl files, but they can't do this without forcing + # the timestamp of the individual ZipInfo objects. See issue #143. + timestamp = int(os.environ.get('SOURCE_DATE_EPOCH', timestamp or time.time())) + return time.gmtime(timestamp)[0:6] + + +class WheelFile(ZipFile): + """A ZipFile derivative class that also reads SHA-256 hashes from + .dist-info/RECORD and checks any read files against those. + """ + + _default_algorithm = hashlib.sha256 + + def __init__(self, file, mode='r'): + basename = os.path.basename(file) + self.parsed_filename = WHEEL_INFO_RE.match(basename) + if not basename.endswith('.whl') or self.parsed_filename is None: + raise WheelError("Bad wheel filename {!r}".format(basename)) + + ZipFile.__init__(self, file, mode, compression=ZIP_DEFLATED, allowZip64=True) + + self.dist_info_path = '{}.dist-info'.format(self.parsed_filename.group('namever')) + self.record_path = self.dist_info_path + '/RECORD' + self._file_hashes = OrderedDict() + self._file_sizes = {} + if mode == 'r': + # Ignore RECORD and any embedded wheel signatures + self._file_hashes[self.record_path] = None, None + self._file_hashes[self.record_path + '.jws'] = None, None + self._file_hashes[self.record_path + '.p7s'] = None, None + + # Fill in the expected hashes by reading them from RECORD + try: + record = self.open(self.record_path) + except KeyError: + raise WheelError('Missing {} file'.format(self.record_path)) + + with record: + for line in record: + line = line.decode('utf-8') + path, hash_sum, size = line.rsplit(u',', 2) + if hash_sum: + algorithm, hash_sum = hash_sum.split(u'=') + try: + hashlib.new(algorithm) + except ValueError: + raise WheelError('Unsupported hash algorithm: {}'.format(algorithm)) + + if algorithm.lower() in {'md5', 'sha1'}: + raise WheelError( + 'Weak hash algorithm ({}) is not permitted by PEP 427' + .format(algorithm)) + + self._file_hashes[path] = ( + algorithm, urlsafe_b64decode(hash_sum.encode('ascii'))) + + def open(self, name_or_info, mode="r", pwd=None): + def _update_crc(newdata, eof=None): + if eof is None: + eof = ef._eof + update_crc_orig(newdata) + else: # Python 2 + update_crc_orig(newdata, eof) + + running_hash.update(newdata) + if eof and running_hash.digest() != expected_hash: + raise WheelError("Hash mismatch for file '{}'".format(native(ef_name))) + + ef = ZipFile.open(self, name_or_info, mode, pwd) + ef_name = as_unicode(name_or_info.filename if isinstance(name_or_info, ZipInfo) + else name_or_info) + if mode == 'r' and not ef_name.endswith('/'): + if ef_name not in self._file_hashes: + raise WheelError("No hash found for file '{}'".format(native(ef_name))) + + algorithm, expected_hash = self._file_hashes[ef_name] + if expected_hash is not None: + # Monkey patch the _update_crc method to also check for the hash from RECORD + running_hash = hashlib.new(algorithm) + update_crc_orig, ef._update_crc = ef._update_crc, _update_crc + + return ef + + def write_files(self, base_dir): + logger.info("creating '%s' and adding '%s' to it", self.filename, base_dir) + deferred = [] + for root, dirnames, filenames in os.walk(base_dir): + # Sort the directory names so that `os.walk` will walk them in a + # defined order on the next iteration. + dirnames.sort() + for name in sorted(filenames): + path = os.path.normpath(os.path.join(root, name)) + if os.path.isfile(path): + arcname = os.path.relpath(path, base_dir) + if arcname == self.record_path: + pass + elif root.endswith('.dist-info'): + deferred.append((path, arcname)) + else: + self.write(path, arcname) + + deferred.sort() + for path, arcname in deferred: + self.write(path, arcname) + + def write(self, filename, arcname=None, compress_type=None): + with open(filename, 'rb') as f: + st = os.fstat(f.fileno()) + data = f.read() + + zinfo = ZipInfo(arcname or filename, date_time=get_zipinfo_datetime(st.st_mtime)) + zinfo.external_attr = st.st_mode << 16 + zinfo.compress_type = ZIP_DEFLATED + self.writestr(zinfo, data, compress_type) + + def writestr(self, zinfo_or_arcname, bytes, compress_type=None): + ZipFile.writestr(self, zinfo_or_arcname, bytes, compress_type) + fname = (zinfo_or_arcname.filename if isinstance(zinfo_or_arcname, ZipInfo) + else zinfo_or_arcname) + logger.info("adding '%s'", fname) + if fname != self.record_path: + hash_ = self._default_algorithm(bytes) + self._file_hashes[fname] = hash_.name, native(urlsafe_b64encode(hash_.digest())) + self._file_sizes[fname] = len(bytes) + + def close(self): + # Write RECORD + if self.fp is not None and self.mode == 'w' and self._file_hashes: + data = StringIO() + writer = csv.writer(data, delimiter=',', quotechar='"', lineterminator='\n') + writer.writerows(( + ( + fname, + algorithm + "=" + hash_, + self._file_sizes[fname] + ) + for fname, (algorithm, hash_) in self._file_hashes.items() + )) + writer.writerow((format(self.record_path), "", "")) + zinfo = ZipInfo(native(self.record_path), date_time=get_zipinfo_datetime()) + zinfo.compress_type = ZIP_DEFLATED + zinfo.external_attr = 0o664 << 16 + self.writestr(zinfo, as_bytes(data.getvalue())) + + ZipFile.close(self) diff --git a/mongo_mac/lib/python3.6/site.py b/mongo_mac/lib/python3.6/site.py new file mode 100644 index 0000000..7969769 --- /dev/null +++ b/mongo_mac/lib/python3.6/site.py @@ -0,0 +1,758 @@ +"""Append module search paths for third-party packages to sys.path. + +**************************************************************** +* This module is automatically imported during initialization. * +**************************************************************** + +In earlier versions of Python (up to 1.5a3), scripts or modules that +needed to use site-specific modules would place ``import site'' +somewhere near the top of their code. Because of the automatic +import, this is no longer necessary (but code that does it still +works). + +This will append site-specific paths to the module search path. On +Unix, it starts with sys.prefix and sys.exec_prefix (if different) and +appends lib/python/site-packages as well as lib/site-python. +It also supports the Debian convention of +lib/python/dist-packages. On other platforms (mainly Mac and +Windows), it uses just sys.prefix (and sys.exec_prefix, if different, +but this is unlikely). The resulting directories, if they exist, are +appended to sys.path, and also inspected for path configuration files. + +FOR DEBIAN, this sys.path is augmented with directories in /usr/local. +Local addons go into /usr/local/lib/python/site-packages +(resp. /usr/local/lib/site-python), Debian addons install into +/usr/{lib,share}/python/dist-packages. + +A path configuration file is a file whose name has the form +.pth; its contents are additional directories (one per line) +to be added to sys.path. Non-existing directories (or +non-directories) are never added to sys.path; no directory is added to +sys.path more than once. Blank lines and lines beginning with +'#' are skipped. Lines starting with 'import' are executed. + +For example, suppose sys.prefix and sys.exec_prefix are set to +/usr/local and there is a directory /usr/local/lib/python2.X/site-packages +with three subdirectories, foo, bar and spam, and two path +configuration files, foo.pth and bar.pth. Assume foo.pth contains the +following: + + # foo package configuration + foo + bar + bletch + +and bar.pth contains: + + # bar package configuration + bar + +Then the following directories are added to sys.path, in this order: + + /usr/local/lib/python2.X/site-packages/bar + /usr/local/lib/python2.X/site-packages/foo + +Note that bletch is omitted because it doesn't exist; bar precedes foo +because bar.pth comes alphabetically before foo.pth; and spam is +omitted because it is not mentioned in either path configuration file. + +After these path manipulations, an attempt is made to import a module +named sitecustomize, which can perform arbitrary additional +site-specific customizations. If this import fails with an +ImportError exception, it is silently ignored. + +""" + +import sys +import os +try: + import __builtin__ as builtins +except ImportError: + import builtins +try: + set +except NameError: + from sets import Set as set + +# Prefixes for site-packages; add additional prefixes like /usr/local here +PREFIXES = [sys.prefix, sys.exec_prefix] +# Enable per user site-packages directory +# set it to False to disable the feature or True to force the feature +ENABLE_USER_SITE = None +# for distutils.commands.install +USER_SITE = None +USER_BASE = None + +_is_64bit = (getattr(sys, 'maxsize', None) or getattr(sys, 'maxint')) > 2**32 +_is_pypy = hasattr(sys, 'pypy_version_info') +_is_jython = sys.platform[:4] == 'java' +if _is_jython: + ModuleType = type(os) + +def makepath(*paths): + dir = os.path.join(*paths) + if _is_jython and (dir == '__classpath__' or + dir.startswith('__pyclasspath__')): + return dir, dir + dir = os.path.abspath(dir) + return dir, os.path.normcase(dir) + +def abs__file__(): + """Set all module' __file__ attribute to an absolute path""" + for m in sys.modules.values(): + if ((_is_jython and not isinstance(m, ModuleType)) or + hasattr(m, '__loader__')): + # only modules need the abspath in Jython. and don't mess + # with a PEP 302-supplied __file__ + continue + f = getattr(m, '__file__', None) + if f is None: + continue + m.__file__ = os.path.abspath(f) + +def removeduppaths(): + """ Remove duplicate entries from sys.path along with making them + absolute""" + # This ensures that the initial path provided by the interpreter contains + # only absolute pathnames, even if we're running from the build directory. + L = [] + known_paths = set() + for dir in sys.path: + # Filter out duplicate paths (on case-insensitive file systems also + # if they only differ in case); turn relative paths into absolute + # paths. + dir, dircase = makepath(dir) + if not dircase in known_paths: + L.append(dir) + known_paths.add(dircase) + sys.path[:] = L + return known_paths + +# XXX This should not be part of site.py, since it is needed even when +# using the -S option for Python. See http://www.python.org/sf/586680 +def addbuilddir(): + """Append ./build/lib. in case we're running in the build dir + (especially for Guido :-)""" + from distutils.util import get_platform + s = "build/lib.%s-%.3s" % (get_platform(), sys.version) + if hasattr(sys, 'gettotalrefcount'): + s += '-pydebug' + s = os.path.join(os.path.dirname(sys.path[-1]), s) + sys.path.append(s) + +def _init_pathinfo(): + """Return a set containing all existing directory entries from sys.path""" + d = set() + for dir in sys.path: + try: + if os.path.isdir(dir): + dir, dircase = makepath(dir) + d.add(dircase) + except TypeError: + continue + return d + +def addpackage(sitedir, name, known_paths): + """Add a new path to known_paths by combining sitedir and 'name' or execute + sitedir if it starts with 'import'""" + if known_paths is None: + _init_pathinfo() + reset = 1 + else: + reset = 0 + fullname = os.path.join(sitedir, name) + try: + f = open(fullname, "rU") + except IOError: + return + try: + for line in f: + if line.startswith("#"): + continue + if line.startswith("import"): + exec(line) + continue + line = line.rstrip() + dir, dircase = makepath(sitedir, line) + if not dircase in known_paths and os.path.exists(dir): + sys.path.append(dir) + known_paths.add(dircase) + finally: + f.close() + if reset: + known_paths = None + return known_paths + +def addsitedir(sitedir, known_paths=None): + """Add 'sitedir' argument to sys.path if missing and handle .pth files in + 'sitedir'""" + if known_paths is None: + known_paths = _init_pathinfo() + reset = 1 + else: + reset = 0 + sitedir, sitedircase = makepath(sitedir) + if not sitedircase in known_paths: + sys.path.append(sitedir) # Add path component + try: + names = os.listdir(sitedir) + except os.error: + return + names.sort() + for name in names: + if name.endswith(os.extsep + "pth"): + addpackage(sitedir, name, known_paths) + if reset: + known_paths = None + return known_paths + +def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_prefix): + """Add site-packages (and possibly site-python) to sys.path""" + prefixes = [os.path.join(sys_prefix, "local"), sys_prefix] + if exec_prefix != sys_prefix: + prefixes.append(os.path.join(exec_prefix, "local")) + + for prefix in prefixes: + if prefix: + if sys.platform in ('os2emx', 'riscos') or _is_jython: + sitedirs = [os.path.join(prefix, "Lib", "site-packages")] + elif _is_pypy: + sitedirs = [os.path.join(prefix, 'site-packages')] + elif sys.platform == 'darwin' and prefix == sys_prefix: + + if prefix.startswith("/System/Library/Frameworks/"): # Apple's Python + + sitedirs = [os.path.join("/Library/Python", sys.version[:3], "site-packages"), + os.path.join(prefix, "Extras", "lib", "python")] + + else: # any other Python distros on OSX work this way + sitedirs = [os.path.join(prefix, "lib", + "python" + sys.version[:3], "site-packages")] + + elif os.sep == '/': + sitedirs = [os.path.join(prefix, + "lib", + "python" + sys.version[:3], + "site-packages"), + os.path.join(prefix, "lib", "site-python"), + os.path.join(prefix, "python" + sys.version[:3], "lib-dynload")] + lib64_dir = os.path.join(prefix, "lib64", "python" + sys.version[:3], "site-packages") + if (os.path.exists(lib64_dir) and + os.path.realpath(lib64_dir) not in [os.path.realpath(p) for p in sitedirs]): + if _is_64bit: + sitedirs.insert(0, lib64_dir) + else: + sitedirs.append(lib64_dir) + try: + # sys.getobjects only available in --with-pydebug build + sys.getobjects + sitedirs.insert(0, os.path.join(sitedirs[0], 'debug')) + except AttributeError: + pass + # Debian-specific dist-packages directories: + sitedirs.append(os.path.join(prefix, "local/lib", + "python" + sys.version[:3], + "dist-packages")) + if sys.version[0] == '2': + sitedirs.append(os.path.join(prefix, "lib", + "python" + sys.version[:3], + "dist-packages")) + else: + sitedirs.append(os.path.join(prefix, "lib", + "python" + sys.version[0], + "dist-packages")) + sitedirs.append(os.path.join(prefix, "lib", "dist-python")) + else: + sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")] + if sys.platform == 'darwin': + # for framework builds *only* we add the standard Apple + # locations. Currently only per-user, but /Library and + # /Network/Library could be added too + if 'Python.framework' in prefix: + home = os.environ.get('HOME') + if home: + sitedirs.append( + os.path.join(home, + 'Library', + 'Python', + sys.version[:3], + 'site-packages')) + for sitedir in sitedirs: + if os.path.isdir(sitedir): + addsitedir(sitedir, known_paths) + return None + +def check_enableusersite(): + """Check if user site directory is safe for inclusion + + The function tests for the command line flag (including environment var), + process uid/gid equal to effective uid/gid. + + None: Disabled for security reasons + False: Disabled by user (command line option) + True: Safe and enabled + """ + if hasattr(sys, 'flags') and getattr(sys.flags, 'no_user_site', False): + return False + + if hasattr(os, "getuid") and hasattr(os, "geteuid"): + # check process uid == effective uid + if os.geteuid() != os.getuid(): + return None + if hasattr(os, "getgid") and hasattr(os, "getegid"): + # check process gid == effective gid + if os.getegid() != os.getgid(): + return None + + return True + +def addusersitepackages(known_paths): + """Add a per user site-package to sys.path + + Each user has its own python directory with site-packages in the + home directory. + + USER_BASE is the root directory for all Python versions + + USER_SITE is the user specific site-packages directory + + USER_SITE/.. can be used for data. + """ + global USER_BASE, USER_SITE, ENABLE_USER_SITE + env_base = os.environ.get("PYTHONUSERBASE", None) + + def joinuser(*args): + return os.path.expanduser(os.path.join(*args)) + + #if sys.platform in ('os2emx', 'riscos'): + # # Don't know what to put here + # USER_BASE = '' + # USER_SITE = '' + if os.name == "nt": + base = os.environ.get("APPDATA") or "~" + if env_base: + USER_BASE = env_base + else: + USER_BASE = joinuser(base, "Python") + USER_SITE = os.path.join(USER_BASE, + "Python" + sys.version[0] + sys.version[2], + "site-packages") + else: + if env_base: + USER_BASE = env_base + else: + USER_BASE = joinuser("~", ".local") + USER_SITE = os.path.join(USER_BASE, "lib", + "python" + sys.version[:3], + "site-packages") + + if ENABLE_USER_SITE and os.path.isdir(USER_SITE): + addsitedir(USER_SITE, known_paths) + if ENABLE_USER_SITE: + for dist_libdir in ("lib", "local/lib"): + user_site = os.path.join(USER_BASE, dist_libdir, + "python" + sys.version[:3], + "dist-packages") + if os.path.isdir(user_site): + addsitedir(user_site, known_paths) + return known_paths + + + +def setBEGINLIBPATH(): + """The OS/2 EMX port has optional extension modules that do double duty + as DLLs (and must use the .DLL file extension) for other extensions. + The library search path needs to be amended so these will be found + during module import. Use BEGINLIBPATH so that these are at the start + of the library search path. + + """ + dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload") + libpath = os.environ['BEGINLIBPATH'].split(';') + if libpath[-1]: + libpath.append(dllpath) + else: + libpath[-1] = dllpath + os.environ['BEGINLIBPATH'] = ';'.join(libpath) + + +def setquit(): + """Define new built-ins 'quit' and 'exit'. + These are simply strings that display a hint on how to exit. + + """ + if os.sep == ':': + eof = 'Cmd-Q' + elif os.sep == '\\': + eof = 'Ctrl-Z plus Return' + else: + eof = 'Ctrl-D (i.e. EOF)' + + class Quitter(object): + def __init__(self, name): + self.name = name + def __repr__(self): + return 'Use %s() or %s to exit' % (self.name, eof) + def __call__(self, code=None): + # Shells like IDLE catch the SystemExit, but listen when their + # stdin wrapper is closed. + try: + sys.stdin.close() + except: + pass + raise SystemExit(code) + builtins.quit = Quitter('quit') + builtins.exit = Quitter('exit') + + +class _Printer(object): + """interactive prompt objects for printing the license text, a list of + contributors and the copyright notice.""" + + MAXLINES = 23 + + def __init__(self, name, data, files=(), dirs=()): + self.__name = name + self.__data = data + self.__files = files + self.__dirs = dirs + self.__lines = None + + def __setup(self): + if self.__lines: + return + data = None + for dir in self.__dirs: + for filename in self.__files: + filename = os.path.join(dir, filename) + try: + fp = open(filename, "rU") + data = fp.read() + fp.close() + break + except IOError: + pass + if data: + break + if not data: + data = self.__data + self.__lines = data.split('\n') + self.__linecnt = len(self.__lines) + + def __repr__(self): + self.__setup() + if len(self.__lines) <= self.MAXLINES: + return "\n".join(self.__lines) + else: + return "Type %s() to see the full %s text" % ((self.__name,)*2) + + def __call__(self): + self.__setup() + prompt = 'Hit Return for more, or q (and Return) to quit: ' + lineno = 0 + while 1: + try: + for i in range(lineno, lineno + self.MAXLINES): + print(self.__lines[i]) + except IndexError: + break + else: + lineno += self.MAXLINES + key = None + while key is None: + try: + key = raw_input(prompt) + except NameError: + key = input(prompt) + if key not in ('', 'q'): + key = None + if key == 'q': + break + +def setcopyright(): + """Set 'copyright' and 'credits' in __builtin__""" + builtins.copyright = _Printer("copyright", sys.copyright) + if _is_jython: + builtins.credits = _Printer( + "credits", + "Jython is maintained by the Jython developers (www.jython.org).") + elif _is_pypy: + builtins.credits = _Printer( + "credits", + "PyPy is maintained by the PyPy developers: http://pypy.org/") + else: + builtins.credits = _Printer("credits", """\ + Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands + for supporting Python development. See www.python.org for more information.""") + here = os.path.dirname(os.__file__) + builtins.license = _Printer( + "license", "See http://www.python.org/%.3s/license.html" % sys.version, + ["LICENSE.txt", "LICENSE"], + [os.path.join(here, os.pardir), here, os.curdir]) + + +class _Helper(object): + """Define the built-in 'help'. + This is a wrapper around pydoc.help (with a twist). + + """ + + def __repr__(self): + return "Type help() for interactive help, " \ + "or help(object) for help about object." + def __call__(self, *args, **kwds): + import pydoc + return pydoc.help(*args, **kwds) + +def sethelper(): + builtins.help = _Helper() + +def aliasmbcs(): + """On Windows, some default encodings are not provided by Python, + while they are always available as "mbcs" in each locale. Make + them usable by aliasing to "mbcs" in such a case.""" + if sys.platform == 'win32': + import locale, codecs + enc = locale.getdefaultlocale()[1] + if enc.startswith('cp'): # "cp***" ? + try: + codecs.lookup(enc) + except LookupError: + import encodings + encodings._cache[enc] = encodings._unknown + encodings.aliases.aliases[enc] = 'mbcs' + +def setencoding(): + """Set the string encoding used by the Unicode implementation. The + default is 'ascii', but if you're willing to experiment, you can + change this.""" + encoding = "ascii" # Default value set by _PyUnicode_Init() + if 0: + # Enable to support locale aware default string encodings. + import locale + loc = locale.getdefaultlocale() + if loc[1]: + encoding = loc[1] + if 0: + # Enable to switch off string to Unicode coercion and implicit + # Unicode to string conversion. + encoding = "undefined" + if encoding != "ascii": + # On Non-Unicode builds this will raise an AttributeError... + sys.setdefaultencoding(encoding) # Needs Python Unicode build ! + + +def execsitecustomize(): + """Run custom site specific code, if available.""" + try: + import sitecustomize + except ImportError: + pass + +def virtual_install_main_packages(): + f = open(os.path.join(os.path.dirname(__file__), 'orig-prefix.txt')) + sys.real_prefix = f.read().strip() + f.close() + pos = 2 + hardcoded_relative_dirs = [] + if sys.path[0] == '': + pos += 1 + if _is_jython: + paths = [os.path.join(sys.real_prefix, 'Lib')] + elif _is_pypy: + if sys.version_info > (3, 2): + cpyver = '%d' % sys.version_info[0] + elif sys.pypy_version_info >= (1, 5): + cpyver = '%d.%d' % sys.version_info[:2] + else: + cpyver = '%d.%d.%d' % sys.version_info[:3] + paths = [os.path.join(sys.real_prefix, 'lib_pypy'), + os.path.join(sys.real_prefix, 'lib-python', cpyver)] + if sys.pypy_version_info < (1, 9): + paths.insert(1, os.path.join(sys.real_prefix, + 'lib-python', 'modified-%s' % cpyver)) + hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below + # + # This is hardcoded in the Python executable, but relative to sys.prefix: + for path in paths[:]: + plat_path = os.path.join(path, 'plat-%s' % sys.platform) + if os.path.exists(plat_path): + paths.append(plat_path) + elif sys.platform == 'win32': + paths = [os.path.join(sys.real_prefix, 'Lib'), os.path.join(sys.real_prefix, 'DLLs')] + else: + paths = [os.path.join(sys.real_prefix, 'lib', 'python'+sys.version[:3])] + hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below + lib64_path = os.path.join(sys.real_prefix, 'lib64', 'python'+sys.version[:3]) + if os.path.exists(lib64_path): + if _is_64bit: + paths.insert(0, lib64_path) + else: + paths.append(lib64_path) + # This is hardcoded in the Python executable, but relative to + # sys.prefix. Debian change: we need to add the multiarch triplet + # here, which is where the real stuff lives. As per PEP 421, in + # Python 3.3+, this lives in sys.implementation, while in Python 2.7 + # it lives in sys. + try: + arch = getattr(sys, 'implementation', sys)._multiarch + except AttributeError: + # This is a non-multiarch aware Python. Fallback to the old way. + arch = sys.platform + plat_path = os.path.join(sys.real_prefix, 'lib', + 'python'+sys.version[:3], + 'plat-%s' % arch) + if os.path.exists(plat_path): + paths.append(plat_path) + # This is hardcoded in the Python executable, but + # relative to sys.prefix, so we have to fix up: + for path in list(paths): + tk_dir = os.path.join(path, 'lib-tk') + if os.path.exists(tk_dir): + paths.append(tk_dir) + + # These are hardcoded in the Apple's Python executable, + # but relative to sys.prefix, so we have to fix them up: + if sys.platform == 'darwin': + hardcoded_paths = [os.path.join(relative_dir, module) + for relative_dir in hardcoded_relative_dirs + for module in ('plat-darwin', 'plat-mac', 'plat-mac/lib-scriptpackages')] + + for path in hardcoded_paths: + if os.path.exists(path): + paths.append(path) + + sys.path.extend(paths) + +def force_global_eggs_after_local_site_packages(): + """ + Force easy_installed eggs in the global environment to get placed + in sys.path after all packages inside the virtualenv. This + maintains the "least surprise" result that packages in the + virtualenv always mask global packages, never the other way + around. + + """ + egginsert = getattr(sys, '__egginsert', 0) + for i, path in enumerate(sys.path): + if i > egginsert and path.startswith(sys.prefix): + egginsert = i + sys.__egginsert = egginsert + 1 + +def virtual_addsitepackages(known_paths): + force_global_eggs_after_local_site_packages() + return addsitepackages(known_paths, sys_prefix=sys.real_prefix) + +def fixclasspath(): + """Adjust the special classpath sys.path entries for Jython. These + entries should follow the base virtualenv lib directories. + """ + paths = [] + classpaths = [] + for path in sys.path: + if path == '__classpath__' or path.startswith('__pyclasspath__'): + classpaths.append(path) + else: + paths.append(path) + sys.path = paths + sys.path.extend(classpaths) + +def execusercustomize(): + """Run custom user specific code, if available.""" + try: + import usercustomize + except ImportError: + pass + + +def main(): + global ENABLE_USER_SITE + virtual_install_main_packages() + abs__file__() + paths_in_sys = removeduppaths() + if (os.name == "posix" and sys.path and + os.path.basename(sys.path[-1]) == "Modules"): + addbuilddir() + if _is_jython: + fixclasspath() + GLOBAL_SITE_PACKAGES = not os.path.exists(os.path.join(os.path.dirname(__file__), 'no-global-site-packages.txt')) + if not GLOBAL_SITE_PACKAGES: + ENABLE_USER_SITE = False + if ENABLE_USER_SITE is None: + ENABLE_USER_SITE = check_enableusersite() + paths_in_sys = addsitepackages(paths_in_sys) + paths_in_sys = addusersitepackages(paths_in_sys) + if GLOBAL_SITE_PACKAGES: + paths_in_sys = virtual_addsitepackages(paths_in_sys) + if sys.platform == 'os2emx': + setBEGINLIBPATH() + setquit() + setcopyright() + sethelper() + aliasmbcs() + setencoding() + execsitecustomize() + if ENABLE_USER_SITE: + execusercustomize() + # Remove sys.setdefaultencoding() so that users cannot change the + # encoding after initialization. The test for presence is needed when + # this module is run as a script, because this code is executed twice. + if hasattr(sys, "setdefaultencoding"): + del sys.setdefaultencoding + +main() + +def _script(): + help = """\ + %s [--user-base] [--user-site] + + Without arguments print some useful information + With arguments print the value of USER_BASE and/or USER_SITE separated + by '%s'. + + Exit codes with --user-base or --user-site: + 0 - user site directory is enabled + 1 - user site directory is disabled by user + 2 - uses site directory is disabled by super user + or for security reasons + >2 - unknown error + """ + args = sys.argv[1:] + if not args: + print("sys.path = [") + for dir in sys.path: + print(" %r," % (dir,)) + print("]") + def exists(path): + if os.path.isdir(path): + return "exists" + else: + return "doesn't exist" + print("USER_BASE: %r (%s)" % (USER_BASE, exists(USER_BASE))) + print("USER_SITE: %r (%s)" % (USER_SITE, exists(USER_BASE))) + print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE) + sys.exit(0) + + buffer = [] + if '--user-base' in args: + buffer.append(USER_BASE) + if '--user-site' in args: + buffer.append(USER_SITE) + + if buffer: + print(os.pathsep.join(buffer)) + if ENABLE_USER_SITE: + sys.exit(0) + elif ENABLE_USER_SITE is False: + sys.exit(1) + elif ENABLE_USER_SITE is None: + sys.exit(2) + else: + sys.exit(3) + else: + import textwrap + print(textwrap.dedent(help % (sys.argv[0], os.pathsep))) + sys.exit(10) + +if __name__ == '__main__': + _script() diff --git a/mongo_mac/lib/python3.6/sre_compile.py b/mongo_mac/lib/python3.6/sre_compile.py new file mode 120000 index 0000000..f9e8179 --- /dev/null +++ b/mongo_mac/lib/python3.6/sre_compile.py @@ -0,0 +1 @@ +/anaconda3/lib/python3.6/sre_compile.py \ No newline at end of file diff --git a/mongo_mac/lib/python3.6/sre_constants.py b/mongo_mac/lib/python3.6/sre_constants.py new file mode 120000 index 0000000..a50a256 --- /dev/null +++ b/mongo_mac/lib/python3.6/sre_constants.py @@ -0,0 +1 @@ +/anaconda3/lib/python3.6/sre_constants.py \ No newline at end of file diff --git a/mongo_mac/lib/python3.6/sre_parse.py b/mongo_mac/lib/python3.6/sre_parse.py new file mode 120000 index 0000000..51b92aa --- /dev/null +++ b/mongo_mac/lib/python3.6/sre_parse.py @@ -0,0 +1 @@ +/anaconda3/lib/python3.6/sre_parse.py \ No newline at end of file diff --git a/mongo_mac/lib/python3.6/stat.py b/mongo_mac/lib/python3.6/stat.py new file mode 120000 index 0000000..590057e --- /dev/null +++ b/mongo_mac/lib/python3.6/stat.py @@ -0,0 +1 @@ +/anaconda3/lib/python3.6/stat.py \ No newline at end of file diff --git a/mongo_mac/lib/python3.6/struct.py b/mongo_mac/lib/python3.6/struct.py new file mode 120000 index 0000000..d3dfb8e --- /dev/null +++ b/mongo_mac/lib/python3.6/struct.py @@ -0,0 +1 @@ +/anaconda3/lib/python3.6/struct.py \ No newline at end of file diff --git a/mongo_mac/lib/python3.6/tarfile.py b/mongo_mac/lib/python3.6/tarfile.py new file mode 120000 index 0000000..3e64ab8 --- /dev/null +++ b/mongo_mac/lib/python3.6/tarfile.py @@ -0,0 +1 @@ +/anaconda3/lib/python3.6/tarfile.py \ No newline at end of file diff --git a/mongo_mac/lib/python3.6/tempfile.py b/mongo_mac/lib/python3.6/tempfile.py new file mode 120000 index 0000000..ecd9357 --- /dev/null +++ b/mongo_mac/lib/python3.6/tempfile.py @@ -0,0 +1 @@ +/anaconda3/lib/python3.6/tempfile.py \ No newline at end of file diff --git a/mongo_mac/lib/python3.6/token.py b/mongo_mac/lib/python3.6/token.py new file mode 120000 index 0000000..c8cff36 --- /dev/null +++ b/mongo_mac/lib/python3.6/token.py @@ -0,0 +1 @@ +/anaconda3/lib/python3.6/token.py \ No newline at end of file diff --git a/mongo_mac/lib/python3.6/tokenize.py b/mongo_mac/lib/python3.6/tokenize.py new file mode 120000 index 0000000..b6680df --- /dev/null +++ b/mongo_mac/lib/python3.6/tokenize.py @@ -0,0 +1 @@ +/anaconda3/lib/python3.6/tokenize.py \ No newline at end of file diff --git a/mongo_mac/lib/python3.6/types.py b/mongo_mac/lib/python3.6/types.py new file mode 120000 index 0000000..6943adf --- /dev/null +++ b/mongo_mac/lib/python3.6/types.py @@ -0,0 +1 @@ +/anaconda3/lib/python3.6/types.py \ No newline at end of file diff --git a/mongo_mac/lib/python3.6/warnings.py b/mongo_mac/lib/python3.6/warnings.py new file mode 120000 index 0000000..214e189 --- /dev/null +++ b/mongo_mac/lib/python3.6/warnings.py @@ -0,0 +1 @@ +/anaconda3/lib/python3.6/warnings.py \ No newline at end of file diff --git a/mongo_mac/lib/python3.6/weakref.py b/mongo_mac/lib/python3.6/weakref.py new file mode 120000 index 0000000..cd35fa9 --- /dev/null +++ b/mongo_mac/lib/python3.6/weakref.py @@ -0,0 +1 @@ +/anaconda3/lib/python3.6/weakref.py \ No newline at end of file diff --git a/mongo_mac/pip-selfcheck.json b/mongo_mac/pip-selfcheck.json new file mode 100644 index 0000000..003fb7b --- /dev/null +++ b/mongo_mac/pip-selfcheck.json @@ -0,0 +1 @@ +{"last_check":"2019-04-30T01:12:08Z","pypi_version":"19.1"} \ No newline at end of file

    r?OyzdHrT{OL-;k>8pW9QhS8;?7FJG2CS-I6r@a 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 (3, 2): + valid_opts.insert(-1, 'extension-suffix') + valid_opts.append('abiflags') +if sys.version_info >= (3, 3): + valid_opts.append('configdir') + + +def exit_with_usage(code=1): + sys.stderr.write("Usage: {0} [{1}]\n".format( + sys.argv[0], '|'.join('--'+opt for opt in valid_opts))) + sys.exit(code) + +try: + opts, args = getopt.getopt(sys.argv[1:], '', valid_opts) +except getopt.error: + exit_with_usage() + +if not opts: + exit_with_usage() + +pyver = sysconfig.get_config_var('VERSION') +getvar = sysconfig.get_config_var + +opt_flags = [flag for (flag, val) in opts] + +if '--help' in opt_flags: + exit_with_usage(code=0) + +for opt in opt_flags: + if opt == '--prefix': + print(sysconfig.get_config_var('prefix')) + + elif opt == '--exec-prefix': + print(sysconfig.get_config_var('exec_prefix')) + + elif opt in ('--includes', '--cflags'): + flags = ['-I' + sysconfig.get_path('include'), + '-I' + sysconfig.get_path('platinclude')] + if opt == '--cflags': + flags.extend(getvar('CFLAGS').split()) + print(' '.join(flags)) + + elif opt in ('--libs', '--ldflags'): + abiflags = getattr(sys, 'abiflags', '') + libs = ['-lpython' + pyver + abiflags] + libs += getvar('LIBS').split() + libs += getvar('SYSLIBS').split() + # add the prefix/lib/pythonX.Y/config dir, but only if there is no + # shared library in prefix/lib/. + if opt == '--ldflags': + if not getvar('Py_ENABLE_SHARED'): + libs.insert(0, '-L' + getvar('LIBPL')) + if not getvar('PYTHONFRAMEWORK'): + libs.extend(getvar('LINKFORSHARED').split()) + print(' '.join(libs)) + + elif opt == '--extension-suffix': + ext_suffix = sysconfig.get_config_var('EXT_SUFFIX') + if ext_suffix is None: + ext_suffix = sysconfig.get_config_var('SO') + print(ext_suffix) + + elif opt == '--abiflags': + if not getattr(sys, 'abiflags', None): + exit_with_usage() + print(sys.abiflags) + + elif opt == '--configdir': + print(sysconfig.get_config_var('LIBPL')) diff --git a/mongo_mac/bin/python3 b/mongo_mac/bin/python3 new file mode 120000 index 0000000..d8654aa --- /dev/null +++ b/mongo_mac/bin/python3 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/mongo_mac/bin/python3.6 b/mongo_mac/bin/python3.6 new file mode 120000 index 0000000..d8654aa --- /dev/null +++ b/mongo_mac/bin/python3.6 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/mongo_mac/bin/wheel b/mongo_mac/bin/wheel new file mode 100755 index 0000000..24bf023 --- /dev/null +++ b/mongo_mac/bin/wheel @@ -0,0 +1,11 @@ +#!/Users/raopg/Documents/Dev/learn-mongoDB/mongo_mac/bin/python + +# -*- coding: utf-8 -*- +import re +import sys + +from wheel.cli import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/mongo_mac/include/python3.6m b/mongo_mac/include/python3.6m new file mode 120000 index 0000000..3096069 --- /dev/null +++ b/mongo_mac/include/python3.6m @@ -0,0 +1 @@ +/anaconda3/include/python3.6m \ No newline at end of file diff --git a/mongo_mac/lib/python3.6/__future__.py b/mongo_mac/lib/python3.6/__future__.py new file mode 120000 index 0000000..49a0b6a --- /dev/null +++ b/mongo_mac/lib/python3.6/__future__.py @@ -0,0 +1 @@ +/anaconda3/lib/python3.6/__future__.py \ No newline at end of file diff --git a/mongo_mac/lib/python3.6/__pycache__/__future__.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/__future__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5072dd4c3ef8a7ee0be0e20bbce639f34a16b574 GIT binary patch literal 4213 zcmbtX>vG%16$US&NLV+^c9OPkv!Rn#Y-!S$X@AsdYgwXFc4*Q=QqBa^31*31lJI~4 zvj8PaqnUQb>BIC1`UZUn{OvEjLVxu;OM(|k?l>(t*ge?G*>n5OSw7v|H2?C4Z>`H+ z!}yo6^b|lp#~c0=jW8@jq(oX|L{_YcoLComQ5Y1glrRS=nflnU(&Cnt5gS%kY+7q# z%gTvuYhCPEd2!n+h+WGRcdT1q8RD+E_q`$Ry-QmgazlJ3iZb&qV{L+dAU>B_&|9Ft z5I>h|ptnK)LhQ*L=pE1{@k_Z5`ZnlaiL%Ut-UapQ_{%pq&Lw@c}EAil%uwluDMF4$&iuC+V$RH3iLf+x9664pK$O*e&DEhmfm5!= z37yF!HsmJ~evjChj9B0}6Q!gmn^#w}F@{|yno4?A#;N$zuw|#N=dm92LI8}pijs&( zfItB7Ak(!Y5?de`r=s^~9KnpDiI^pDNtit|VW*im&>r)O@qQ$g)~?J(ftVmFp&|1E zz)vw>O7Y<~jRH1-tQw&+X>j0o6B!Z`%d9tv*odDoC-5WJpJ3&5LpTA%r%ocoU(=QL za4!sCDAo*oU~eS3k9eATg|jg<^rc{l4F*AE3KfjUGv9_0_Z=t(&pI9tLzbk8sYj#J z05ZXs;W$9_g6~L1!$5>(voes;l`z~ZX)x2wRY~_s5Pv0MAZL*|_IhsAccmvvtWSAF zM^iWqCLXc^IV(gqBpgq(+eAe}ldHjGB>jl2M8my_>%nZSKk*&1Cq&kn3G!ft^f@Ka zRok25%;zK5p){2&7a)YJFxDMHI4uqO5J_<%L1o5T*)(tR2Blwi0;o~tpploMqa#i>PABwN=1^)9&bTtKSCCnnmgW^_%4~w_FO;)@fdIQxKd{}5ACDI z@lhk*njZu z4a;bxf$~p<9~Xn~4HSP|4$$ih0{S(&B%sfU0!ptL=aX=Eve--y^~CW2Z}<_Ki`0c- z8y9J`sf!HSv@ozY)huP=d@!q|abc9y&v8%nQlZ6|AI1=iY`Z<&oKGQr;s zg;N*!;J%G&Ea=`J262eS>dE;77z9GYFp5j3*(K}{rqoji3$S5 z-B@c7-2|W{k)xhaP9FH~xz0MtZ9>Bg3wcuY%Sl@PuT{S?zm}9zY70`KyNyoUZQ9(y zXS{noL3J@6l6Q^V`A_D0UtjkD7Wl`^0yosKW!;yG*xcQK@Be867)q6y+n@7UPHt4c zXDJ?QLR}YDY_<*k-(#~oH>B=A&yBWzet+3$S9AP|)z+{}$IT}oL@J`#0g~PTM{hFy z%sX7qfueL%ZIUzqiIQWb-Kj`EjfM9JiBP7+wk@%67Rvclb~TizE1IQsihRm2wjGMk95j~ar!BAJ)Mi2$i6rnIn45MdroK9yg~=konAso9|BXUS(WrRVk3r^%xCOc9f0 ziY05+X9<-|U13O{m|ASO`K)5XMrko-XZ>%xv;+@U8PchVgjc3MP{JR)OAEiSyw+>^ ztj}+hQ14n;W7%JN>Wdq8eH5?Twg?=Au8C>-q7rCZ1yuWHt<$X?T6aNyRcqGT`(6Aq z*>5yjUt@F^qesWx<95wHtiP_){~PN^i?RI|omS(xTeIsgU$xp@>yyRQ*Y)ln?M`>U zTYFh+uFSk@*PC5%Z60)q-H#W0j+^y^)*=4K)Vq+Q(Xl>W%)Quex4*IXJNApiqsH<< z3!yvR)+-GMMMzMD2}KA{R8|$mzoPh86#9xVqzDN&K`qXIImPPlA7MrKEt+g5om&0n VGG;Cd`djfyND;lL7g50-9ccA2G}Y2HjFOE4zl zm+{+p?$r}t!IN*=1wAnBd-JF7-|siC+bb*nw>O_h4?2YWCjX6PT)#!p3>70I!YFex zI->RLj2up9ty!D3t|)A>CDvi?4?60|ow?7QnM=tBA|JO2@1FTEq{KeVXWho?6OqA3 z!j_rW?3r^!dcno7-7ptYk-NXg!{C!}ugAGt(UPXcaIOBSX#pCjl3o{v1ZfnuCrY zQN=VGsI<(vG&&maFHy!5kXyNuQ#E)O)pMLDX_Sd^RLsq(lH2{~Q9M>^5wu^-tNWN4 z8J=)Jy0}ExLQZXKXp4YQ@KE0(vuC%+?%@V|g=FL_y`(dGNv>#(4;J{`ruI5S&jD;e z0!vm|D2?jcl})jZqT8rQ%cFPa>*L2u5)kbh@|_wwb5O85ZT5h`hH1|_jGj5L!5n*r zwX_Z@mnDF=bI~~-zTbM$bF0-|jT9Q8R5D!*=S zeJ;#tO$OMe!9tAzF)j^n3jN1gy|UC*-mB)9d2Pwn_D0%{M?EK?LCe7!R_U7i7jPx~ A!2kdN literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/_collections_abc.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/_collections_abc.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bec1e1026dbaf21a366fb1bf7b4b96c40bdaa3c GIT binary patch literal 28889 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 Oa;P7v@Y4VN+i literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/_weakrefset.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/_weakrefset.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..545095ebb67ada82067dfc0244b030531fc5a434 GIT binary patch literal 7874 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 Kr`@7Ad-6Yk5WkQB literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/abc.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/abc.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c12777fc578aed74111c5ecc8adc80a076615a2d GIT binary patch literal 7534 zcmdT}&2!tv6~`AzkfJEXc3r3W7$i+9F_o#Lo+hd5xUuCp$-#2QcH$|gDGXs(5-1R$ zc0ozxP}7;xGwCHg^wLYGr(AOFU(o5P$DDEKrKj}PYkKMLEeMd5WoOdPWLj{r!0x_% z`>^k0e{Xqdak2KRpZ&7^*B3PH@7l~&!u#8}z?G!M(9b&rL%hN`i5*ep6|zk1<{U^#LfrreBfMq z?X{n@zJ$P9Q%@`Rxwm(hC%#S%xaeu%-oPzuD40IdTy3ObD#QC5y01BmgQb_m!U-Z4 z_+CQXyki-V2Lj?GyIz8VJLva(lFpj=U__os>xH*NJk*rD{ zZm&75R_g>SVu#l3TVWLETsM&U;B2hxHuZL8yC3=SR_Aj~Sg?$*-d+Dtav|4+7x#A7 zZ^VAT%cDfD-{1%9A@@Xdu^UG_@r~>2>gjepe?1Jg)_Vh3NOY<7`ntE}w|axLF+W+A zY>#Hpmdm;*MBUENt@@#Sl71DRm0aAJ zfh**SjQ0eGGjrB*pjT&Qj^HpzcIU@upNpaJFz&I5`S=t(=%Odxq%CtyJ>xhslsBGSAnu4g(l5&*PhWSN70+TaRi)=Qv$;-U0ki$5uuB!xdU1fxVVz3~K zc@=kNHF{YeK6}b%whG1-nk4eN+;!8M>vm(-59z(`y8C@Eob*&&m&HCNBI(o|>EdK| zpNC;C0aw@THM8I>?`+tE3Q^CI;9n8@F&j5s6RZsN3oJfI$$KV6S;NGs< zE4G6Opw4pyLjT1$3I|Tk;it|Z?gQ*Zz*#cJwnC&i<)H|Y44CDHRE(QoC<0F_A#lTr zvkeSIcq->iz!Q5eLSG#H2Z)JK(GE|JCZAY99)dq~QNPUl*PH_{?DOX3N63zxw~8%4 zmu!{zuBp+@49XSTY)*1|bei^3WO9m8lg(AF`1}UD*(^Oi4iw%$vp1fFH{T++rcV1A z>_yZv=lO79b;+A}ob>!zM3rSS?J{dHn^hkI60#awKrUjlI$OlEsxVg#v0^E$On|Ew z00-PEP(QSq83iHcYdQWtC3Pu~6bGV)(P2#{i332F55r4fRuQETlq;wgWp+U2vcIK3 z0%vLk88Q$*2?uMSX9Uk-n?9j`vfyrTbTNoB+zm!QpEX{=cLJarp}6!T!9$ft_;G~! zF?}`(axH!Uo?HDOObT9{k}phG3{y-Xt(te`AP@B8JH}YMp^f$9^3lzaaYOs~>T%`h&BPp4 zn3-5(ZET|L2gf>EN+aYQWAoU?yUi?C8k^$!sN6w2VcY%d_qF}jeJv@E%42<0aw~~F z*6^%Op0&wyA*pv3(cT!9;5FsVA`>U4B+>7Z=njfqWZ@rQ_=Rz-9~+4_G8iB=CbdTT z?~Hv5gAD}+Zc2~9)`S0(`c z;>3G_KO%nUx~(f=3>Yr2wu%AiS+~eBGwsR=Siad@QZOh5gjS=|65@VWitm7ZYGTIJ z^cYL4NcM+3LS1|hJ%SPjU~Hs?Ze|2x0DMkW-}84lCZzX>@4#>lc-ANguB1<^o*=?E z227ci>&N{FzMDRC${-ghzJ!%Ft8J@`v`KsyOxmR_9H7XwO3NjCp3l?r-k~RUWNLz@ zUCs9_nOa0CE@053!0s8eKEy4bMWN~Ejj~=hYWg|7j^7!*X4rc68!nw#qwmpc_u-sJJx?qCI~Yg8^RgscQw>Nf!dD}iy72E(mJJ1IWxwjVrd=K=`tMt>1wi1l_DhI2bLSr-JN8d>;iIX9bVc&WD`vk<`wG{XNJe z0cWjLgA!}HWs*AUdP5&B=gQ29Hw$%=Q&DE9)EVI=QO9Z&hdRc#aUQB;#-}(lM7x=o z9c$WhbTuh~s@$m{`sj#0YsbdOfHJMIE-oiksNEPF$0kOWR79KMwtx9PP934_%5dcd z-|Fu;yF5g&B%Sp{5M_}bVgtp|J|_mPVSR&+<}N!g%ht;hk;K{#LOxu2KRRel{E7P7 zCFN7Y^26=fNeSDA5FLr(>IpfUCoFOfcWv5So1 zu+TzjxNyz5apscS?`rE%5`%iM!fX*=nzHF=}W5nh*V_eQ)r0Tzr!Pb)Du_#j1Eb2S=w-|SUa4< zWDYjrHM0lg1Dn=|qS>p;;X$X=a%`Pz6&e@s2P%eEPBC7uqMzg+IdWu$1sI4ccsw-tn#{M#tRK z#2W4TH~=qE9Zx-KDB2QeFO%lUH%Sp>J4t1)Dn^Now<pPi)I|LneY^a@&+2*H5XQnVIm zzj%c9i~A&ZAq9O0HiVPbnH$n-{!&;cZR=eT!?>1(Qv3;>lOZX^r^{1&+>K+HW7^n^ zllOD{$C-GAv}|p~ahNu);g1VJ;86wfEJ_n%$b$AoqHIhVa-a<)L&~O=6&dkf+Y+=> zTaxy4a`36ODoAStz*!IgO6~mULLDb$p}L+0Y7K?_)O*BW(U0| literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/base64.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/base64.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3007939ab3972ffeb98d59faf5ce3ebf4bf82f2e GIT binary patch literal 17181 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 EH;E<%umAu6 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/bisect.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/bisect.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2d2d3c20a867361e891f772fcd2ceae25196746 GIT binary patch literal 2722 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 R2(U57F-^02w9M+4{tLX8KOX=9 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/copyreg.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/copyreg.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc853237647d7d5feec2583d5e5f7e9069e91358 GIT binary patch literal 4290 zcmZu!&u`qu6()yVE=8?mS(ardc3UQ}TQ6WsZes*J*o~dYt%0_x;W(AEKuuGe*%h@E zxt^J|v;qYKQ4T%j&})Mnf*#sSPd*nt^wd9rr=mRt=wHx_`@P}rYOQ3Y84hRO%zN{G zeDCqSg@xed2TwcECCmDcHS=p>d>2jq6&<%a7PmR$4tIH@*XY=()nWW?-sJY@cE{m9 zXP;XgcjSwPZEackifak4AIJ^cqQ6hAeD#UN=Xe0Brf@_Jp^qn$D5 zW13J62ZKUtvu%7(k%xLT5Gv%No92RtX&!uZJqbZMSNs7JVg_xN+pJXDIClgT;Cp%&@abPI=(UaOoXzDsT zZI$-1t(LUS@%+p#ZOuySwpB82_2=X@?Ud};hAk}Uj%^-Zk%B{(6gTV+b2Cuk-cadq zTZBoRW$|_<+HU1f#?{N`i1lRJwu zmye3=zgTh(TmJXU^-rKQwJzgg&|BXqlHs1nwOZd0FV^Y)`Hj6I?-d&#uA67H7bojk zy1hOa>762fZ|(i{q!^5(=&hl*aUwai3eZ`$Pk*j&Cp1q#dXk_I?G^M)8x%PnD%#MrgbSQme=j=kA- zs%BE`4Ki_1xl+Vg<)(Xa5A5vZ6sKx&tm`rTyTp{PY1xuapLz@lGUa<4FYpkn@5>c! zxF6d`PJX4dNfLMpJ902)SYv%h{*=Zgc@VR$(izJr=W$BajG|oZM^WWRQJSYZir_U) zlBvqwj+Lky2oWtR2YULJ=#dmNx^Ck*MHVD|wOGrhKY0P~-;nLTA(u(a)i5CSpG7m) z{4WM29KVnK+WO2sxK1kFWgFJ-E*~*+eGbv(YRPt8-M9-kk*g1_=c`+m_KsM|vg0r58%K^tw*0Qi zxEhXE(!7VIp3ugCQ3O=T3HX2ywafALVzqb=FeeE{YGeR2!vX#P$Jmnv4R&G`Yb_YMr@|`^16CiHQvc&P&mu?UB7r@)*raZvv*3G+_NwhM7vAWx0B`V0 zo7psK**>dBOU$!fJ7AJPcpBtn916BypeYJN_z7AUu>2MKf*=?{ZcB3DHk0S@kmUW} z7K~yGhK!;uEKlP42FBC4CN|T!UdGETtCD?T6SKpY09qbyk0$IY$uU*B7JxLh>6XlS02WXw!xh*9enBBDi%nS~Ghlmvv4q zTY3F`vd-yCFHD6H2T|0S-rJSybngkA69^L`7y$S;26XRTll_jMX3miHE|$1`&pI-> zkUPgrUCX~Z_!5*3py3ZksC5wFR^O91>B*h900G)99o+z2JVB5n;1706qJDPdmM)(I zZT|e}^QWb|>v8Ycmai~s(g>jPir`{*jyC}mjj|#C4BQO3Up6Ro2}W$|`QK=+bj|qb z?0Cz1esjwLNC1JOd4NP~T2}!W=qBwT{v)pcNa&%=!#K=Rq-$7>!aJn+QKoi@!(RGA z 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/fnmatch.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/fnmatch.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7656c74ae1581d49fe3adf1ebb14d8e32735868a GIT binary patch literal 2920 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/genericpath.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/genericpath.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbd708fd9b13fe13f0d1bd30cec9919ac5e02045 GIT binary patch literal 3772 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/hmac.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/hmac.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b139f666eefb02b41a398a24c16547a182dd2094 GIT binary patch literal 4882 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 rwTHlBXbG4p9V+@sh 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 Q6q=qJ)WfCl_3+*Q11Dj<+5i9m literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/locale.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/locale.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..325a916ffcffc6765caf2e15670b3575d08b7551 GIT binary patch literal 33061 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/ntpath.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/ntpath.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62d0e4caa34cb169d92819b2bfe6422c1e28afed GIT binary patch literal 13711 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/operator.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/operator.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8b906446b405a83811885ceeade6d800e1f506e GIT binary patch literal 13959 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/os.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/os.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c1894e41720496738905d725b2aaae02f573f04 GIT binary patch literal 29674 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/posixpath.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/posixpath.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b858d1054ed4d55e8bfab30f14060133e043d8be GIT binary patch literal 10435 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/random.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/random.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1bca2ad60fa2c22d98723b1600c1ff3287d5a9ea GIT binary patch literal 19288 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 b`M_Zm&8%^TtoY?~xniz3UNnlCiQIn!t6fF- literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/reprlib.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/reprlib.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0fbbce0f6ce3f884154fad3f25d24aa21ac53832 GIT binary patch literal 5446 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 N=Zxx0jm)b!{GT(ukaGY4 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/shutil.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/shutil.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2f6ce9b9e06bb0366b64b45439a01e1b0032fef GIT binary patch literal 30431 zcmd6Q3vgW5dEUKupI9s&1SyK5B@d58P*ek{p5Jdn3oD!#vnyd!;izmnt~v3bYQ zhfHI1d8{<%I(<36WpjF^vA&$y#`yA%(hkYF*Yx!@R~M7KJ4{}cQ+YL{3Tjvt)rcBZ zV`^OOP!npW+NEw#yVZ?qkGe_iRX3|!)U9ftx^4cZ(!`UF^40jujv5bkZly}Q@O-~@O+n=!t+#c6Uy&Ze@or1 zaxc53o7Fw);LA?w7L`)>zV50Sm4DeQ-D;l>sUbY=3vLTsb>EhU@%@2)^A2?wZ~SIn z-H(`4@@@J9s(|#{?bAEeFrFsu(}Svrr#sX`>SmPKuhPm3?ojDkT0N{r(3d;a_o+wl z<}UT9I)d-1z+F6mPYR!DeC}RIBfMwHea&mVgxEoR?p?~-C+3=2%9akPA5ia7W2o=G z;81X1`5o#p^={O5IJl$cs>jtR-rTQ_swa^4fI6m*0N@sPTz zo>uQg>|u2(cu2i6@2c5as_vG)FUY@^(rKi93~8rpso?w6nIlf{@VukmCr@YbG>klZ zk>_tC&v{9G7O5jhy$`7$N9yyEdf|wpUQoNx_9N<5^?r2&T6|P}K4c2smsLY8&wG;VbS)j6knwN?-%?H0vTx4In|Ku8Rx9d~ee=A$ z;YhR!(dJ3@nrf@P=-rb7Ijex2v_2C|EWSrw-f~?h$Sgjk*3|lzS9)4)1Wzx%x9q46 zzE9!%L->9M-(7VXbv9lf^|Cx=PH5fI(fGNQpjxjq zPNHU$GIU}+sG4YTxv~_L&3pvWPV_5&C}TX!m3A22sDt@>*belzH_=V2&Fj6IU`4CV zl}dFfsb_bRdEiB~r>~m9H>373?%r5^zS+`2d8N`ucbXw4V4=0vj52Er_3A>jgN@?F za=lq;l*4)_h(^v;mV;#ARjxq%=OXerK4B3-;DEe2By9j8PmdsJb~+X1%VjJ~P%cM> zav4jo+F-m`E?-)$G|ZbHceIb(5`6pVL(hhR4iD){Yi0h>@m6(pIcT=SL&t;5hZ;de zH}73;HRoH$pExAn<>gBCP@_I~Xl0|l&}!a4^WdRyVHMCjv$7$5cnCFz9)i4k?Y@uW zU9ayT$=m`deG8I1?>t+nhk^3f7J{a4VU)nHg0PJl;?BTE2n2{jj8gW(%Lt7&b@ehX(XzXuc_1@wsryU#YJI({CQF zp5&0G(iXfecQw!6n4`wp<;EzgDR?!nZS|{TRZN$&ftF=Qp?u z>khc(Y6>y_A?|SB9>XVOp7niQXVK|;TkdA6n+hk+I9+$q?WRaUFL}>{$0p+Gyo(s! z7rIf?t!07RdmHtozz0nLdGc$auKL&>Bol)#RM?)K_M$Ww2^dk=+re}?O0xh$ye(xL zL36&nP)g0M*7_h^fSVmY#m*KGIG*Pg+_dYtRStrG{3fE50bM|(?X=xR;L9yf-?uT! z_+qMyL2Us8rJZ&f%>GQwKA&?gNbbdqqcl+eg1#H=N4eAI3<=AFCM;JgVG!jib0ITe8d4l~3ZvdO&}gU}SAHI~ zgxu7QSHw_9@t;jixcYvifG&^KT8&0)tsHJFH|ou$P^QAgyBt0{@R6zb6-3&O8Mxlt zhK#i6nWruHio1S_@pX2iqfEN2RvBPu{he zLEKeo#K$+Y?a^+gn`ItATjqVvSu9E~)+PL9J3o1B5dJK*VIIN25XU}M1D`W6FTlPA z^9F65}Lu9)M01TU#mA7L@QN*EHQSy2`-}|2%p=4Ta^qJ z0l}}g{gqZ7v=qQ^yVAMsL$~WqY12fu)3VO4i+6?>O=o&IKl1cki09lCU zK6wu)(iiY9i%-tHZ$i#H=X9~v0mYeay6d*Hi}`M5aR?h2uq6ygy7Mi8BTkn;SI43W zGJAW#bdUffJI@D~LYCVA9s#8$tKMohHUyyXJO{4Zzlatt%BzcjSi}GkaV0YXyB8bP z1@wwQ!5S-`$J7F;01aFKNLt{FvZkh4@}Q`3 zx*(t6g+MM3uAN?52R|YMYsj zy9hL>F(Y-RfP4TzU6%+*Qc&mf&ZSw~%Fo$W_SshQNlPiT^!Y2u`vO{v+qyJ+0cC-@ zgj#fdT0kvWZwF0?%YrS!4Iq+bpTn-tft#}MXTSr*Q=r2xB$3+b%Yhbx3HA%~Ma0u9 z+m{c>@8UM>C+MYCX@o%^ysn9a2+S5kY+oJIt{{Qg=^+C!C$Itr)no##o2@8!V)pd; zbI+bBF>?Iq`J*LDi?W8Ld>F?vC(fKW`^=khONNLpj9kcqj76EtmBuQ>QMMuh!3NR{ z5vJw;~^|axErzEt|ntpWfuOC6ClDljZa97qa2V9cUGz=15(lR zVU%53jzV1QWlz!QJ1;Dv-kYGycy5+X+ zwsGLHBJfr>r62#OQ-j7&Wna#3rkh21%9*EbTIE3>fwj~S06atR0>;V!gMrqn0%<3n zv-sp{pt#C=HRU=RyYX&V-esjE(k#`^V{3dVrrOkEwuibIRTQ1t{tavvHDc>5^p!jV za35YOK<_pQfX`uD9bUg%jbqFBoB8%oyV%VG-~N6#w^(eCn5QK?pK&hz{_~FA1elf0 z+)FvL;Xu*BUBoR22f3s3YqA|Gpsd6qpsBT%e;`4`Aj9qYGGKMteAOD2`EdIB=$Z7l zwL(#`((sx2+8aP5ub|zx1+I;<1d&$FHHJcGSfcLRsVQ2POp*VypW`K2rrh~oI??&*ZuIjT${Te=D z9)SaHgCc=YF^j{Z40ILCfuU)6utx$-QLegRB83yD&lp^GMpI@&b6hSHA2aBWe3YS= zLLQIvkyJ4nMtuUSW$1bMAP~!kowKd>Q_CxjfV!2y2(LnI^|LHZwoRX8ATvPR1zbDG zf|bDTaVBJpLRhIfgN7}&wy+VUfQV(u;yK~UX|nx4g-^&ib#mkBeQw$t%@nian3@SU z4}`hf9Uac%$#eH0rQq&$v)-;Ak|WHLwL6AS_ymF;64R3sPhl~Mw$$l7?!onI@-& zT{Q?t+wh9!PWc^tj1*lg5+d-Q@Lnmr`zwcl&KrZvzYX`xq`oy2$n5m3`OKujyno|B z;TnskKZrTiWd;`+$YOD?e#gZk&+(`Dn8hk2i-jcli^&Wt3#sA}o&sD6I1FH2Y`#?I zlP9f>0ecG67OFDtl~t-;E1{?tnQX&l6ENANF!iogY{}-6>=8EWTT{D?@2B=6+*BG;q%U>x4!Qx z^l>ll2E*hnibjU)!xofMP(l@+ciKqb;=o*}#GsiR!22|EDv>sd5`-a@w$w4o&y z)cqb*9gUdLDN&Y(rJU_BjT>>_`$*t;d7B!)01Re{Od42ox7(TCmZOg^MLwX-2U207> zbIokq+XCN)JV4W&GE8ayHFy1qZuYqIn)~9zn?v29ZVr_A=}V6wS9+1idkAF<_Q{o} z;f>GBbG8f4Q~y`QbBt{kyPp0Wp7PydcbKv?xXMCzm~y<~NSjBbT%lVe*Q>wW&FC+$ znU;p7u3rb&C?(MA^cKe4EI>j>ifD!oNNJPvFWxFAM6*Z0tBwe-dIY@c2zb@q-TdNc zcVux)rEUUoA}~_}snM54S&E5+5ZgE{O>-uX_JIY+Yc5>!j=KU7*V2}W=m|dHx z`~`N#S?Jky2>mvgQ8Hkl90`FF3!vSh+i_qo)ADNA7R^_sLAB3@5gun`mx4B8Uk1WC z9{_{hs-iVer=~ADOKx{VjXlk8P3R8d!3Z#{=vFld<7IfEwJN9`cu#UC5|Kqls?wat5a$zJ zu~{EX1lNbM&PHohdazb$qKcLu0$CH$isPvnS8$$&e$33gWzpFhGuMDOp}K0K;RKAm@LaY_C)g_6t2=?bb)U% z!HH?bs8JG1b}%u*$=oFSLyFG@RHj_6hpGTG17xe&d6aZ2ov z;Sdnxh=Ve?c%ow1lOEd4Emnh7@q-FXlF2lfC1Ra1<$SwSZGyW5>cLlWyP}4za?J&8eP}rM;KD2kJ z%V>FHcMj9pSf-Up67zM4-B^Kq6Zi+jV#cl?n4U&I6Q<1Wh*`@=f>Jq7DZf^43c8ry zW#r|Yg($7?I?B^S0`nglhDSI}QSj0htdB4the&n_fEXHnw7}#M1{DU+Fc5n}wz2}l zfC3K%O#uZ|SRoRb0){WE@`hj=oxw}NqT0O6mhJSFg#g_vX?*(D zf3WL;DgM|dEF$Pb4txk$;?4BNIG*$1quj-z%?#>;52N(utEN7vqcf(4c42Y23vHtQ z4RBSkh>(l9bVYhI!t$c*zG6y)8v(n^e;Etj_xI=074Sn>gdcLiZCO4mo&}VJLOv;r z_x)wb?T9KiHQTxKn6cRtHTlLH$ofO{+vEiN0e^`AY!op9rzz;rqdX{6nHogBfYmZW z7S~KPG@=O-Q^vXDPo0fM%cdQ8{e+boz-+ZiK#MYZ8Jh=24vGs=u4T5G0aq%YqI_+& zA-**F{jAzg0s+QVJT4I!A4J3<*a65!VgAYj9F5U-4?vFqIgYS^|01l{qjRs;&0^MjMi9sY zSGp;Y2iBo!20R+W2OuiDu~#4pQUP__uckJ0(De>&TK`yS@pZGlDz$0-W7~PydcnJ5 z?LV`z8|49M2x0M6Y1A-e;heqwJqsJ`<#0FK>m{J{OBbBZ>qyToj&v!(j6xCtoTApJ z+hdSgV3y%t5>wDP%rvYWP>kBS15tY)?6LmwZS@28nh$Rj+n&Nckez#XQtl&t{mMcj z80;BJ!jwbFYl3}pv6nABC;iyj-;YbrCG~xyufCmwwOx9SrCA?@*zD{{sAaQ&zH&_& zT`-oLvLVf*-{l^$G{I~D*%^5fLSj;_QH>56h$t+SLA01uVCpu5#}GvM)8(_rPtTru z!8kTh%^YQF@--Ik8txf(bB(1)USL;jwBSs38S&{tDbsGP;I%Zg&OCze1&4DN=?xai zwR9a!Xj^s?{ITmAMSQ-NKsMBe@%V9WsN;w@b`y;QKkvt;G24jS3EK$Uhw7_6*iO6U ziPoXLo|i6qwR<=W=b1^ zvpz#rI)rN)qiLD}+S{Z^2wS7Xxh09rvjFl&viS10om?9Vw~y2;nGEVt_-I1}eN0986A*nydh=S39Y(rr6otZ^1` z3Oqfn08$mf(eeHaAjK=h?Xh#_{4+NJ;B4Jd3R0xls3go6JGq(XVy?=>nl&VnAeMkf_*!gi-$p)5ru&XABo&^_6AIC<{LQe!Pcg&YSRM z5$QkA5tGw*hM}N@UqxQ{;X=wVAQQlz#D(B>C1$WCSrA}Luqy^z4p{S2sEeZu??M3D z2i{l0)C$h6+~~mY!!#fspg{1#qLlS!BRY#D+#2<;D^a%6XyaRy-|+kf@~^MJ&?eLJ zF;u<{|HJ<+wrl(eMKjEp1xfu=rjkCXdQe%|_rl<^q$I1UBFpbqxGY2EBeaZ4%c^dL1}1u)x8071&ecj3LKg>A3iOiu9#lf?p;h<* zs<1k-@`&umyts1$z@#av`!1Sk`)+hS+er4C^gJ?Q-@UHqC^jKr2ggRRM0B)=vJ48- zz$d#gGXp}-9IYid#sK1$FV9qcXxG-r1h8PssK7bgdKj+4R4ppoZ5#=Vbzz8igv(gR z)Y*T$57K0ROx+ny`GWx8nX#g}MJLG?^CdGpUR#*mFlf{yVdgw=dy8m&8Nu|99yKs} zr~8o#Dq!Rj5lD#F^&*2220g0SQ(sZUfJ>NxS%9->fHd(x2xg+3l4eWvaBY;KOVXEE zou34^Gd7F>*xLyYBjW5$Q%MAe)ihKwea z;d2Oj*nKmOgATzA3uBzTgPJ8g4E|Zj=0os_gnNDO%_*xmO5+WTKt`@GcFsP6s;L)% z(xa(DDm699XH)=(qT7;ysqf8(kC%O7)hF?I7+nrW5uvjTwG`%~`EG#vbDCsmvxv|S zcPSr&5b;~@A`yio4WDuj5CRPKPA)fGW0GqZ1Sb}^n5zM}kl19QLv2^1y?Kr|I?TV0%n;sGnv`6vfU z!>I#FkZKqXlzPIvtN#vC|5^sy^jG^w3tX-3VD%58PZ%4=tUqny9H;&a13w7}!gi3T z>dChlPJ>RLXRP%`PkGA9jKAh2Tk}Q)a>p2QNVZM31jfO<{^+3wgNIBeg^5(q zQt>LQmmLPIPE?32jtS`lfF4)@7Ol^TL3VisFbHxBM{ICPBy7e> zkqS*BV;lrL-v(EcPBY|=l#^48=qebAqrL+as4 zMAkb9LCq+v#kJsgVW5GuVb7S74K&qnPawHRO|TzOwv)V)HQsDA2cb3TVSJoQOm<)x zjA?9c6+RVWcO%OKv*TqjTiCShW6YEE>XjZyZ85nuEQutYN0HWQdj%$wWX|Gjg!rHE3fF7nnponv!24I&QA zVp!`fskGJKDOy88z&VGOVZd-7@jrCmrYN~1cczo(XgkBgXpvjIGwkdV(BlIq%q~!Z zya1X)gm!XAQ|h`32^siy*Hz%=vU3&0r|e!$N!o#{5Hrf&RR|H#69X3;7n&51Whn!* z6znc3;1qaFGCu8=a%hp7b@zAL+m&Q!d2~YB2f<8ki!(VBT9<_q0SKzZ3=-f zdeIat_xdA9n;wgX63{e`cihT6*lge~%7L+(gE|y->y5I;iQ&(&uD^!>2Cdfoe4tBX z=n4GV6G+uxz}r$WPALO$OGUfL;;9r3$4_WX|9#e#LLD;kc3q?e)0V7>EXT;eOrPU= zh;m?@D^cuyV57);d5}nO1K@yQMgy@dq{!`1g)lLc1XKVK zhELc998!VWaB$uRNAQCvco1qnJu8p9+~P z%RI#SlA|U$cqjvYHOvD%zD_UrZdTD7KCg1Grat*6@J?s_Llph#<9r)Ct>$*iPt+w5_jDJn!wV^ELOU<#~QNT}cO^hs#?IT2eXgMkUR%m&02H7Sdm-L}e!SCEsv6G5Lr*VY_oeHX( z1)@XpAfme?!Fomn0X4(kBjS^1kuf574R{H65F{I@Gu)SHdOXUZ-odS||1lucNEcsZ zjJrI_mFg=efe}i@(o<*3$4{I*b(E+@j%iX1in1VV+;LOPonEUnmZEGZhqlGU$YXVE zW_ncr1S|bX20z8%ry2YV1N!clis(<7IR)ALER(!WO;lench@x=E9DX4`!E`cvxdg& z-DgD-^zUjr#?Nq9KaLzu7JImV|Kf@Jnt0d9FqB}7^C%U6dF*NWFp~Q(xW1>qiaPW^ zVelmcog1Lwwo^=Xfn{zwkH$S{G{#rJGjj^G4cW1t|Q=Y9;zI`-xXWA9fmN3jO}0GI9{c&xAry(U#@ z)3O&5BAr72i8jyS6W)Sg9-V%1*9YJ`zv+puymOON^FHNWN|PvyC}0qLD)MITGx83E zT62=zfP;@}G-2Y~g(GwY;d(vxO#%cyIB40Kq8t>{4mM`^?ev=b{W;p_XxynGg>T*_ssxnM+;RuU4#87d=PJ-lf@zB`@{j_z-GGb!5zWAFFN4| zaQXmpwMqloA3<(0?Or;9gUC38&`s4+)bSoMVrRCp3b-=I^>G6R*7e1qr*SYpA2$#Uo!?loJmD6=Fv`e0Mrm%I zC_qlIjJLbvR)^Ra{&)s}4a z7qR-WZeG6kgV}&!PAe_MXK1KsArZ8i33&(`r(%T(6IW(^3MpB5Ae20z+qavsD5Os|@lM*KdLFoxO?v{o}xXBb%dLVW^Hcmp;oK z3$;Q@e;uq|LFJD?%*Xf85eGs#TuHE(y>8(X?&cU+A30wH_VF+5X#Pk>Q!p%@^xnE@ zbjL84!<8FSm=P<&_icKRFkHBTyIMfCC>eqR#d2Z478p#hsjXA(W4)QTSQOUUe`u}MQ0U{Wc{ z3e_Ydb{d2Yts9e$Ar;Ua+DBg6)~#fC_oi)i4jmO^dIXS1XVNST)0-orXDxNn^vrUwjCjR)|)WVt|ST^ zb1>8@Xk=P2Xlc>fXyR%&2ASjmdXlU?I`kI09AY;iByveoGLK+Cz?da{?K4|Qe^A0e z*mX2CFVK#q6E3!M^J;Uc35h>$$wHJc<-*LrK{Td+p26oBP~Pp_ zkkmSd>$SL3$i&+V2%;=VMs*FE1{KV$&Kou-z1wZO+~eOq?ZDWf1dUEk~Q& z8uUGKumUfZ$w*LD_?A_VQ9z7&(5AXdhES1KdZman*S97aM!=YxSs^F z(4?4mvngR@vxbpPJPk-&Iof0RgqIQ2;f}dJ13DwZ$cvL0cX~6kz6S^FF=9}+A`k7u zhMxsx^C7U0LKSeZ%QyR}4C$tD0P7Jd-NDV~`P|J>0!{coB6?+}!B#urvlyA{7q zRvjmq*W1xh@+wL#hx6OkC%U0r<-p_BH)i7Som{cqXu?UQ#kFM|7CQ1rZ^NqW41fV-?EFAY5q~w*gCC2B`VPc%hO8V`dkWs3#o6)IbCg z1069ghakeWPl^fY1mz8Qw!=~uVZ==_Lo(=7*2Y0-NX|ICLey>@>U!c7Pv*ckz;f~8 zLFQNdvp9ezN?GX<{M5|RGmEqaBqGj|6^UeUl|%{v5${J=f0JdRK~(i-kqBg#5GotW z${qT*n2>B8{i}TRlR$9Q4S0N#kT1Au2jRWwen*+Y1^)0lcb^sa4#ODm;>(zt%iTwW zS%U}k2JTpNP0y|^e{kEq$X<}9IX#(%kNn6sy9*IwNpm5Jbr>_4Z4&7`h5$vcn1sE~ zJ5Dr19*hy#Wmj-|iz=9elOq3ik@~WWu=SZU|52ByPA5KIO2e81#)) z#34$hIzPDn@h$`_YOG%T$Yz?FTLOQcu$t`p0DLzMg32iny0aaSkLfWpF&#SGSVR=%7iPp9aok?zsC23Br(W{ zLRNnSkGL>{JXMe> zDi4BE#D_kVym!y@_F%ht;O+_l6iG+C=;_}@?gU^+W~c=afVqH33@{s`G04abR+DLH z!*DH1;x++OdICm9a>kNUGM9ZKOA3$jEiq2pOU#bi<--^c;R9o*e8D;?-|HP*hJ)!h zbm^@Y^-%w!_Gy2?C0tV*3@^_wU}&-^rTqDdHuknVkXAA}lWH5%mRYK_S?X`G085p) zCeQ?J!)?8#z-xB<6)pv*5=$YAKwA_)qn`dBNVNu2u_j>0iw2vLNGC@_Dkg&&5a#6( zlhVn|wE1P;!+eYP>zxF9a^(^xfhQ!^A4s^o1BScBC7Ht4VoOgzBLXEfJThH<3ol!^ zbPISr+)*GJ9B)>(3)tKq$3$3$)lOs$!lvPSBgXtB5FE7=MuVn`A=A+PFLE{t$ma;R zLk}hWdw5D1)hr$on;dr_R4Vk>;VCh&s&Fep*P%99;3=3c{BdG1lrv-Y+!k0)&!~T> zc#Yjld7_>e42l@H=0T~7JFj@g{u4mp&G$eVM2v?zrM(}3ODpcKVjAl(ZJ8R{xS@b8 zo6>SSpVZjRuqGh|*-8Nv#KLutsjz%PA2?q_FB6Ny=8Wk828(qI{ahJ<1el>mVt7uN z9{wahwkknTSd^@ z(f`O%fPr4ixGds}J0biZIxFLk(FTaE<=Uw;0V5`d#S;eD`nIgendd|np>QFDJSiNr zc}=jJXrW0(7pA7xf`1Hj%zn>i&*b>jfseo0&dtwS9fav`%(P6wbz(|?18{D1!?(oQ z;_;Zd_9b6@m)*Z-cG;1iW{kQ8<0Oz)^=e!8lh7*QH`%7&iZke6XY4;Rpf+LKhSfJB z?Ps__Dcd_^)B_M@Q9G~;u{}Uwd7v$N+Vh&uO8asR#|ulIF$-62L(`>Zm*4G)6Z-d$@!yV;FLy8)!RRn*GWgOuzz5 z#=Vccn*{@|t0{|72ouj$kFUKpCtJ*|6TSNpr(|ZP4*FBvPvY++K+L+PI8}IM?%D?9 zXtwY&pvxHXIEM$#tP+Zu-Aoi@6+5R!ykTweg-ibvvjkHBP9yLRPR44ujssV=GYx+8 zOCd~S$y9(l6&93p4RsSU;e;Ie5v4hR?Ev%!vi){~;j_m7bi&28 za_wXd2k6rz3dC#J)4c4VIEz)pI>oE>n}2nyWGz(0p^zu#0McLMGNtq%VGc?o^!ZGt zUH<{n;;VoD5OMv#82oPreiDc%#VP*-PB{sulck9!p``=c<;U>a($YPa#^E%$f{BFp zweYGU&_+XRXW%E9Y94^@0CW$>JDxMD9ON;kl;=QS!MT&AlhTG_D)>^Sr4(o@44)qd zMMdqTxI$4sj#8wkNE3=mX#pAxm_AdMYUVrt;utl#Fdxtzkf2VJfU+*N)`a<{jkqnF zy@!DG53XE?;L0U-5k8{6L*f7?dJU)tS-EJ;p=%&cH|7Zx#XU9HfVd6=4pF>P!zeFc z8lXZ00vELlw)R*HeQVs0Lm(WcmDnQ^Ze@bwI}^BLBwU4Yo_XOnhl`avJL5DdV-nx^ zOZ@3S#*#tbEcks3aou3>Sp?DWDY@UU&p|8&-M4Z25_$3_mbK@wxL394luH?&57VV= zSsL38Of2;01SalF+`R_^kap8R`@ELGAb)yg#PK)IAlDmv5De_@Taj=KpYS&j@Q5*8 zgs4>nFwoKZmNayOw2nh+NbW9=ovoAna{ZB9Fwmbr{$V3;(@UJQy(KqX0Z8Lp|MJEz zw3adMxj3;3z($Mv(c(}$-7eI4$-x(`jnB1bol^ZZ>3j{fK zc;xAHC52gf(q2q;yLx7Xm$iYpz(paw7`tOm`? zb=_);%f@9mEmAXe&_8zi)U(gbo)aQLU_JHJ?1^)IK-ky-^2ezdsuuh1`-v;yJL5R3 z2IhhJ@TW&&p3EFN zN~T}d1ekz5gb5ydj`s}l3WSZgdK`+y=>uRGd&Vc39CI!yz85KWbd_SfEM1&p<8wi< z>Jd?(87V$6Fj%+jkEECtHj{497myAPur|c9lw9#6Rm4;8pN!vI6P;)=4?KL|LI3ar zyf$cd$lKn5Jj{uDc36e4gjFmT;7gXx?3QX}B6y~OJ-x84P~mwEJP%q|(^ zHp7e~18w8#(^g}3nLkW}yDx%pI$g@gv#I|dYyV3YN^>flOE>RBAi`3Pl_u< z<%~VPQxwd1xx4T!?q@)J2{q+u5>iy`d~@=^_;bYvHgQL-tMBTj;I+&Ho0GgDmPf~d zn0OSQ4hc|$D7gb3nl4C?;Yst}-1|=16Sq(d$w`H;B6p$73&7h@ufXAe&pkH>{yy54 zmy}Dl%{|Qc#k7}klL~#y(3dY>b>?w*{H3qUeTw)cwfNm;rkOSG+9Qytv+(frpb9u8 zcka13U64ax@-XUT(f&8OS?J?%GluJ|ALwR~&)*y(%Z9rta&%U}xrh`zN;&2~>lUCu z_%kRFz5xXS+3OLxHuXt+GKNS2SO~5LICX4@Z^b`z^!$6kal=a+JIlbKz%)5+!wbhd zi=vQh0wNf*jpPbeSjU;dijs2$Jk7_=EdrV)uu>02LJR&ES^6Ro7;i9)K(@JHjJtx{fQKo3z#O;N)MP#O5e7|OS z5hZbkS+JlSVS}pa-AKFEWiZi5*<>^ptFzoKXgw0Xq6^S+;IRu$A;7}h% z#2Lxws9FZ^2(fw4X$!mIt$NU%7^qQi!VZX!+Bh)<*iuL-pN_$ zFMbHM2^>iwCoXe+e0IbGdv=?l}I#coD~cMB?Tc%ye$nXf=}>q2+wVWI#o; zvp??X|AR;Uf0^d$33lc=J;@~DtU2*=DU+TdvR^Zy|w9lL;rOU1PMU*kd z?qKi(4E8g?#5?9kR!E@a4rP50W2YG87|_zDhZvAwH%Cub8T&AU#~55@u!bNSi%$d7 zyu|Br7MMDmq#}j*NMB)4L{QpYx!kI&Fus|wjQe(BnhWK+139iLr!$RwLIFk&Vi=$8 zU*sc=Q+k5IP6p!)xc!WIk@iBpn*ps_VyO__xlw}s9@D71(n|=Uf=Kov*oz#kMSvFB zS)^!6%m#}8h_Ra(kSmDNMEy~kXkQbad)vIXr=$E4P!0S(-D8~Tkjw^QJoyJBL6sTQ zWWrQjFD`dzA@4Z;jTwgbZ1Ep#M{1n^X$dohe7-n(>*x(oy4{#hjXpR!F*=?v!n@;z z{O$RJy!{*=@Lu7aSudY0KAa!Q7xP8OEj(VhcRa=ON_dZ*hHo3@3xyltQZH0UPKYW?}iU0rr literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/site.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/site.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7dd20c128bd0017511305ead4eb689b43f2f6dd GIT binary patch literal 20716 zcmbt+dyHJydEdQv?mYJH?1QTn9}-1fQKFV3?aoS+%s3RSh)!3wo+`kG0Fv=h( zP@rf57HIqXedo^I*(Gfl&60cWx#xYq^PTT~_LZ?Q?@xd8-@Nn__kpFJ3!dA_R8FW9>UoqukMbFH66GhQd`6Yj3n)LSUR1Mq zmeiao3r>ro@Jfubb^-h*W0Sw4E!*t>H3P_sYNTH zztq-#w9?ROu2a*|7E0@DwdEl6qqZMzg=MxXd)^Cw!5{Ah|Mp5F94rC3S~qI1*P=$f z)@*M1jrC4jM}hKHS2tSAexuch8ntGlhZgNt*?-|Lz5?%R%g2{D8-e!k20FyJq2FHe zZ)`;??UsMC+u=9AT>ePymC~#q)^(#3p@B};42Z1MBCiz$3d=;xZU|5|qF^rU1og&J zqnfkZowc-c~``_s<9Q z8YeL2yTJ0yXtUh2(8vE)+i$j8%lM{NP!Gbernmf)i`_^Dk|q19jqPkiei${HP48Y? zuZ1OSsqDu+6!|rS9(zB=pa;H_OMDn}u*T~x@9kD&bJmOv>2N` zN7=g?`L$*UwC#3?Ox&=*zZfhwYArycbr;iN&jC{JQS+!q7~u>U?3b_e+ZaG|A0wQS z_0T`LUTd^~tZ&uovg|vJmTKP%fh~Y8b}RH(yCLArW0QRABLINbLjaidxLJeU?6#VX zwV=6G!UAq%^*RW<&4>p=HFQvq+PV>hG60sg|X9nS*nS8o*y*(r6J& zdBAw!xwiz#Qe(NR<%Ic5jb;!6D=uHZ>0i8b{_44f1jh!05!q_p<#j+2qsT@NtqBL# zpYMixzS+isE_>Jb@M}u(kS(`S4NTf?F#o6>*t65#Nql>!yuZ)Th6C)$<|fnN8zT@C znah*8K8e4kq$T+Y}VF0 z%>a~_$CtEq_ZU6m6q(5a9G$k=Ye76&A5U#yc5U}lABlUX%J1x@FP;vr?zg6S9Gr}nBzU-Jk0_<+QbRzgTBmTKhK3>7dSMiB(8w62ts*F z?Pjxm4{$x>dA|QF8x5H9-Xn`z)FH*VOq)SeU-3MyE}2P?kOL<}aq$VJJ~R{u0ZRy4 z305bINRb5~7@+cAlmazkAD~iOt3b)_lJc-r2e=`Nhs`FYLGN^LP1h$M>v&UU&4M`>Iw6AjHGJH9C*qf` z*A%6NL|F1`30w9^kicgli`2n?u(lqK(Y=)hguFUN0EHoy!uBmTB258dmmYaSP*VwJ z(BI4tOub6E1XCwM%u=nHm$GWvx+beADx-Aa~l$%EKH7QpC7Zr_TafE6)XllMls4G@2Jd9hCo!A zwSqp6(!%Pvif^V5NJh?TX306oBkx9za)Fy=U}N@YSdv}Mt>z^ypj}QCj#$7;;4kX%zB)oY z#YlNTaiq7H=*i{z#crdic)rSK2jc(hBj3z z*bet^+$c6%7KbnUJX#uhk|`4Bv1dnZT}ElTUm3h`c)@ql6Tx+B^IC%I=eO;x=cCN3 z1KbAW_3226FfiZV2H{@K8H~SUZH&8CMAOlNF&*6-|0K%Z!7on$cFXQvyctAY4Qc^{ z2Gw1Wp@`9>F%L=0P?jEbAW8-O43;^B>x5IBZG`w>p_Tes7L1U52&XG$Vp|Ee>*v{% zXgowD#=)){*jgMm@~yvyT7&5h@Er7kl$dx9N_+}+bwZ3kBlzV|0=fT;Odn?)6m^;q z1crh#v|N?h&JdETzH zQ;-GZ7dLK7K8O5WP;xv$UszTEb;?B}m?5|0U}y5%g?^#$fF|9PxxIcKeQrjhSVxh0 zP$*}0tY0uA+=1aw+5PP5IM@A-)z9c3DDEyIcJ>HAxLURup-V0hJ^-kc!ms~Wa~}nE~Sw;pDZnQ z<&>S^Fj=Uy5PS+t-DXotpO(R?PyKj=@^AtZq5W^5c}T3WG6j&$oZ|wK96_fXo*w=& zB^xTBbQ(xD<#@J>fBFsds*{}ZCx>71NkO)6AS04ef^6Hc`))geY)%9wE{w@a8Pi8e zaB+N5Zd*V|g8=7{ z_wbxFJA4W4_K*{DWZB`#Oez~gY}j%7_A&(xJl8T{mYLN|A~}QP?1;$mp|ctHGZ(E7 zo%epQ4FUr~?XG6kv9(;d5aqN=+Jo?bm}Hji?d*q6>!m2K`)LgX#-#kP^v$g~`p^3y z`{ub?P$VP&+O$^%v>8z&$`flo#!Sb79bb*@xL9$vbv!La*>I0T7S`d)e0J;GXyvJK z*uowC*`M5FsCHs#&i!Lg;u|yD*|hb6N6ikRN&RD#q!d>8zb|h^zNsno*ayJxi@^1@ zywr^${VftnHBB;WTP+W78Mel$dJf+<0kSIf$*fs54L`@@*dMe`&f4UfhjD&n&YJP4 zaFleN2OnDJp&geq2<$lCVS&=+J-r@=ZPKfC{E_W24&a}(+1KL8jtH);>Ast;swg;v z{lqG=3V4Bi`Y-BhONPeGtE1|v;ho1=U}vB$&kKt?wq1~U z9wR$K-ycQOU|tqs_Mx-!BM26!!JbAyRi5sBlvIUBEj9c4CrLVBeF__k&|FQO=yauF zT2sl2u_?~A!&AZfCKy8_tV18nTx%@$#`cUD=TuF@n$vr7{?=9qO@1D2sDsa6)*u05 zjGymKq@~6gv2Y(J)~e(#Z9-qixDZ6+oH2|)u;+V1N+1o=Z_yh?<(%4TQAdiicsc!Q zodP0%Nbe~=-@HlbgsDgCSfD}24Y+upF_tVpxH5vixJ-5c9ul#T6E zy-`zQK6TPSr@S-(UB$g}{jE!t{51p9IAg~l<7}vvi{MCAq?MmjubQc|N@w536K}%+ksyNH93FBg`UF9fM;^XBw2fW7W#GDc! zvmhn-3{!&4Z6LeopJGjT3cIZrnTR?XFsGO-Gg)G?i^-A`%gc0~TU9j+;`E&TDQuxp zt-Qmw>rBHC18ipM=oO5VQb9_)1^kLEgwO-v6zzmGCD0I{GRpnHf)U07=4BzBtS0r~ z#htRsLsGK!nZ8|f!K0mihS3K#ax+N2z|BIGhb%Kf9w<3axZ&tdrZ&=g6+NRtPnB22 zJv|YbAUzy4L8%8kbacn9jYOXQeHnc;8i9oL`%#g~7&%x(ZtrZKS5uIp&uph_fC9LG zqysyy$SYaMBUJak7Zo92%P1S)OH}B`YBK-^nP5%4Q0Xxk@WWxAXK?RQ4K`(INBiH2?-CEbQK9aK)do?CLl zsMs3{pE~f(vZV8^tGCn6=2HfK`MoPi$K2OMOVgeeDd~{ z>kFKU%Unpw8DJ=8=sS3ZR2~faND4juD-ilu>aq-;ka}Vs#=(o{XIIkx4-6yE@ za%JJe`V(w*jmgK6JovHP8BA81uA^0H%zWCr?DifLYBupmx~ayDDC}40fbdpR&25V( zFD;xqf9+B=-N+$knGFn473cFaT<@ z5Sa{Zz7TaYM_}QCtwt1El|N$X)3EKricSHx1u+$Bc;T$2TsScxnwdU$2iq!*)GlGc zw{bA8-NYT-soHbVMUI z11FmnR7RcPoGrnysbrWW>?escF$NmApWa5}^OxSdx^V64`5WhMUok`Algv2cTbCDO z`;noNkeNp;Dj_xc3btsE+*~ORPx8QiO^ikh`UNzU1ZF~ESfec1MdSDRN~DjoA?)r^ zVoa^%Ra0c=3QPuz6r%Sd zTY6GCUxw*V-ZOajm5X<1=3jS9)fn+lXLw0jA8r>J`nTJCEJr7KGR@s!OnrwU$Y}iE|A= zqy|@`4?AdtPy&CYeNV(1jF4=^1N%%bdtqJ8{rm&_-QLuNNH^yyeh0D^+!?g(_6|td zMMzO)L?T?eez}yw0}v3h%V)@q3M|AbS{32zh=_D&W!r1G|z{Sstd|VQc_D z3rYziRiK^xJl^1pO>Ja6)ch6QiJK4Kp;bj>q#@?EkT@tuZWuI|9%;#evr25i)h}^( z6WaaEkDItWXr0O}+;Q$UNmxibB+RPTs`Vv{?hdTNS?C?)0XY$#EYUD}Le3j^sFbYE z)|==?hilMI+*v{ou`&(4rds{QpK@iU^}-(D&|)pXp~nG+KoP2F=7VvfIBb%DcMH_) zbJ!dMI@f4lSsK$?`V4x7i3aqW&QI(8WexBuK=;fxooR)2{L=dM^88pB`=wR=Aa zw5AuiaE?wyn&03~glo}I9OR4DDkX1Iqqi`!{xp-n%!HySfZ7}6wSY07;LI1f7?Co; zIEs$mL9^H;deL&+h%l)kAM}X8Y9QKTT#yrn1ExRVu%AbQDcE<X;AAzxcWpG+Ij>E%t9O{9s z58kjg4l);h4&!??#jlPshyt*+piE#rk{=T|XBPA;SY>Q`rEyK4m;MTqUuLq8aejpD zTqvqaj=nz4HowFqVoe57Bb5{~aQ%ZH)e$F}fc!%?q+uIg6b6{!99NvB{kEw}zFNhJ z>2`jHV1FLXEr6YV5aWI`UK09H#v#_x1ubr9yEi$sB{IN6#8|NJqZm*i0BT1U$*RC* zHM3^x=M;iXObPaiKFur`aAw*f$rf0-3;L_*-+P8GMMJ#l$3Vmx4*`8cLdkJzL{106 z8bVN6l>Sxp7cj?#x6ZwD?drm%TShARtEd1GA=TfHg(PNwKyXkMw#0x_bb2YIfrEy~ zr(aAQB=M0irYmCb#dOTjMYQ?bTeF+b!Cy0dqk^ePOx_T6 z;GJAz|BWT!EDS~vgQkGNh?fwU=N5V|U4e%%aT(KG!!XBLvds-61e+?c^OAC(@r{uZ zIK2Uu^y~P3{dFWTXZ&?M;LEEq>iTPv7rJLQ1X1QH*c9_$WklERK?LY@qj+Qim}-oI zSt&^nx&i|q$!MG-qPNX$*$Nly%=*wvGbuNffE7T?Y8_yRW zFXT0A>iCr(w6OB{6(sr$G7+R0x{-Gf^ip*q7j`ofM8x-O>lnOCr=$cfZ7C_r8|;33 zqrC*4!~CiT#Nb%qSr~2fAY@uKvg}Abh!dV;@N@AwzMR={(RU(|ac6HKT3{ySHHlnX zM}!*888fs~RI3SRhEy<;HjML0o8HfTT+GoXA`c7?5tdMHU|!?-P3lx|H)z6>4EA>N z-o1Ne6B$-+>*Z3p_u7rE8)9K(Jo(=4QnTCnjK2~^oip=@UhZtM_k8c01#?QV!7V=3fuNP_0c zyb}{kvI?3jp^4oBed320TMw5a9AAQk8R(#SmjgF7VyHaA_j@n0OS1gEJ?9zW0)xM_ zE3ZWB&EDv>s~0XU+`3ebHes|#UKUD|f=$L7`&+;s{Y56^jQVdgq0ME8!OZgYAQKuG zge2mC)ikXGIhaWC)W40Ik`3EAf`s=WbzB5_O*j09#BLw0EwPsKu}-FeXs1LGLWpqZ;B_pUy!i!ID%J#CXl7~$wUDoCJhuYe`W=hsnW$@ zOvp_BJ2i@_9^1*$)R3;hoQ*1^m$Wlbhu{xJLD(lYp^ z-$l%7Fr`>ci9=Y0Fw%FvV%9BW8hTh(AP{3;n;n?igatOxH+I+VsZjqNWcO{ii1z=B zi{V@(s>90}(97IDda3^wN7}0z>>v1BX!74UuqXvCkR_v8R>yDpLkP$wkb*MGC$g*H zfksC%?G3tr8}&moP!}=!#|Y4spBw1^y$e$P9n_~2@ylqmkckMB)M^mX%hGhVh59xb z!U>kW1LM;Xuwn%CKvRa@INBPA;FpGFwO&maF`&+WGDd;1Aqb_*AnenjxeB>a*qxC# z3|ay}^S$4@-tvNmq9ts!h!qBDM2(7G*WTuo!I3(2pSQC=3fG6!NX}w2;v-7*Sd+} zQ|1#*jfo~gv-VoI6OUe#r;!RqQW!wr>b4{%D$YUMh3f-B#9U+$0P2!l7Qwv`bQy$aL(uij8A;B7 z0o?4(E}}>!O5b=KcSG+1D!JK}B6Hbb9B7-w6bxeXgLw4nZs0xWEM@ckpK^fiWcmlv zUeEA@MD}-#l&JsN@F($eCh#kS;sM&yDT@d{6L07u{##tM6uUquayyo|Rtr_QrXY+7 zDcH6V-RvO#8-xX+C6vJz(n#DAAh*@HbrHw4uMw)jj^I>K;VB01TrYY_rk%+6{8+ONK?_{Q9)t7JDJsk+XWyt zwXj17IYNZ>Ko47;+%6adADa82m8!{p0q}A6z{k<8UHEK%G&;-}cR+S_2(pI&(~)G= zFjZsbP3eQY1oUj)u>_tbjOowh!ZtKY23l=<2nq5q-mzr719XI9gzw7;$jb=dml2%R zBPPOL`0ufW-UM!1F3*|Z3(BOTipzO4s$hv{?h2ESBk4IO)P3s9z3d59KB0OAc_3FQ zzylybB|Y9cO@emrkFf11Y>&7%9H_YyVK2{E6lC<@LsiA4b7sgDw}8TUd@mvGL1kQ= zi`Mj2RHoux1}~I4ZsAvA2PNd^DBawE#gw?Yfdv$xcAT$fHi``YDY*|uWquQ^^gse* z=5WR2!IM&)TsE0Am!bzQN5l*LOU$Cb%j6G{3wBUoiiKrVVOHZJ+?AcXfwf!7Cg(66-5$WR$T`NuZ7~T8Rci%7;?d-(cOEO2QZWl%8~kSdL8Mg}7)wH;Ot;rgl~A5}2W z>_RcrGy_Ac>1<&I;$N+daI+-zyh3C<{i?~sv0PuNO~3B}sOeeki3!wiH_83b2oz9UKC8|-al^I(XcM24!REzB}kZR9>%zYksoyL62ED z{D4F_K0mu%Iug1h0hQmlwi}Q6Cq=+57BJMZ2R0FNdT)5jgr{wPuh@5V&Bl+ni#$B`o;+l(MQ2CAZs!XqbXfS9{ z8^U6QKWbraCkv)90K*?bFi@N{UI!P?jFVVX;?!h!3$S>Ksw5jOXd#sG-=YqTL#UaT zE-!o}UKH^+CDJBeAdJ}!5<18a?mE~-SZV<8|A?{_-rRmpDe(UPmem^8cOaaar9#Ne@YSSkfbsJ|XFol1}I!Mn@(0 zRFqW==KN8VegBxqWFrf(@U+9mrZDnK{w;Iuv-f1HJ!j~|+@3Hm3T>B781U~A_AekQ zJuRF>`z)AY;xS>Y(k^ON3Pfx=mgH)iF*XvT3^(5=D|A?~!lcGTGvRSJ{J+cGmzdB* zD3%#bty{E7(Z4h|*aS#&nI-%kB;m^7IaM%@%JiGpuAe`5t;#5=>Wy<3K5_0%_f?T?)h^r(y{hRb?aukrgF)8_7DUsRwE;O8R zNCdc%41*L}$vipWSvpqh)hLI{A_e{DQU;8N9t6)RF&(`b7MfQRQtC;5Qt~h14@_Cj zB6JG}*AvD_gaMh+Bk-uMdghB{F7`gaoM7?PLhW|}NgqFm*7(%i9FPAT5$?V8jcELy zG1}gNA(w{L!G)&~b}?9Gjqwa!;Vgs*ks9BHWwXyi9moRYel-7}P#TrTke+!^{WR(h zUPxHW!Mly{0z1yki4c}&8JNKt@X_;cD2Rc1Xz_HTC9hol8ENnPFZpvc2t6vcdN{V& z_h0_;4G~8~OPv@3IaV_CDbpi-MA-Il4|p{&{ZKzb9*d=U`;kG@{_8TbvA_8ctnmj{ z*hi>Nub9emAM-!e%d_Hyo_%1yw@26@nHKfyFfv37{!Ic1os+b*(|{(Z0GB!M72wXp z@E@z#qe9K29=zib5|VWN6P|dUQr_=(o!+6U(a&~cnh<<~==9!Hy5ncCUjO8Yu#}XM ztn8Le?~lS{l?Zyh(V^W=U%1zojb=7jvekYAeN_qI}iGY7{7w3AyGf8%?w`o z<6?6bO0OD+fQUBoEs&B^|DiG9QwA{CjK6_g1rcLWsEH*;Fs`z&aO38s%U9n4aToXq zqy%OXGB29rQTDjQM3hVFps^bvh(JHdLW;IStgXz~Q%v4qa*2uXDB)JZsCL=Y7g+mc zCc>z`#oTw8?BiB{#4-_&g~4Wo~yfB=;D~;=);@_rLxI-op2h(22&Y zBF1NJF0D>wiWxYQfzMB1Q>M6KPN7g3D@+%>Lb33)cWCNb;c($2g#(4BCf_I=oE$4; X3KOW!7e0ZfTNp>{XLC;BRnPu^^HbFg literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/sre_compile.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/sre_compile.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ca98b2c8d04f66935bc056af6b72cb960d25ac5 GIT binary patch literal 10324 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 AJpcdz literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/struct.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/struct.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09d823a0c27f2c72b45c006df3fe3d56f2dbdb2a GIT binary patch literal 358 zcmYk1y-ve06ou_LNz?p1NRX(9N{9ggLYWv?S{4sj#x`k$9Y=P8R2H6xSIWx7D==ZF z3|P9~Irh~(y53e*{&Dj}AOzqG{5zTVx4zt^hX4YKNFWi5M5JQXW(0^#tQFh`%@x!U ziD2-B_lO|x%N?jIl5wWE>)s`a2gYB?I*@k#Xy$b4m#5;S^u-!Yif)va{&mvbXeU0- ziL}<(Z@&qs;SA3_3d)samNR~k{<@-67*6R!9S6^pqLi$tTjp)z2W{%{32gY-f}eZ* z=%jVnGBdQeF?`apA02Mw8xGn1xi)=knmfEG)r@1+J>%gx9!$U8T;NmuW;o8-l{R8h T@*4SgS9;_yLJ>+)221!0eOzJl literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/tarfile.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/tarfile.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79927f10d74604ccf776a3906008f47f7be62890 GIT binary patch literal 62631 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 b&dSB=Q04hd_p`O9?2aAqhDa;ZC};l*dE`QN literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/tempfile.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/tempfile.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e12413bb3e1a9aac324bc20f3b859e5507f6c82c GIT binary patch literal 22177 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/token.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/token.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed94592bc7bd1f7af30847ac52687f05ac9e3e85 GIT binary patch literal 3366 zcmchZOII7o6@aT--Fh^Vco<`2V_U{xTi77KUxOb4HK4I*VMz>jO^70M+gL)VfWlpRd*8!<1f$u z$U||){>@JOG?ZW9UWGUz#@dOT!b8GSmwZl zB`i&Q36^)%9~EKQW|yJeAy~m$5lOFHj7K2Y3)AaTCvY6Aw-}>{Hzngga{!@h!G6J z009@DeNGUPgh9d(VVE#NI7JvGoF2{VKngqws}!W5w$)ZarANEn9}_ zEl(P_l)`gA)xG!Fty+yI%J z{V~(DYoax~>$J9=+(ITOtGl(WOtbzr(?0OtJFUBO4>G+y(mwdvn1}k7x8>}%pM6c9 z(29qZup;s(96L)+)2;}dr48USkL@sW#6n+UR;5~8S}L0ra%?}CWDhH-E9lK4J}wDN z`3RVbq!sZJi(gu#;Fs|EeHPW@d74&kHCuXVmVU)9dB1+bE{egAb}&sR@V||2 zU@~J(*6Ec>M+uf07y5g3oOM)R6*ImH$~bG^gir^QUPtpnzS_kUxTA?B>?1wxAns{? zsH=4J4c2<0F;Cwy#NQOw2`lVy3T=iP5zxJ;AMPq+L8`#E7@!@6ZLl|(RsnVY9DdDO z>TBlfe;rkj4Fgln0N^{F$OdY>!cbu^Ys4XfOmx*ww9Y!Q{U?4T$2RYD3_sdP`UdI` z_ygi6f1ojlsXE$KaWls|32(?xU|+(I`!PQ;&p!OL!MtHV))=Am)ky|kXef~v3q3C| zS@9Eoocf=BM1Qv*gJ1kOnD7T1qY$H5o?)G#phj~a#?f!$=%;rK9Q~gPeytb{r9op4 z&`3e-;v~HZ;k^Lz@i7}W!?;?#cNRWr)%ul>id-48J`S7m|=12TNf5;#HUY%zL zNnA4xk{HF4{;J~Z-}HCzSN$Ce)-3|z#u*>AdU{7I2lSl{S%R{Spgepym~U-0_rUId z#_tc~1^l{?zUjkcK2uEDLO9|{YT7lVVjMoX0`|Ll%ldNsY0FXT*VEapp#>#Iuz^R-0X zrAm1vzf_S%DZjjOB2<4Fj2Om{;>W|KY^hY-;8C+s$gh?2WvLd| zFytHAd4BPu2eOlq* zqT>d420_QXpfmY+&(UQFw-?=lPJnJ1GCIHOz+TgSM)uqv5Skh{G~C1g_kSp?B-NxE M4dGvl-Zzy00Or~;r~m)} literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/tokenize.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/tokenize.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f7d7fa9bf19ed352183a35c7d2892bf617fc72a GIT binary patch literal 18589 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 F{cqIJp?UxS literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/__pycache__/weakref.cpython-36.pyc b/mongo_mac/lib/python3.6/__pycache__/weakref.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4cb3d68178daeb9441695dccd0a8df07d1114254 GIT binary patch literal 19189 zcmeHPNpKw3dG7A%S+Rp8xLC1TG({2=1=5nu$Pz7st1QWaX^}Riv8~o%x&aI@8(%jB zVmz=NL5ZYPA}5uU6DL(UIF&3UK!WrxW@wS9QEdKXKvrB9`)?o#^SNwckcSNEl2rl zzVh33-wC$6-Hr;KwT^Ob?S>nj_EM#CXQL4~t&X?d^c|el+D@a@ZTc<09oE7|r|ops zoLe_;IZs{u{IiwHMi_RVy>MY?XJ@IaN9d^a3!eYhg|6QX*gSa=Jug�g@VvrD$f| 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 Vt=bYUkFMc#lbRtg z19uN8kp-@xb&@YgWt$(!FXSJ3>s2=SfUJD(fPyG`k<3&-@9o>S`<`?AQKu7s|M!3W z;V;XKea|j@SJ3|m#r};mrkLU*Cgv>{ydHbPt6N|AbsLC4v%HaqBCOlye58XsnsMdL zJkhFWV%?hYa~bK!8uA%G^h~9_d`bB;&ROwm-Of9TLD%C<`*~LditCnYs0K#M`~EBt zy^~n?@)fc24J)n$Os^is=AWF=|1B%L-!Vwn#2UN{M_0z{Vtu?JHaI(p^i|HVW)o{R zvF1PXHToTK^?V)Auc_vt_g8N2VRbaRKHd`Va`uF&mWp3773+6rzSyc|??LuHeB9FS z%Pqa0_wyU#Cu&KxUomk*-=GufUC{ZW}FRaO@L z1X7wjv6UXbG4xBZF5he*7aKS>@LWJc*TR~#EcUYl*LaZ?kA61buC;fRjg-_ctCXC6 z{dwqogklMIni0eRFTe&z_LYxA2Bry73N+RqwGEU{Q0&*JrYr|O4f(q z0`kl@^>V)o^2Q9avewQ+#WB;&qpFq1giyj-wUoD~j4-Gew)J-nZ6$&)vOPQKi1sMk zGl@CDfsJ)>X0yUpNs($7?|8-J^U@K+M!9x z$-!`^OpnI8sO)e@9}h9vJ-+n1f&9Rx0tvH*Uhbg`7`&w^b5@wc`x?n_ni*%vviwx)rjUJcB+J(gLLJb;*c;y=Vw$8;v6q>^@`(`-LW&3n+i z?DFO!0bN@DIh1XPiaZaw8K9SvZ}d?cpwu`cvr}$Xr+DlrxzxUTb6=<4j55>z@D^;t zY3{;~Xj7_CiBXcW$p7y#w7r&sXRfke?mpf_%oX`L($VJDnCc^ z0}nzrPd&uL|Bw~T$z(y3T{nCstfxHf|iC~Q0jI=U+bO*i*5_4ch ztImvMMKrM$<=o35e&_8FU)cEfuw;oX6yq4UTt!XA{FL_a>by=sqx^n8csO^j=2-Ls z*%Qg!IzJmvL|9JJQt6tXt_e?SHr7N%$|Dv^X|`a>MFq||XDpeZj7TGhJ0xBjm5Dmf zjIQ(a^CuFQ_vt5J{pQ)XqFWz$!Fz$UY4kB3nX*6y>`F7 zgS=C_1Se{?o9nc=`!-w69Zc3Fb4@8#nbKh{s1O_OkqV*OEtBLzAk703QP3^~pB_I$ zZ-$FLoWC-UDUS9Tst5tE{~+=dJL&ZOHyw?3-=AOa*9f6ESHJSybm7VzIb$eA95Y;c`ha=N7oPM} zA0zHRA&gjXi{h=-{!ODIyWr6!HQkjmmI@JNm6TMmJ_L}oPyinehhp3Z!+ISD{SE-D zGJxSkQON<)L&I%T+o}>K*#Hvmpiul!weJ`&NN>CLZJ!HL>!PKWla^|dSAubENLCUn zCi#5XvY9!BlWg9VlWD$sl-aS bson +long int64 py -> bson +`bson.int64.Int64` int64 both +float number (real) both +string string py -> bson +unicode string both +list array both +dict / `SON` object both +datetime.datetime [#dt]_ [#dt2]_ date both +`bson.regex.Regex` regex both +compiled re [#re]_ regex py -> bson +`bson.binary.Binary` binary both +`bson.objectid.ObjectId` oid both +`bson.dbref.DBRef` dbref both +None undefined bson -> py +unicode code bson -> py +`bson.code.Code` code py -> bson +unicode symbol bson -> py +bytes (Python 3) [#bytes]_ binary both +======================================= ============= =================== + +Note that, when using Python 2.x, to save binary data it must be wrapped as +an instance of `bson.binary.Binary`. Otherwise it will be saved as a BSON +string and retrieved as unicode. Users of Python 3.x can use the Python bytes +type. + +.. [#int] A Python int will be saved as a BSON int32 or BSON int64 depending + on its size. A BSON int32 will always decode to a Python int. A BSON + int64 will always decode to a :class:`~bson.int64.Int64`. +.. [#dt] datetime.datetime instances will be rounded to the nearest + millisecond when saved +.. [#dt2] all datetime.datetime instances are treated as *naive*. clients + should always use UTC. +.. [#re] :class:`~bson.regex.Regex` instances and regular expression + objects from ``re.compile()`` are both saved as BSON regular expressions. + BSON regular expressions are decoded as :class:`~bson.regex.Regex` + instances. +.. [#bytes] The bytes type from Python 3.x is encoded as BSON binary with + subtype 0. In Python 3.x it will be decoded back to bytes. In Python 2.x + it will be decoded to an instance of :class:`~bson.binary.Binary` with + subtype 0. +""" + +import calendar +import datetime +import itertools +import re +import struct +import sys +import uuid + +from codecs import (utf_8_decode as _utf_8_decode, + utf_8_encode as _utf_8_encode) + +from bson.binary import (Binary, OLD_UUID_SUBTYPE, + JAVA_LEGACY, CSHARP_LEGACY, + UUIDLegacy) +from bson.code import Code +from bson.codec_options import ( + CodecOptions, DEFAULT_CODEC_OPTIONS, _raw_document_class) +from bson.dbref import DBRef +from bson.decimal128 import Decimal128 +from bson.errors import (InvalidBSON, + InvalidDocument, + InvalidStringData) +from bson.int64 import Int64 +from bson.max_key import MaxKey +from bson.min_key import MinKey +from bson.objectid import ObjectId +from bson.py3compat import (abc, + b, + PY3, + iteritems, + text_type, + string_type, + reraise) +from bson.regex import Regex +from bson.son import SON, RE_TYPE +from bson.timestamp import Timestamp +from bson.tz_util import utc + + +try: + from bson import _cbson + _USE_C = True +except ImportError: + _USE_C = False + + +EPOCH_AWARE = datetime.datetime.fromtimestamp(0, utc) +EPOCH_NAIVE = datetime.datetime.utcfromtimestamp(0) + + +BSONNUM = b"\x01" # Floating point +BSONSTR = b"\x02" # UTF-8 string +BSONOBJ = b"\x03" # Embedded document +BSONARR = b"\x04" # Array +BSONBIN = b"\x05" # Binary +BSONUND = b"\x06" # Undefined +BSONOID = b"\x07" # ObjectId +BSONBOO = b"\x08" # Boolean +BSONDAT = b"\x09" # UTC Datetime +BSONNUL = b"\x0A" # Null +BSONRGX = b"\x0B" # Regex +BSONREF = b"\x0C" # DBRef +BSONCOD = b"\x0D" # Javascript code +BSONSYM = b"\x0E" # Symbol +BSONCWS = b"\x0F" # Javascript code with scope +BSONINT = b"\x10" # 32bit int +BSONTIM = b"\x11" # Timestamp +BSONLON = b"\x12" # 64bit int +BSONDEC = b"\x13" # Decimal128 +BSONMIN = b"\xFF" # Min key +BSONMAX = b"\x7F" # Max key + + +_UNPACK_FLOAT = struct.Struct("= obj_end: + raise InvalidBSON("invalid object length") + # If this is the top-level document, validate the total size too. + if position == 0 and obj_size != obj_end: + raise InvalidBSON("invalid object length") + return obj_size, end + + +def _get_object(data, position, obj_end, opts, dummy): + """Decode a BSON subdocument to opts.document_class or bson.dbref.DBRef.""" + obj_size, end = _get_object_size(data, position, obj_end) + if _raw_document_class(opts.document_class): + return (opts.document_class(data[position:end + 1], opts), + position + obj_size) + + obj = _elements_to_dict(data, position + 4, end, opts) + + position += obj_size + if "$ref" in obj: + return (DBRef(obj.pop("$ref"), obj.pop("$id", None), + obj.pop("$db", None), obj), position) + return obj, position + + +def _get_array(data, position, obj_end, opts, element_name): + """Decode a BSON array to python list.""" + size = _UNPACK_INT(data[position:position + 4])[0] + end = position + size - 1 + if data[end:end + 1] != b"\x00": + raise InvalidBSON("bad eoo") + + position += 4 + end -= 1 + result = [] + + # Avoid doing global and attribute lookups in the loop. + append = result.append + index = data.index + getter = _ELEMENT_GETTER + decoder_map = opts.type_registry._decoder_map + + while position < end: + element_type = data[position:position + 1] + # Just skip the keys. + position = index(b'\x00', position) + 1 + try: + value, position = getter[element_type]( + data, position, obj_end, opts, element_name) + except KeyError: + _raise_unknown_type(element_type, element_name) + + if decoder_map: + custom_decoder = decoder_map.get(type(value)) + if custom_decoder is not None: + value = custom_decoder(value) + + append(value) + + if position != end + 1: + raise InvalidBSON('bad array length') + return result, position + 1 + + +def _get_binary(data, position, obj_end, opts, dummy1): + """Decode a BSON binary to bson.binary.Binary or python UUID.""" + length, subtype = _UNPACK_LENGTH_SUBTYPE(data[position:position + 5]) + position += 5 + if subtype == 2: + length2 = _UNPACK_INT(data[position:position + 4])[0] + position += 4 + if length2 != length - 4: + raise InvalidBSON("invalid binary (st 2) - lengths don't match!") + length = length2 + end = position + length + if length < 0 or end > obj_end: + raise InvalidBSON('bad binary object length') + if subtype == 3: + # Java Legacy + uuid_representation = opts.uuid_representation + if uuid_representation == JAVA_LEGACY: + java = data[position:end] + value = uuid.UUID(bytes=java[0:8][::-1] + java[8:16][::-1]) + # C# legacy + elif uuid_representation == CSHARP_LEGACY: + value = uuid.UUID(bytes_le=data[position:end]) + # Python + else: + value = uuid.UUID(bytes=data[position:end]) + return value, end + if subtype == 4: + return uuid.UUID(bytes=data[position:end]), end + # Python3 special case. Decode subtype 0 to 'bytes'. + if PY3 and subtype == 0: + value = data[position:end] + else: + value = Binary(data[position:end], subtype) + return value, end + + +def _get_oid(data, position, dummy0, dummy1, dummy2): + """Decode a BSON ObjectId to bson.objectid.ObjectId.""" + end = position + 12 + return ObjectId(data[position:end]), end + + +def _get_boolean(data, position, dummy0, dummy1, dummy2): + """Decode a BSON true/false to python True/False.""" + end = position + 1 + boolean_byte = data[position:end] + if boolean_byte == b'\x00': + return False, end + elif boolean_byte == b'\x01': + return True, end + raise InvalidBSON('invalid boolean value: %r' % boolean_byte) + + +def _get_date(data, position, dummy0, opts, dummy1): + """Decode a BSON datetime to python datetime.datetime.""" + end = position + 8 + millis = _UNPACK_LONG(data[position:end])[0] + return _millis_to_datetime(millis, opts), end + + +def _get_code(data, position, obj_end, opts, element_name): + """Decode a BSON code to bson.code.Code.""" + code, position = _get_string(data, position, obj_end, opts, element_name) + return Code(code), position + + +def _get_code_w_scope(data, position, obj_end, opts, element_name): + """Decode a BSON code_w_scope to bson.code.Code.""" + code_end = position + _UNPACK_INT(data[position:position + 4])[0] + code, position = _get_string( + data, position + 4, code_end, opts, element_name) + scope, position = _get_object(data, position, code_end, opts, element_name) + if position != code_end: + raise InvalidBSON('scope outside of javascript code boundaries') + return Code(code, scope), position + + +def _get_regex(data, position, dummy0, opts, dummy1): + """Decode a BSON regex to bson.regex.Regex or a python pattern object.""" + pattern, position = _get_c_string(data, position, opts) + bson_flags, position = _get_c_string(data, position, opts) + bson_re = Regex(pattern, bson_flags) + return bson_re, position + + +def _get_ref(data, position, obj_end, opts, element_name): + """Decode (deprecated) BSON DBPointer to bson.dbref.DBRef.""" + collection, position = _get_string( + data, position, obj_end, opts, element_name) + oid, position = _get_oid(data, position, obj_end, opts, element_name) + return DBRef(collection, oid), position + + +def _get_timestamp(data, position, dummy0, dummy1, dummy2): + """Decode a BSON timestamp to bson.timestamp.Timestamp.""" + end = position + 8 + inc, timestamp = _UNPACK_TIMESTAMP(data[position:end]) + return Timestamp(timestamp, inc), end + + +def _get_int64(data, position, dummy0, dummy1, dummy2): + """Decode a BSON int64 to bson.int64.Int64.""" + end = position + 8 + return Int64(_UNPACK_LONG(data[position:end])[0]), end + + +def _get_decimal128(data, position, dummy0, dummy1, dummy2): + """Decode a BSON decimal128 to bson.decimal128.Decimal128.""" + end = position + 16 + return Decimal128.from_bid(data[position:end]), end + + +# Each decoder function's signature is: +# - data: bytes +# - position: int, beginning of object in 'data' to decode +# - obj_end: int, end of object to decode in 'data' if variable-length type +# - opts: a CodecOptions +_ELEMENT_GETTER = { + BSONNUM: _get_float, + BSONSTR: _get_string, + BSONOBJ: _get_object, + BSONARR: _get_array, + BSONBIN: _get_binary, + BSONUND: lambda v, w, x, y, z: (None, w), # Deprecated undefined + BSONOID: _get_oid, + BSONBOO: _get_boolean, + BSONDAT: _get_date, + BSONNUL: lambda v, w, x, y, z: (None, w), + BSONRGX: _get_regex, + BSONREF: _get_ref, # Deprecated DBPointer + BSONCOD: _get_code, + BSONSYM: _get_string, # Deprecated symbol + BSONCWS: _get_code_w_scope, + BSONINT: _get_int, + BSONTIM: _get_timestamp, + BSONLON: _get_int64, + BSONDEC: _get_decimal128, + BSONMIN: lambda v, w, x, y, z: (MinKey(), w), + BSONMAX: lambda v, w, x, y, z: (MaxKey(), w)} + + +def _element_to_dict(data, position, obj_end, opts): + """Decode a single key, value pair.""" + element_type = data[position:position + 1] + position += 1 + element_name, position = _get_c_string(data, position, opts) + try: + value, position = _ELEMENT_GETTER[element_type](data, position, + obj_end, opts, + element_name) + except KeyError: + _raise_unknown_type(element_type, element_name) + + if opts.type_registry._decoder_map: + custom_decoder = opts.type_registry._decoder_map.get(type(value)) + if custom_decoder is not None: + value = custom_decoder(value) + + return element_name, value, position +if _USE_C: + _element_to_dict = _cbson._element_to_dict + + +def _elements_to_dict(data, position, obj_end, opts, result=None): + """Decode a BSON document into result.""" + if result is None: + result = opts.document_class() + end = obj_end - 1 + while position < end: + key, value, position = _element_to_dict(data, position, obj_end, opts) + result[key] = value + if position != obj_end: + raise InvalidBSON('bad object or element length') + return result + + +def _bson_to_dict(data, opts): + """Decode a BSON string to document_class.""" + try: + if _raw_document_class(opts.document_class): + return opts.document_class(data, opts) + _, end = _get_object_size(data, 0, len(data)) + return _elements_to_dict(data, 4, end, opts) + except InvalidBSON: + raise + except Exception: + # Change exception type to InvalidBSON but preserve traceback. + _, exc_value, exc_tb = sys.exc_info() + reraise(InvalidBSON, exc_value, exc_tb) +if _USE_C: + _bson_to_dict = _cbson._bson_to_dict + + +_PACK_FLOAT = struct.Struct(">> import collections # From Python standard library. + >>> import bson + >>> from bson.codec_options import CodecOptions + >>> data = bson.BSON.encode({'a': 1}) + >>> decoded_doc = bson.BSON(data).decode() + + >>> options = CodecOptions(document_class=collections.OrderedDict) + >>> decoded_doc = bson.BSON(data).decode(codec_options=options) + >>> type(decoded_doc) + + + :Parameters: + - `codec_options` (optional): An instance of + :class:`~bson.codec_options.CodecOptions`. + + .. versionchanged:: 3.0 + Removed `compile_re` option: PyMongo now always represents BSON + regular expressions as :class:`~bson.regex.Regex` objects. Use + :meth:`~bson.regex.Regex.try_compile` to attempt to convert from a + BSON regular expression to a Python regular expression object. + + Replaced `as_class`, `tz_aware`, and `uuid_subtype` options with + `codec_options`. + + .. versionchanged:: 2.7 + Added `compile_re` option. If set to False, PyMongo represented BSON + regular expressions as :class:`~bson.regex.Regex` objects instead of + attempting to compile BSON regular expressions as Python native + regular expressions, thus preventing errors for some incompatible + patterns, see `PYTHON-500`_. + + .. _PYTHON-500: https://jira.mongodb.org/browse/PYTHON-500 + """ + if not isinstance(codec_options, CodecOptions): + raise _CODEC_OPTIONS_TYPE_ERROR + + return _bson_to_dict(self, codec_options) + + +def has_c(): + """Is the C extension installed? + """ + return _USE_C diff --git a/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ded273a92f49de21d8e2d4ed5c0b345a2b8620a4 GIT binary patch literal 32829 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/binary.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/binary.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb47c71d729ec42024596a086f8d9d51e9355cc5 GIT binary patch literal 5270 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 IxytH)0Y>;YK>z>% literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/code.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/code.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8fb91f43e99aa57a3ea68091acf2d47d569542d GIT binary patch literal 2916 zcmaJ@%Z}qj6!k0VbUNL`g2yntip9WW#3X|n1Vjk&Mu2D#-4YOxoQkW`amTSeRh4cM z!iJtD62HKL4SWb}Sg`h%6`uer&MiCL$?$MgcBQKBz2~0$u=jU&n}2@)%NK0daejB! zt^o5_G4yTRgwuC~E4;*=dVO!|_x)+m52m$#&2`>!gfD`-jtFG^-0yFR+M&~~FK!=Y zS)$n}Q%uQRNi9d=n3ZD<7Vn-W=)1jH? zvhY9pY`@qx@=Ig?M|5y?`Ix+lq2I<$I(-*VJ>m9!;q?QtCjwEs>-KB1F6v_Iu5<1J zU_)%*b@~m_6gzls3%}nKEwPLFj_?8gN)fyPX#6{HK-iwv|3FQ+I?X1-^)ZjN)T|dJ zT{nm8k)XM{GboVy0P|8OBq%s|`;h$+D4^UWpAklvtk!?8a&l3y@7&J~!hm zW&3RgHU~P&ayhWlmEOVNAWP+7K--%(E?|i`GJ^{7At_*|T*Z8t0D1(Op=4SbHk`8@ zZcv~&Bbhi$xtcSsnHkFs+gu&brU)t-h1kprP2~J6Q-ZBFb%(t>f~u7Br@RkH?e4R+;k?<21GR2r#t&z@%NRu!2Z zdySQ}BO6o0I<_8HM#%%eQ%hOG4Ge>0EuXOqHhc*G zDmR8Q%BF~d8OQoU9jQRt^&qTzRm3}&*vk}PH?rIYC~5cByxy!gVx}~SL^>PC(fGnh zm7IE<%@VQc;Vr~$%JZDq7^!T^5DC=pCVo@g6KN^r7&>BPNB2p^8d=vYW&j19b1EPz{7h^i#(bQm&Lqh6vhPmiVO z_1J#rxym`HW1^&`q{%kMjqnmTE4FMpNsdfInhd`Bdax?pKhUO~gUH97t{TP;#`_rh zH{6V~bd7uN>8l1^(6}f5gXnqRxF%>h>SeoIJNGcFpKL90_M{=abDaM=NL#Bl`ZsT3 zZ+jVp%}<>4THu(SNmHe+LqFlr`e#n+ed;Vd;Y_yGPtfd{*2yj`e+$b#*<1!EO}qO8 z%}(}~u;e;ved&?>(pSG;ocOsq0XciZwWbkebKIqMi{2(5@D$5)u)Ks!bf@+TiB3iVOZ2GZL zHC41is?snl|LwhoQjLc*Q+9vlk^I&NWepYeSuT*$?ONeS2_Tamb%l=9%k(V*EtAoY zj=GA)zlPmh#itPHB89u7EWv5rjV4`_JUbeGc`BaMFNDuW!};Xd{n6rV8r{ZqoOX}8 zd7R&}E+)w>^-?;^;yb6^d_K+6S=uGjoqVn+llC$6P23!}=>~4oyU)GfYk8jA za`)Vp*TA!ZojtGaVb?wvE%LfkaT2*CjEkN$-oVgx+?LLXgZR0N7Z2_0X6C=tt`WbdzwcEaG;VdNteYxQNKQON0(z3m>fTZ;Nr(G0_BCT0m%Q9t3G8BfZhqbd_w6o&nl{m2WaTutx=Kv`Nea)mDz zW#%^Oia1w~+Kn(Ab3I0g9;3BOSaxRfgeZFeLsJkN*8(r_noqRq4Zl$fJWJ?7yP+61 r`+HO$D2;u*kaKQq3EMVt*%2)7Wf=a&SkZX7^zIchrYYcoch&zJfVUE( literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/codec_options.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/codec_options.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42bb058389cd564a49c07aa9324c5714b1c178e6 GIT binary patch literal 11963 zcmc&)&2!vFb{~Aqa7Yd*ijrl^tKIF2S0*Q+hT_VyCB{-jk<_lT7NwG?YMv_zIY{&x8 z12no{zxR8ejcaprGynCs|MK-eUoRB?qmcV6qkRWQ^shMig?hm^e6wZL4P333*|zGI zLHF#I-7eOP+%C3C?Wy`y+pL@Ia=qN1u21v*QfsC?Tc2%L>Xr6feGd1g>hpftpZ=~; zKl6)%KjY7SSMXnP4F}durDgac99li#un7b9m!? zQ1lo5OQ&Z2Jv_PSFXG8!@E)FA2rir!>hJp>`ai-fb?2Efk9_|RQ>j$3b_TsSHiE6*Y$_qPHBbj&iqFB0K+z#SrT_1O5I&M4g<9@Fd zRPDstxVxEH?w*${=$<{rE|!g>1i{+9E2`_bd=C)+!_ z8@u-(?mS869(}p{%ZEG87u&zs*!(iNIH8lXv+-d2$?pP?P$KG*r&XMksGfI#k zjuGn$X2p<;xO((M|5<3I>093wPK|moDEYQu^aAySm zynYmS+vzKAN8lj<*@*yR;84U}(S=~UO%XrC6ATu)uFO8ogtnyu(6oGz1Ac-0R1|ioh_`g~w?$G6Ed+0{SZbAabI9uh*5a2#66_ zZ94mtAQ0;^Xs$QZimni?>clc@WVm!m2bp15Zt&728f%Id8v1mlW0Ryrg7ghYz#M$O z3no0`MJSGe9x%-7c3waw!LG1F6n2SP5=0cp&~1eScMntSFgl^)b`-Rl{6n42VuEBg z$D37}mej9c4c^ZQy_W0a@pE*c>qJ^N6;;go{qRN5(Uf=h4gwFtc{i=5B)w0HFWgo? z7^iq)Tuh&!uO|Cap6v0CJJoVhb{w*Fj+4wdPP^;(Thy*N&hx(8N}o(Qq*#t4OBh+c zM<-gXe4kFF>bVm!QJ%x;V;m8^P%hg>rO5YwIQ82Kl=^)Nmj4jy$IgMED!hrx=jIjk z`zspRs{e(WQTK^T2B-CVSF)?5WJA78RIzSfitbT|l`vB*2J09klIe^Utjwuay+`m& zWm(I5yi=!EU)L!nl=VX?)FjH38p#U;(IISE?dONOL1g@rz?;(eVV=g(Zcrfk0gZN% zP9M_gM|5I6`7yOvPkutJ;e^~`J-LJj>p1dyLia}WgpA4^>O}A5-4sVVRx(ZWZIaP< z|NRHjhIcxn)ux2Add(xP!+@+e7{$tvLzmo^3|#+M`H5hakqkTk|LLmW=irHhR*SAf zcbDOBqE8fgf5=Om;0<|I{|CytQ?(}oZ4#({3YhE=UdUmVXKh2$oe@Y`xN!$Z^mCj> zAT{e-zWtq1N6h1w5KDZl zw??`xf5p1Lwj%iY^YnUcMbv7wZ&uP#(55K!&3~HH4##tWtSYMC63%IQ-WAa?1?!Jo zi7*5FjMh_&DbFwYS6K^BMK7!k$xH}jDFx?jA-UiHN1+doqUK7+ zQ+WrcArvf04zD=c;#iElUA4$TXni(k8R`qKkyvEv>+@lxW>PjJ7pie=h!lyOgX0_# zR#tE-81qJn{>>SqY}iH_^#$9Q!M}|s>TDY({>#RIV_eO(njR~QaS4dzsTqj3(cm&% zp>4b}jl#>76BD5N*()nHPYi+$z_RFDCkCJZ=mBWjG(#xieV094!+`sV}*8 zS*~RMT%#E`tEdQ0JF2dRte8>v2N+m>gj3a+nEwDoGU!Ri`D^syc)tL6U@hbDP`xsE znCPBS|0#Zuor*#Gsc~vXi!o|{v<3plq1pWeZ5wSnZ5Pola(&R)sg@)ax)Ph2KEKnA z@9VNq;LFQ+B!5OHUWBeVbP>|XF~KAy#|fT0&flPSG=meV19E))56+EBhWmlDZ%UN@ zh$bXC%d2#v%0+InVWK4P;2Rt~UHKw(?ZfhPxhUy=QrVPOK8`PA2g=QOsZjJ=_~pu%S(Eq0Sb;7A;KJQpYf0pE}-I#T?K4(v=v0`sh3N5Kn% z0MwE(28Fs@du(xW9mQ7_H0>Qz{ExwSpkWo7>(3MdahTAj7=p)GXEU+h_zefeRKw-Q zSfN_^c#_AP!fE}cj-mZUQ;ef@In z)30A%y_!2db3&hfeubNBpI-m^<;^uT@FQ?>{RGz=U%&Kl|HdAkU8Al`DkmV6=@qAC z?=**UI|xl7BuEyKcG!XK2oW+;(!-Qw!X7R>sy*n(goy`kuLn>xMg`315F5Hey%l=# zvX4_$XAwHF`3QkEJy27p#cB93{idM!HA0P?!eBwU5nrJS!g12w4#!!hlJJT+431x$ zfV#^d?#m9!$*tyB==06Q!6LPFk{@hEa6mk9%xo~olY0#ZOCQW=DzPQFJ0fec6II3Yu9hCtz8Y=wNHW@-t`-MH?J+_lT9FNy|J3^ z2SlqB{l#HBK!QjXO5ca6(iWtlZ9R4}I%-nfA`7lzA+k8QiXqm6mr&qz=q=u+*{1LcEB`af z=Je(}B<{8P{tyRCw2$tQ4_pHGTdo(NNxWSO_dBSEERC>E=*N zC23MFCD(K1jbBV4blklhU@!*zrHT6)o$n^R23~F zXXrYIFC(I+jcvTQNy#DaEyLKv?jiJom4mZMbjb#NTcizROWOz(BES!m%~2juENkIb zHMbbm87@X(L4{w~%arkHF_=SLrYN(rnj|=J7}yuUJI@Ze)BZ5{qD{%Lk_>Z9kG)n% zd*=vHTA{}ogdU6FiG6#C!MIGF2F7YUMf<&^q=3ESQN4-&=t^JTY~qOi5hs3oEBb{(6fY=8T}RdP4UQc2lFS$H&G3< zPV5srZ-Nr!Eaja+tQnhrU!uW4o?=CC5Km=pd^wW-(h+)XEIeMJf-Czg{!Rtv|IN|i z;3wMgWZ)yuLnE+>A3T^~*R!r}3a?=iJ~g#(`ebKt{cZ5gjjKKZA~JShHU?Leu^Dz4 zEw^c_QB&OpH_}av^kXHFzD>Ij-9B*FitsT*5XT(xq>lF%t$VOGlA^w8zPt^oo{?98 zI7wxvWPUXE=1*iK6>HK;!5+S&l7!S`2DZB&upyTO-=wS;A#YNDLHCOMxm1GB1vgHHSsZGGm_eclq?z`g&(q3UdQ1r@ZiMO8NZoAWrzR0Klp zjp}QtzflFwL9`K{5z$74w*ty@qtr0% zDE-m&^hdp>ar_ELM7yqJ$`9}fB|rjm%xwY=>bBgr(6-Yy!z^tR++bR{PYLa*Q}dL+ zHglh0st0he0_B=+@0h}4#!#Lvm{9mH8Pa!H{MnNZvWCetg*D%63vz4w-o{f@jW-`| zZErdcAMv+~+TUe^OzZ`FrmAiu-PtgY+@XY4SGR77$wQIx(`ArlJuVwPozXHays4Uw zHFkQ3NxSk|>iXaMA>pZi8^GO(#_qD{c2Ha08Bc5>TBn}ALCi)aJb z+%BPw{V{*)F9_!4!9{EkBg5i!!=rkxMo4YQ>iQy?n9qBm%dBF4 gV4g49R=Kore&PJ$nT0>4Ewh4AvKIclaJFRq4^fLrfdBvi literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/dbref.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/dbref.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..349bf7632594eb94225a3ff1edf7a8af9d5d7e5a GIT binary patch literal 4366 zcma)9-HzMF73Po>S1Zfw_1bZgCP)W{U0a5&jq9{Q7aPM)T^L5vZEO3Y6%tSsXSAk7 zk@O6;8wuK*tkL_vL2vsceFxt5Dv!|grr#MZDQRK1p)fz<%$zyrJKvl+d~oq%>)(I> z=Qk%imh~@d<#Ew}grcbuR?iYl*fE>fJ)2SAiJghtb0>{n!~Az+Z?e(bVAfMhG=%rY z5}s_HI=xM?@xtmf=Z{{dX{`A$ReTa8Q8tZ(JW3AvlP{mkq2{-h97-jVP->p1{P$^c zm_GTEi!_{0WRmMn_Xp@PVfS3&MApz2u4uery@vFJCpO+#r>wVuep76keiQwcxM2F5 zqAf1Iv3f1BB`%@8AhyM2v~95?uAsdru8Q~2Zi#E+eYBUv2jWAt+u~>9Bea)=15`dP z8pizj{l~nvpUe+x!@15=B?XU?3X^V&Q|)2gq4BnbzAezNXRw9ky9*n2W8t9o7LC!y!aZfoS~T##DQxKO z2LG`w>sb=zQ4mLS37r#p%=f}L(0Z?L?CN)0Mp;t$c@Sy%wi zV;SaAn)Eps(icG<3<51Ns(F&;wU{6Q6gm$;6rK)iaWuCiK%d{P_P`6QPk1)VU!@6u z&?%uKZPqtPGukae6TKaS#@S1b$q9W1XGjorEcv{P;7T(gl-@ooh;(EW& zjScIoD}>;n3h&OkM%4_$xIPZ+Lhjrd9|K6eF695By&{C4A;03HyF8r2ivg6`zy~-4>-4;-59Zfvv)(zWvsttvUGZ8`=q)zu6H+vN zpB(4=#g1>zmG3XNE?U*QNEF*uzuL3#rWyLO*s4ZK{5oFYY8elU)`}z>5}MV@p6AQ& zaupO_x#Ay|dJlU2817~&I)cdEqd@Hr(^!CWyWw~@kM9o$-yMn1^ymJs!oh5O|G{v6 zJPAL=bC~SD+|8owp0P2G@2TG;(=>X0w42Qg!n*^VCc6gVZZ;!}BSaS8{{&m=YpAT9 z7IRsPU8UOg82wsozGd*}R?|a9Q}Iws<+muBg5$y(S%_L}zW-F_hQ!OW0LB|JVDJ(R z9%w#IqA(S588$jhU4Sq&+h`0RWko8g%c#CU(Flx|<<7TD<(4vkf_k5n>aD1R6Sby5 z8?xV_0PgV8;xh%Br2>)o2^**X6PJn=D{R{2)yv#qj)9r8EMR)XA-!>r95x z5Yey>k874(e77Z6F!T(igwm`0T&WQn12Il5dBphnE;_Rod3wPwOH{f5a#Qrlf8e+pi$5EHCs%U;CXXZL8wjSq5BnH#Gyq-F?adqJ!jGyy&al!Ww zWgcL@@Bax>bQ6`uY!Gvc%`aEftmmw0O`036iAkjMh>?ECrOq_7=@f`4#3@i)m{V!e z!0m@PPls{Iy`t^=TIOcR_j?#Ckz@0nN{!`k%?8qef{oE*ADtYT9du#Hg>e6m?4f;V zpRyBr=LiRR!(Hkvm~i)j@yNx$hRF*U&}__g#UUhL^(}=^p5YQh5{HBj*RZ*MDyppT z>8VVl!sR=o`yRQ3q^oWK@?=>Yh2>fyk7S%?h&anI?A}0Fo;x=pae!J3I-a7e$ecz+ zCqfaK41~tl6^;&~`gs(+K>K+8Ef#1xXI6t;*}|{Q=Is*6a>^Qpw4cH7Yjgw~Sppf= z8?cWsJY`RidDSRdNf83oBE5J%2?TP3cLGh!NvtUI%oEet^GLCd6-VJ zha-|ryztokdPN=bpznA0<1`Fn{ScjM`uviabNi;kUh1aq%&)AzID1LA%_xl$MHUz* zls=(=XUUg{1;-?C?dlwyvdDpZ^i9N7j2YSz&;x`AQ{eghrANWtn1!raY?y54Bx z)X;p04+X=%4h4gNzY6p#UM7t6?PqR@DnU0?>32KL!lh{|XcD+ZBcB4w!qce&m?gpu z^R@T(`;Ul1a(w>;%QgAlvJr{vB%vH!L$J22i^=)fkwqZ3&EW+Z&U$X$Yf$gBJYlz9 zOtTEy@!>QvUoYnS7GE>jtXqAi-tNFcujCB*>ztKqG0C0CNqXK>2If;Xr$Ky{NNzx88sesCn-6Ax5~#6M>U~<(%oK&# ze0DyBeni?+My5Dbx2d{I)jg_yN!4dmEw3iiGr18R8Io?|R?~JJ*WUVh+rzKf+-y2c zG^TABpbk1M^*Lr2EIMy7~>6uHCk`S=;$9w0J8~ literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/decimal128.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/decimal128.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54834669451d51aa4813339a58f5643fdaf30ffb GIT binary patch literal 9705 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 IhBEX20|2U{3;+NC literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/errors.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/errors.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce8100abda9933e14d0dbfd99ccf8bf96414c73b GIT binary patch literal 1312 zcmb`HL2uJA6vxvfZPRws1{W?I%w?j7HcSHn5<*qgfqLmAIwVvfS+4DNSra?6-EPel zB)$e$J_+BUS3U)tcuq>`VIURZ$WQ(yj`RONKj&nBzyAI6*Y}@%$NA=LHDIR$UB83C zoRRa|VI}5%bePLaAH0zZ>@gqM=Ps}ZTxJ#EO3prTl?A{-&Sl^ls{_|_uCT_?Y3^l5 zr#F8&$K7_!XQ3>?9tTghN3u}6- zntkds$2O>q5e)YE-;6rwez4`k@=iW#Yae}< zb^h)^ptHP&`s{yHQ3He?Z3(wLXjb#GTh%tdlKg1oC8z8bDeF(!xwn<(DtJ+x^_K@Q ML)*E&cUUg2pER%~$N&HU literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/int64.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/int64.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fdfd101988ca6c595d0d991c25b649e2683b886 GIT binary patch literal 812 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 b9CnVllVpp9R9WWyo;}Y?enHsTJ=4@*;}k$X literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/min_key.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/min_key.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba09f0f821b8c529e01e111ab9d8742f94f33c84 GIT binary patch literal 1557 zcma)6%Wl&^6!j~Qx(R&>u|UECAvHp^DW$5Y5UK#d0yPWhDngn#zLUg_UmZIsiMne) zge_mfKX}WEPk;^FYxm)RshDWa9s5q^+;it7+s&r_#4=R%MO)3lx*ZVl*I|v|k zq_+~tpqxvfaQRH_D4>3jTH0*qJ&y#Bd63wN8wN%{6h<=S#z7bi!q+biH%Pb$Y|l7w zgLiytB-4nSx`T&a4Fy;GIO9VEE_Gz2Q$X&hpma1)K|7Z^6{tWJV-;#p$5?{}&@t9w z5gHg5pb57y>aYaM7#Cp$RxvhU4a;0lt2zB_a&uj}fx|S72^TS{afWs<;IOx6JTZ5( z9HzV7{H$)*2*MM?^&^k_s6RHG(2s24#@L21;=)cs5u4f9zW+jL4hf|}QN{TRXRIS6 z(y5%tX9|`ow_8f8yRjR@i5)mx$e71hTFkwES_!eY;)^7z`1U8aBH>Q#gj*9^SpCog zEZcHMR^n~-d!HuoG~Q)9PH#He+V0OzeCIKaL0}zPksEDh44$_so(1F3J)T(6)Tc|c zdMLp1-GGhw)QqNSl`($I*j=hNlOWHUc?--u<4}z>DAJCiFzHA>lP`s7LpvU(4Mr|t zzAZ*vv}8eE%M|5M!^gDF80}^39zI>tE?v>)xw($c5uaj5M@mD=h_ho`O3s5u|BDP2 z2Ar|`1*&U>l$j$Um6<}S8%UedJ}h#i6&U;e^iN61;^A2jOIav0$8u$m2JXK!$b}%( zLg@={+^EY-7~3dk#7sG3i6#G=Z-6=;mGV($j<2kbZ;E{sO%h2~&ml7gc5#4}o8=s& zsp!Tsj#)jo(MBsL`=Nt~xRYcr%g#&d&-0RB5O?-F)70OzbwHv3 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/objectid.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/objectid.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da865a42b2c6a6161e9a746f82e53b856b11cf07 GIT binary patch literal 9117 zcmbtaOLyByb_PI*q9{tXWm|sqtHzI(*e#KkX$s@;h7T8#>CG?`{%flKce79!{8>jLbGA2+G<#;E;I_Nwi~vp zXBsoAE;fp)o^8ycE`+7-Tw~6pIqb09oo~#m_DopmE;JUpi;czZnZ}v!*~VG*ycnMA zE;W|Wo^71xB|i6!(YV0Nd>-}1j}2bo3*Q)g!CxL08ke~Bl~G+BJlT!oFk$Uju;;Nj z2%74XmNY%vHLSK5px8HticqUDcAJqk14{;@DQAlv>$XGUp=HHpz zz#grg!B;m03lbK^lDSMR&hl-ou|TqJKas5E&Bib{ukFBz5ngF2jv>>%}vEJGtw8 z;I$49Hn!S>=Uwj>etS`Ux84hS>p_%AHw@RskE4DZJbhO09V#x@TS**g{?>Yj={ZNZ zLE<|>#!DyQH;Dm76ozTxPgKzI=r;e&pz#n_@-_-->_Z}@H8l1M+~S3yHMF?RXa3&0 zLOd%D-v8K_Om=+sLB;Ud`8 z_hf4KT<<_wc$&`AWI-eq%O;9>dbxm|k)$|EDBj1Tga#RwIEQj-N3_JxaV7tW!Z)B} z2I*I$;M@B%L!(jjXR*H$xBR)G)hPS(`xQK0@E1{@;cJbv+-{uX>%7QkzcCw2{zzwr zX5#|dN^j7z zbY$!sLugdAD$OGj4olpUg(Gta2s=Rg2#V#{Q5pSa=qZ5?$SJsIAa{?VKnBq30jW{s zKOc)nSEl@4`cd$-53S>VBm>BpU|t+0K_Ur{;`a7<3dYtk?sg`WP-Tn~ zeoy!bjYMY>*~G_ap0Ff{JYPL|90f0!-ve;1X=1XOro~%Lc)ZJ2wwM?9BS63!^xqX~ zEd`V=8>xmGTN_jQ;UVLG+wF&PjWsolu2!2(<_RAVK@1>9eP{DEw%hSFopDbFapZ=q z2N3G|ghEXq4rYN45@OO&W`2Z+zb7Eh=1SVG?I1A!h@Q$&0y9oYM>^)({$Q-d2`@ z2YZ1`P9b#V*2d=6?GNtUz4v3cHQ5Fcq#)TZ=hEu;>kd{-3?{~0XAf9^9a_;2Uih2@ zj3{Se0O4`N?PI<5a{ceOp6-8IcfH1!WTz6%u|JS0tNB92BB^Olpvi*vNUBG6S_@Sa z3q98qo0W{`hqDV;;Uk*#yE8#QGEo92$fKALbl1*CIb z09~S#DOdMjOinbdP@`qpt=bp|u$uDZ61Z{@S90aNxLY5&bM>hSl6otQTlKCB4^GsR zxGy}vKDnHxR3uWleIpTOJ1@xrsTR}oPQD4p+4Ca^p!Cyn0Bi=10-w_v1s-W3^dlJm zap!x2T{gZprMYk6t}ukf|Jsu9Gq@#-N7m4U|5UhSd|fy) zjtWCEi?;jMnDU{5dWaA2ce{rgjsU&c_A_tWWjWi~h(`p6GU!f9>uv|S0Rzy9Ia$ws z;&eFHNZ1}!Bx z;o;;2c-##lWl72GXLdC5lZ5T{q1dq2Wc^*KS5GEKXUm7-A?u0w8C;LrxLfDC2i zCrF!|BI(3^xWh2QI1CP}=!MwIGaqxpw2n?(IeN1|&R1(ISOQ;a{_c{a)Frguy^TYfc)TCobdJyF{e3JPcKkUK1 z0112W{_~?u*z=ALgWPOhgEM)p+0?{5$C~3)Z25>HefBFi0{7udtg+2o8@CWvW;~iO z-(;gOPVs>KOmDK5?{<|2uF(t|W4lO$loEjm49X>{rou)&GM{#O9Q;H0VHoAX7eP1+ z?W(ndh_C)$ZE2hR{@RUDUfb3SeEs!=SMX{xar`{DwPO7tr$}$ANqilNism3Gl{z>- zXJoGUO0h|-GulZ(^p^GT9fV$wk`e$b|5azxIRwdZyPfzlEqN|rmAfJ>k`(QA5l*9) zeHaq4h%w>}inM@WjDm45Owu#Q_LPkPSao|RLhiy8|9hA&A>=pSte6#Z(X`F8=3rS< zKGj*nFGVCYNWt$W8b@YQqS)fFBGFcn2GSL_ArY0dt%I^yGZCj`@y8Q`7YJ?#|Malq zdj|=*67I-?XQ4WQRc5{6x*-WLp^>jXT5_?sNtH$x9l;45U~Y!Ssx-FlF6YX&Z`QW- z3H@?+r&9WdcMq1X$BAt-gIg19qj(Mnhp3b? zYRYVAs!Cnb6eeehyxZ=Y+9$0M4SBE;*k*c;Y<# z?D5X-M_)R>e(=fTkHl5<1Z&?!b&^aq%47fQpV24N(wPf|N}*(4HQ%-d=QX9{o+qp5 z-(ox|ri9lcF2EnMz>Y%HQO|5VYfF_Nfd6EP-yJT(LxK`hpWhfyIn;PomXsPl$<$cR zWlH{AynSLkJ<9K+Wr;(O<^6eCp&o5(l-E-V@BRcl{57Q#VI&d0k{>|^A5aR@8Ii)C za0vPoMuCaeN5TyZ0amCyA;#w}THMxyR&&Rx`zLz86`#(dc^-}P6 zFHinvdl~1Ivg8E9{8#8RQo&03%uM;FAx+%D8Y!+UjcE_gXf?~$(UcKr>m=@w z`M$9+B79ZpPjL%etQHl#rp11wQqXi%X(^{PRsIXDmAN?NOXXsC6YXOLO5DJ+f5(*& zbQ^P5&B5iIDYY^2%Cpr6`)ZNn0=}4tMkWIi7OU)mVtg;~4nnwn<9$WG4+jH|doK*U zKqAU$`JPLl=Qv3i%fxY3tCVyMBA<_kohqJbg}`27^Ac+KU$irlL&F|i)ccz3p$$R- zo#;|}L|NoXgTPHlsTDy&5hPpUHr|oDf!2|=Z*zppFa|Rb0%xj6{#!NQ7-d+2=x|^e z`HL*)gg$VkZiCqniW#kM?BIk6iBg*fo)mO28M+kxi1J>Uau$?wrZWHpM93#OUElY#~xiYE*WX^0CdWq{8tLv!CA0%^wgggQIb8AWkg zA~Z<6AV_ENktqz?8JMO;j%+sfafr&YPlHQ33!0^HoC0KQ^z}!1+!MZ1)?tc9eQxAg z!cPJQ!nm5tqt9iF`N^-Y+)P%g^oa|Lyn+HiIO(wCl!yc+JCp8d{#MHk_0a2+E^4`1 zCZwa}$^kGAsmoXDHMN+o#i<42<;PyilA`#aGRgocZj0*uSFCI*J*6~K178`o?SeJD0=@| zL?Md%;Y5KGS5G7AbvXqt{a~W@z=?NGA&TC=7N_uO?}rlwPTV++DB={}s~^=Gt_WBN z2oNh$_R<`z(HCHsb=;(LJfz9ZeU1~&8f9gv=P8a5IeXN_ajHb1LW=36Z2nf92Q37R zE8-qnDI%9{%=;l|Cv)|*?}j6<5%7mB6)>iXe&RhU=!>!X%q-}?0mN-8woo9C(V>hO zENW_hf>26OqCv%|Vokl*Mzm2;|8L-QU2y<7d5hl8t50lM_Ek_+EyzO?6rKrkMa3H^ z(h>q=#K-bbd40-R5I>{052*NvijS%I6%~I)#V1sJO2rNppHcAz6=R@REedayt4%IV zLc1ziwpFqgk=ZVyWn1Nq%Js@prCd5!x>_k#Dy1S?Go=D9{ikNAUKYDF+lN%VL&Z<1 zP%I>aARbe(fg&wt-!>IL8}k#NZd5X(v8bN(4!7_Dq34cFuk!g-2tY1=qoVrAfzy{k zD9F9a&V=$kS%#pPIXzjtd&0KU(oeJFzfb=Gp#FUUJ4Z%9|5+8QVqP{Y1-pP<&-@>c CG5KKt literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/py3compat.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/py3compat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f7735376fdcd924d3ea65c66e5abfe8ecc56a4f GIT binary patch literal 2615 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 mI{vep{`C?o$om#`(#mf$WOqh^uNZvP*~A!-8v literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/regex.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/regex.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f40f47eaf874e1c14b43a7408358d6744c4143f GIT binary patch literal 4070 zcmeHK&2Hn!5oVM6vn)H_Nix~pB#Vv_$JW9lW#J8i2+3e)JjTL+S032j01<+vD6(bI zrbtb9`$vlQ63>I=ns>-8hr9!?Iqf4Pr+n2EC5_ika>y|>*rcnQRn=WzeO209TdV%# zPk;OUUpFl4@7B^)!24&o)hi5v)v*E=*b(b6Je|lMIvt0RtPmB3#ZGZp>Xh(*F(|#Y zI_1x;pd3`*T0uor?wrm_V4qs`mC2`PNfIgEPb8OOB!v>O4&!tFMG~JUuUYF(D((<#%|1v|DNag1cgNNgi17)i@W93v?j$&ry1jHF~FUl~c!NXkYsGLjNW zrVJadv?V!|vM^;)%7!UZDZ5J9ZM~e@Ql!jwI`eXBnpI7P5-i~qfh$1+w0&{^-K2`es6sF$zFeQGxUFs>pX6rHAms-Sr{wr zMbR_)tN1Dj-&{9G;~~YS*;7f}M0mt)V>C`T=GI-ExM8f{r*r-h28$I~g;gKAZTWr7 z`?M&(9K3vnTeUF=3)r$ccECDLV0Q|l7&t-Ut#!vbrQp4w6qMhx4p0@W0AZD&3RJBI zHN01YwO}33)!;k92A;K`io<`B7Ej3E$&X*29=9KW77sk_HNIJeX`k>y7d;911~)r+ z(H3IL?rim;hGW{9vOD$^F8z_|!jxSUahL80+_v`@>}EfSuZ7gyHwY zV%6mXPeGr6RVf-XJi#nCqn2+F>#~(S_ zT_}N4QrHir(yi8FXPiHO{+y3It%Z#FZ?K`pYy&&njgPnMbDP;h134@+XVst`y0NFj zYq2v^@!$sylM?(ZqkgvAdy0b|>_(CBHCU#B5Fl(jf7qUB-EPrIi`%d33(s4xJ?RYv z{8p_cWzRT{6id4;{(?TbM_@eZUBE~d9CP~lcI(~lQp6h#e&fj)q=wVVVSwkOI6|b9 zKn#Mg-xm@@%GEg5-YxgyU?E&qMIlN0CVT`2FV1;)m){IRe?STq@4ntYIq15L#cq~$ zESMR41qX}k9C(B-93tS)hu)aSiO!J;3@@w5cC^b;1Zd&V(=h$cJ~BTuidRb+Kt3;P zx*3R=oDOJ>m+ywZxe{{x?$NrmsTLn-J!&|`x>#o`0mI9MkLzQQ+B>qTO&QO&Oq)cR5paLbIlC(U7mVAQ$P{JHP0(TpehPkuh zd$e?Q3Fi$6R275uL6zC~tJ#zHP7Dz*tul4ScW4CqI`6Os*lZR2aK$apYtzVfZ(8Xjf+ z5{-Z=+8G$Y=}K)Ak-#Ak?l)1zyn#YjvG% zu##P6HEI)Vn@!d;IOj{>DaK@VpT7MVLtc#K=G3~dQF`r5JK=aoS-x;CQHFKl6ul|{ z$=dZ|wk1lwg@frjO6%cp6p0}yQv`Ke{sarsVgmk>_uVhKu6To+94KM1;PU(Sq?S8O zlkIo>B?2)1Qp!%zJY3qf%paqBW={STvkw@Hh3gJ6rAUp%7KUhI-rQ18IX@S)?PzXs z2C#O)`u0<@X16D6#>bs4xy!d?9d=C+4fim!<@@FlD(cBycLa^O1M|>iQ;)kq9kmGx zf?@h0<~i8Je%700eM8=m7|*&K9m&6Gla})H|D|zJ;{PY5k+;ys3|d_+$L^vVG1XXl zp;|C2`j3{l^;=!kN@PbO?{zHyOOSd1mQ90&#W8Ej7pDT3+>*X6ww zBA=lajq?DR@iUTb(@>{@erhcZRJBc&CzdiaSHbU~f?ea)A5=;OyW&(FGY_79Mr-Lr zIu-g+)xd4qhR(YAcQoG1s#!+3M97A9(^A$*8Z}F%jVGpSsQfzH_;aEJ(=x!YU1J+g H<;lMQ5|=%K literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/son.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/son.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db3ee8f5d85f62dba827ce30412bd18da260fe71 GIT binary patch literal 6373 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/tz_util.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/bson/__pycache__/tz_util.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8271a45d3115887a35f02fdde9410833790edcac GIT binary patch literal 1511 zcma)6&5k2A5VqZ&q|=*WhG7s$Akh*C(b7(u)q;T4YPDkd5tj^Nhf8ZEZ>R0fc&Go? zc7{!q+w7Hh;L4Nm4!&~Y!W|?esyfM%8O;Glt}5H*`o5})`|jRe_}4GLJ^8ao$nRul z_+USTY3_j#Bqf3hR?>>4tnyNi63GO;q^bWc5uWg065&hl(o1`?2cEr4mi9&eF^LDu z4^CAjmrX4rEz8VG5zVbCl~vM2MWdrHAD>Lde*g-JnHySg7P7RN>)WNOizdgD?O)O4!|2_W0sk*cFg)pH9xWoB$t=%$K(Jbg3{!wANARa?qR);6=MsiSFTAhpiN zp2_I@g*}7ar^aTr$h3$`HPxA3M54*(uWogL?w?uP-b)fVG2^zoH*WMS+1yA36b)I8 z&umq`zpl!0Gkqp=YaTr1<1WZovQV|EXA$Q!@UE53^vrM`$vT^skV32S^Aa7BC~w*Y zSnG?q2c^V;8s{UJ<|7c6tf-}zOdqc3if~qsEL~ASf9_T*278_$P)|0AsT*u+75gq! zM%9>jE;V+{9r2xdbH1*$JG{DEXO)aS=NnlTuD|i|aralEM-b+3nY3D6KsAz!OeaNC z3aL$!pC`7wQ%ql6h)>LC{L_58IKOkZSpHPyAH$f{$!XH6_PC=|mdE;wdfuq#7fHLQ zntIkGQ`6LmU2^|un}Dz?c_1uy5$sIV4%i)y9y%X6?uk} z77VIHCo$6l*wq*^rh14rx~;_?SZ@DX`#ywCgE0wRzH=4)N}Kb}2i#C2kB&nh4CJsz zryV+wKw!s&y$(K{+k9R37(BMHZ|=gr^7wy%U8ZY5eE>19Bf=ZU2H)O+JKTj^AK#3H zUnsjx&H3rqKb&lGyAjG0#wI&B`@1-BHi?JWd8EU+3puYEF)z^`asGUsm79|R=kQQD z*RNqd`zT&Vafspw#eXgBEbOaBvTwmOxE1t$77PLpf8B}m;IlG`2l{O|b;0(*caKNo ho78Whz#z_p7Tg5kg8OU650H}yLHO(d5DwlA>A&Tbbx;5R literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/bson/_cbson.cpython-36m-darwin.so b/mongo_mac/lib/python3.6/site-packages/bson/_cbson.cpython-36m-darwin.so new file mode 100755 index 0000000000000000000000000000000000000000..3e8116108a7492b1bbaa08d3ffc9cfde1fdcc561 GIT binary patch literal 55768 zcmeFa34ByV7B74|3xxFsg^^K^7Ndd-5+zCmGz|&dmJUP#WgIbtq#==z#H5==Spw+@ z*QPb@%#7n?Mx9|C$3aIK+!H_uu0cmdQDIzf8yDOFMd|ndSJmyl>A=jq-|v0jd++;f zs9SZaPMtb+s_N9K<=(vf{bz@}Ynm%n)3gk@-f%VPn$`%Pzn{YmOVPCA;^_r5r;Di0 zkEYI`reM(2Kt}7Pl8cK2{>6a=ZZf?lh4|!Ri9_2^JUE1%h+x;!(-;d@E#9 z8hGcAuuBHTGegl!@JD*Z<^IYVe=RVQ=@qS%nJXzM{0J-3GNKEArFDVYimG`swF|u` zLoy+kg2K;+C6q)Pk;TQO)m3!~0VeaOt(7_5ia)}gdNApKwbL$6t-2 zw?PSuu#+C^Th@tQSxKNI5s@rE_pLH56SC!x@V{@@IdzFq(Y3xKZ+^_^LW%Ork}o|@LDr*^sxGY&uM$cX=exP zYR|5$m_s*hNnOCdV8r+lWlI173BOa}NVn-Pnl=;ua0Od{N$dabzZr)4q35z`hWWME zJZx;AAY=kxv;}<5QJS$`3@Ia$^W8E{v+iGlC^OY)YzYJmbGx;9G2q4){k92ipu7(h zpLxIv39JbjM9U-EZ{lbt0d0punlHY@ z5PW3$%$N_k8@6VkFi-KU=ts;IM%~RlU=29Iw~;lTzGdzReMpGK$IJIjpXN1R_nHU1 z<_|`A@GMLxEb{_u1*JA-W@exorC5Ji6ldpZ5J#!jAi>R6a1*>DQD(;!s}Z;z$ITVL zczNW%RuMsP9)pc7LCY`)N5iOZrYbIYb7A8Lfo|SdT2@DDLG}kebMG%bSBlzg0mV2y zTYjDys6mn4jSAXXH(z9OX1ps!CTI8}6MFa}(+2t?v)Uo%Q?H4{Byg)e+EPLwR*>OaC!O8biGeKlssGi_pgm^f4oxYQ)%H1L1j|VUNo< z56b4c(lbj|8q};yz@XRMD#-U_iLwZgiv_wvUQ2H8*k-*OgxH_y(!P|B(eUX&BQj0{ z{{`8fW$(AjfNPlP^KKBWpodPubZSJ>FNZhR(5qSyK0}4u=IWJjEBbtb0fP7~(1=i4(?1x9MD@!f`qe3Y>9^BTSuWw+ft`G1tnv zy<*)6Gr((ZD{S1ahYDeCpyET;Xxh`?LYG+CsJLpnd`k8-0dEJ+j^#++io9~v>7kFI z=h5g-A)cN0EP>gbgKr3X?#SpiAb4Ya^+wJJ-ta`U%7N%>%oQJj-f(x|>Y?8VTH`F1 zG22l_gNV<0OO>%hus$h+W2&!{3Zh76x+IfLGCy~a87s-0rpT<4WHP&wp|;aQeI%Jb zQ_s8tBf_pRC4?H^MKy#PkC9~1Ig_~=D9CIR=;MZxo3Mk-gObe86*u1?$!ks;*_F&l zL1u*{GlFFD9c1Q7GAAoCf0blLcO^4gkQpt>9Ac$@gk^76$}P$4Qen)-(s1g_6wu)W#t5B$6PT z@~&jc1(`{bOfQn@?I1%75tZtu$OI*snyzGO1Q}YdsMHq9W=su>+zO4VhxS4nBmM!# z{}u6ee_Ai%bM90!`J#^#q0H zGrzJXp@7DgCDS{GdACn00=v*sAacBe2-H?k?--Cs?;FSvv&*24Or^=le!=ACupU;v5J*OFyA3`9RVZ7-eAjwVVD~a&I}EcI%0AI( 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 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/bson/binary.py b/mongo_mac/lib/python3.6/site-packages/bson/binary.py new file mode 100644 index 0000000..1360e74 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/bson/binary.py @@ -0,0 +1,242 @@ +# Copyright 2009-present MongoDB, Inc. +# +# 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. + +from uuid import UUID + +from bson.py3compat import PY3 + +"""Tools for representing BSON binary data. +""" + +BINARY_SUBTYPE = 0 +"""BSON binary subtype for binary data. + +This is the default subtype for binary data. +""" + +FUNCTION_SUBTYPE = 1 +"""BSON binary subtype for functions. +""" + +OLD_BINARY_SUBTYPE = 2 +"""Old BSON binary subtype for binary data. + +This is the old default subtype, the current +default is :data:`BINARY_SUBTYPE`. +""" + +OLD_UUID_SUBTYPE = 3 +"""Old BSON binary subtype for a UUID. + +:class:`uuid.UUID` instances will automatically be encoded +by :mod:`bson` using this subtype. + +.. versionadded:: 2.1 +""" + +UUID_SUBTYPE = 4 +"""BSON binary subtype for a UUID. + +This is the new BSON binary subtype for UUIDs. The +current default is :data:`OLD_UUID_SUBTYPE`. + +.. versionchanged:: 2.1 + Changed to subtype 4. +""" + +STANDARD = UUID_SUBTYPE +"""The standard UUID representation. + +:class:`uuid.UUID` instances will automatically be encoded to +and decoded from BSON binary, using RFC-4122 byte order with +binary subtype :data:`UUID_SUBTYPE`. + +.. versionadded:: 3.0 +""" + +PYTHON_LEGACY = OLD_UUID_SUBTYPE +"""The Python legacy UUID representation. + +:class:`uuid.UUID` instances will automatically be encoded to +and decoded from BSON binary, using RFC-4122 byte order with +binary subtype :data:`OLD_UUID_SUBTYPE`. + +.. versionadded:: 3.0 +""" + +JAVA_LEGACY = 5 +"""The Java legacy UUID representation. + +:class:`uuid.UUID` instances will automatically be encoded to +and decoded from BSON binary subtype :data:`OLD_UUID_SUBTYPE`, +using the Java driver's legacy byte order. + +.. versionchanged:: 3.6 + BSON binary subtype 4 is decoded using RFC-4122 byte order. +.. versionadded:: 2.3 +""" + +CSHARP_LEGACY = 6 +"""The C#/.net legacy UUID representation. + +:class:`uuid.UUID` instances will automatically be encoded to +and decoded from BSON binary subtype :data:`OLD_UUID_SUBTYPE`, +using the C# driver's legacy byte order. + +.. versionchanged:: 3.6 + BSON binary subtype 4 is decoded using RFC-4122 byte order. +.. versionadded:: 2.3 +""" + +ALL_UUID_SUBTYPES = (OLD_UUID_SUBTYPE, UUID_SUBTYPE) +ALL_UUID_REPRESENTATIONS = (STANDARD, PYTHON_LEGACY, JAVA_LEGACY, CSHARP_LEGACY) +UUID_REPRESENTATION_NAMES = { + PYTHON_LEGACY: 'PYTHON_LEGACY', + STANDARD: 'STANDARD', + JAVA_LEGACY: 'JAVA_LEGACY', + CSHARP_LEGACY: 'CSHARP_LEGACY'} + +MD5_SUBTYPE = 5 +"""BSON binary subtype for an MD5 hash. +""" + +USER_DEFINED_SUBTYPE = 128 +"""BSON binary subtype for any user defined structure. +""" + + +class Binary(bytes): + """Representation of BSON binary data. + + This is necessary because we want to represent Python strings as + the BSON string type. We need to wrap binary data so we can tell + the difference between what should be considered binary data and + what should be considered a string when we encode to BSON. + + Raises TypeError if `data` is not an instance of :class:`bytes` + (:class:`str` in python 2) or `subtype` is not an instance of + :class:`int`. Raises ValueError if `subtype` is not in [0, 256). + + .. note:: + In python 3 instances of Binary with subtype 0 will be decoded + directly to :class:`bytes`. + + :Parameters: + - `data`: the binary data to represent + - `subtype` (optional): the `binary subtype + `_ + to use + """ + + _type_marker = 5 + + def __new__(cls, data, subtype=BINARY_SUBTYPE): + if not isinstance(data, bytes): + raise TypeError("data must be an instance of bytes") + if not isinstance(subtype, int): + raise TypeError("subtype must be an instance of int") + if subtype >= 256 or subtype < 0: + raise ValueError("subtype must be contained in [0, 256)") + self = bytes.__new__(cls, data) + self.__subtype = subtype + return self + + @property + def subtype(self): + """Subtype of this binary data. + """ + return self.__subtype + + def __getnewargs__(self): + # Work around http://bugs.python.org/issue7382 + data = super(Binary, self).__getnewargs__()[0] + if PY3 and not isinstance(data, bytes): + data = data.encode('latin-1') + return data, self.__subtype + + def __eq__(self, other): + if isinstance(other, Binary): + return ((self.__subtype, bytes(self)) == + (other.subtype, bytes(other))) + # We don't return NotImplemented here because if we did then + # Binary("foo") == "foo" would return True, since Binary is a + # subclass of str... + return False + + def __hash__(self): + return super(Binary, self).__hash__() ^ hash(self.__subtype) + + def __ne__(self, other): + return not self == other + + def __repr__(self): + return "Binary(%s, %s)" % (bytes.__repr__(self), self.__subtype) + + +class UUIDLegacy(Binary): + """UUID wrapper to support working with UUIDs stored as PYTHON_LEGACY. + + .. doctest:: + + >>> import uuid + >>> from bson.binary import Binary, UUIDLegacy, STANDARD + >>> from bson.codec_options import CodecOptions + >>> my_uuid = uuid.uuid4() + >>> coll = db.get_collection('test', + ... CodecOptions(uuid_representation=STANDARD)) + >>> coll.insert_one({'uuid': Binary(my_uuid.bytes, 3)}).inserted_id + ObjectId('...') + >>> coll.count_documents({'uuid': my_uuid}) + 0 + >>> coll.count_documents({'uuid': UUIDLegacy(my_uuid)}) + 1 + >>> coll.find({'uuid': UUIDLegacy(my_uuid)})[0]['uuid'] + UUID('...') + >>> + >>> # Convert from subtype 3 to subtype 4 + >>> doc = coll.find_one({'uuid': UUIDLegacy(my_uuid)}) + >>> coll.replace_one({"_id": doc["_id"]}, doc).matched_count + 1 + >>> coll.count_documents({'uuid': UUIDLegacy(my_uuid)}) + 0 + >>> coll.count_documents({'uuid': {'$in': [UUIDLegacy(my_uuid), my_uuid]}}) + 1 + >>> coll.find_one({'uuid': my_uuid})['uuid'] + UUID('...') + + Raises TypeError if `obj` is not an instance of :class:`~uuid.UUID`. + + :Parameters: + - `obj`: An instance of :class:`~uuid.UUID`. + """ + + def __new__(cls, obj): + if not isinstance(obj, UUID): + raise TypeError("obj must be an instance of uuid.UUID") + self = Binary.__new__(cls, obj.bytes, OLD_UUID_SUBTYPE) + self.__uuid = obj + return self + + def __getnewargs__(self): + # Support copy and deepcopy + return (self.__uuid,) + + @property + def uuid(self): + """UUID instance wrapped by this UUIDLegacy instance. + """ + return self.__uuid + + def __repr__(self): + return "UUIDLegacy('%s')" % self.__uuid diff --git a/mongo_mac/lib/python3.6/site-packages/bson/code.py b/mongo_mac/lib/python3.6/site-packages/bson/code.py new file mode 100644 index 0000000..3f6e504 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/bson/code.py @@ -0,0 +1,99 @@ +# Copyright 2009-present MongoDB, Inc. +# +# 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. + +"""Tools for representing JavaScript code in BSON. +""" + +from bson.py3compat import abc, string_type, PY3, text_type + + +class Code(str): + """BSON's JavaScript code type. + + Raises :class:`TypeError` if `code` is not an instance of + :class:`basestring` (:class:`str` in python 3) or `scope` + is not ``None`` or an instance of :class:`dict`. + + Scope variables can be set by passing a dictionary as the `scope` + argument or by using keyword arguments. If a variable is set as a + keyword argument it will override any setting for that variable in + the `scope` dictionary. + + :Parameters: + - `code`: A string containing JavaScript code to be evaluated or another + instance of Code. In the latter case, the scope of `code` becomes this + Code's :attr:`scope`. + - `scope` (optional): dictionary representing the scope in which + `code` should be evaluated - a mapping from identifiers (as + strings) to values. Defaults to ``None``. This is applied after any + scope associated with a given `code` above. + - `**kwargs` (optional): scope variables can also be passed as + keyword arguments. These are applied after `scope` and `code`. + + .. versionchanged:: 3.4 + The default value for :attr:`scope` is ``None`` instead of ``{}``. + + """ + + _type_marker = 13 + + def __new__(cls, code, scope=None, **kwargs): + if not isinstance(code, string_type): + raise TypeError("code must be an " + "instance of %s" % (string_type.__name__)) + + if not PY3 and isinstance(code, text_type): + self = str.__new__(cls, code.encode('utf8')) + else: + self = str.__new__(cls, code) + + try: + self.__scope = code.scope + except AttributeError: + self.__scope = None + + if scope is not None: + if not isinstance(scope, abc.Mapping): + raise TypeError("scope must be an instance of dict") + if self.__scope is not None: + self.__scope.update(scope) + else: + self.__scope = scope + + if kwargs: + if self.__scope is not None: + self.__scope.update(kwargs) + else: + self.__scope = kwargs + + return self + + @property + def scope(self): + """Scope dictionary for this instance or ``None``. + """ + return self.__scope + + def __repr__(self): + return "Code(%s, %r)" % (str.__repr__(self), self.__scope) + + def __eq__(self, other): + if isinstance(other, Code): + return (self.__scope, str(self)) == (other.__scope, str(other)) + return False + + __hash__ = None + + def __ne__(self, other): + return not self == other diff --git a/mongo_mac/lib/python3.6/site-packages/bson/codec_options.py b/mongo_mac/lib/python3.6/site-packages/bson/codec_options.py new file mode 100644 index 0000000..471d695 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/bson/codec_options.py @@ -0,0 +1,334 @@ +# Copyright 2014-present MongoDB, Inc. +# +# 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. + +"""Tools for specifying BSON codec options.""" + +import datetime + +from abc import abstractmethod +from collections import namedtuple + +from bson.py3compat import ABC, abc, abstractproperty, string_type + +from bson.binary import (ALL_UUID_REPRESENTATIONS, + PYTHON_LEGACY, + UUID_REPRESENTATION_NAMES) + + +_RAW_BSON_DOCUMENT_MARKER = 101 + + +def _raw_document_class(document_class): + """Determine if a document_class is a RawBSONDocument class.""" + marker = getattr(document_class, '_type_marker', None) + return marker == _RAW_BSON_DOCUMENT_MARKER + + +class TypeEncoder(ABC): + """Base class for defining type codec classes which describe how a + custom type can be transformed to one of the types BSON understands. + + Codec classes must implement the ``python_type`` attribute, and the + ``transform_python`` method to support encoding. + + See :ref:`custom-type-type-codec` documentation for an example. + """ + @abstractproperty + def python_type(self): + """The Python type to be converted into something serializable.""" + pass + + @abstractmethod + def transform_python(self, value): + """Convert the given Python object into something serializable.""" + pass + + +class TypeDecoder(ABC): + """Base class for defining type codec classes which describe how a + BSON type can be transformed to a custom type. + + Codec classes must implement the ``bson_type`` attribute, and the + ``transform_bson`` method to support decoding. + + See :ref:`custom-type-type-codec` documentation for an example. + """ + @abstractproperty + def bson_type(self): + """The BSON type to be converted into our own type.""" + pass + + @abstractmethod + def transform_bson(self, value): + """Convert the given BSON value into our own type.""" + pass + + +class TypeCodec(TypeEncoder, TypeDecoder): + """Base class for defining type codec classes which describe how a + custom type can be transformed to/from one of the types :mod:`bson` + can already encode/decode. + + Codec classes must implement the ``python_type`` attribute, and the + ``transform_python`` method to support encoding, as well as the + ``bson_type`` attribute, and the ``transform_bson`` method to support + decoding. + + See :ref:`custom-type-type-codec` documentation for an example. + """ + pass + + +class TypeRegistry(object): + """Encapsulates type codecs used in encoding and / or decoding BSON, as + well as the fallback encoder. Type registries cannot be modified after + instantiation. + + ``TypeRegistry`` can be initialized with an iterable of type codecs, and + a callable for the fallback encoder:: + + >>> from bson.codec_options import TypeRegistry + >>> type_registry = TypeRegistry([Codec1, Codec2, Codec3, ...], + ... fallback_encoder) + + See :ref:`custom-type-type-registry` documentation for an example. + + :Parameters: + - `type_codecs` (optional): iterable of type codec instances. If + ``type_codecs`` contains multiple codecs that transform a single + python or BSON type, the transformation specified by the type codec + occurring last prevails. A TypeError will be raised if one or more + type codecs modify the encoding behavior of a built-in :mod:`bson` + type. + - `fallback_encoder` (optional): callable that accepts a single, + unencodable python value and transforms it into a type that + :mod:`bson` can encode. See :ref:`fallback-encoder-callable` + documentation for an example. + """ + def __init__(self, type_codecs=None, fallback_encoder=None): + self.__type_codecs = list(type_codecs or []) + self._fallback_encoder = fallback_encoder + self._encoder_map = {} + self._decoder_map = {} + + if self._fallback_encoder is not None: + if not callable(fallback_encoder): + raise TypeError("fallback_encoder %r is not a callable" % ( + fallback_encoder)) + + for codec in self.__type_codecs: + is_valid_codec = False + if isinstance(codec, TypeEncoder): + self._validate_type_encoder(codec) + is_valid_codec = True + self._encoder_map[codec.python_type] = codec.transform_python + if isinstance(codec, TypeDecoder): + is_valid_codec = True + self._decoder_map[codec.bson_type] = codec.transform_bson + if not is_valid_codec: + raise TypeError( + "Expected an instance of %s, %s, or %s, got %r instead" % ( + TypeEncoder.__name__, TypeDecoder.__name__, + TypeCodec.__name__, codec)) + + def _validate_type_encoder(self, codec): + from bson import _BUILT_IN_TYPES + for pytype in _BUILT_IN_TYPES: + if issubclass(codec.python_type, pytype): + err_msg = ("TypeEncoders cannot change how built-in types are " + "encoded (encoder %s transforms type %s)" % + (codec, pytype)) + raise TypeError(err_msg) + + def __repr__(self): + return ('%s(type_codecs=%r, fallback_encoder=%r)' % ( + self.__class__.__name__, self.__type_codecs, + self._fallback_encoder)) + + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + return ((self._decoder_map == other._decoder_map) and + (self._encoder_map == other._encoder_map) and + (self._fallback_encoder == other._fallback_encoder)) + + +_options_base = namedtuple( + 'CodecOptions', + ('document_class', 'tz_aware', 'uuid_representation', + 'unicode_decode_error_handler', 'tzinfo', 'type_registry')) + + +class CodecOptions(_options_base): + """Encapsulates options used encoding and / or decoding BSON. + + The `document_class` option is used to define a custom type for use + decoding BSON documents. Access to the underlying raw BSON bytes for + a document is available using the :class:`~bson.raw_bson.RawBSONDocument` + type:: + + >>> from bson.raw_bson import RawBSONDocument + >>> from bson.codec_options import CodecOptions + >>> codec_options = CodecOptions(document_class=RawBSONDocument) + >>> coll = db.get_collection('test', codec_options=codec_options) + >>> doc = coll.find_one() + >>> doc.raw + '\\x16\\x00\\x00\\x00\\x07_id\\x00[0\\x165\\x91\\x10\\xea\\x14\\xe8\\xc5\\x8b\\x93\\x00' + + The document class can be any type that inherits from + :class:`~collections.MutableMapping`:: + + >>> class AttributeDict(dict): + ... # A dict that supports attribute access. + ... def __getattr__(self, key): + ... return self[key] + ... def __setattr__(self, key, value): + ... self[key] = value + ... + >>> codec_options = CodecOptions(document_class=AttributeDict) + >>> coll = db.get_collection('test', codec_options=codec_options) + >>> doc = coll.find_one() + >>> doc._id + ObjectId('5b3016359110ea14e8c58b93') + + See :doc:`/examples/datetimes` for examples using the `tz_aware` and + `tzinfo` options. + + See :class:`~bson.binary.UUIDLegacy` for examples using the + `uuid_representation` option. + + :Parameters: + - `document_class`: BSON documents returned in queries will be decoded + to an instance of this class. Must be a subclass of + :class:`~collections.MutableMapping`. Defaults to :class:`dict`. + - `tz_aware`: If ``True``, BSON datetimes will be decoded to timezone + aware instances of :class:`~datetime.datetime`. Otherwise they will be + naive. Defaults to ``False``. + - `uuid_representation`: The BSON representation to use when encoding + and decoding instances of :class:`~uuid.UUID`. Defaults to + :data:`~bson.binary.PYTHON_LEGACY`. + - `unicode_decode_error_handler`: The error handler to apply when + a Unicode-related error occurs during BSON decoding that would + otherwise raise :exc:`UnicodeDecodeError`. Valid options include + 'strict', 'replace', and 'ignore'. Defaults to 'strict'. + - `tzinfo`: A :class:`~datetime.tzinfo` subclass that specifies the + timezone to/from which :class:`~datetime.datetime` objects should be + encoded/decoded. + - `type_registry`: Instance of :class:`TypeRegistry` used to customize + encoding and decoding behavior. + + .. versionadded:: 3.8 + `type_registry` attribute. + + .. warning:: Care must be taken when changing + `unicode_decode_error_handler` from its default value ('strict'). + The 'replace' and 'ignore' modes should not be used when documents + retrieved from the server will be modified in the client application + and stored back to the server. + """ + + def __new__(cls, document_class=dict, + tz_aware=False, uuid_representation=PYTHON_LEGACY, + unicode_decode_error_handler="strict", + tzinfo=None, type_registry=None): + if not (issubclass(document_class, abc.MutableMapping) or + _raw_document_class(document_class)): + raise TypeError("document_class must be dict, bson.son.SON, " + "bson.raw_bson.RawBSONDocument, or a " + "sublass of collections.MutableMapping") + if not isinstance(tz_aware, bool): + raise TypeError("tz_aware must be True or False") + if uuid_representation not in ALL_UUID_REPRESENTATIONS: + raise ValueError("uuid_representation must be a value " + "from bson.binary.ALL_UUID_REPRESENTATIONS") + if not isinstance(unicode_decode_error_handler, (string_type, None)): + raise ValueError("unicode_decode_error_handler must be a string " + "or None") + if tzinfo is not None: + if not isinstance(tzinfo, datetime.tzinfo): + raise TypeError( + "tzinfo must be an instance of datetime.tzinfo") + if not tz_aware: + raise ValueError( + "cannot specify tzinfo without also setting tz_aware=True") + + type_registry = type_registry or TypeRegistry() + + if not isinstance(type_registry, TypeRegistry): + raise TypeError("type_registry must be an instance of TypeRegistry") + + return tuple.__new__( + cls, (document_class, tz_aware, uuid_representation, + unicode_decode_error_handler, tzinfo, type_registry)) + + def _arguments_repr(self): + """Representation of the arguments used to create this object.""" + document_class_repr = ( + 'dict' if self.document_class is dict + else repr(self.document_class)) + + uuid_rep_repr = UUID_REPRESENTATION_NAMES.get(self.uuid_representation, + self.uuid_representation) + + return ('document_class=%s, tz_aware=%r, uuid_representation=%s, ' + 'unicode_decode_error_handler=%r, tzinfo=%r, ' + 'type_registry=%r' % + (document_class_repr, self.tz_aware, uuid_rep_repr, + self.unicode_decode_error_handler, self.tzinfo, + self.type_registry)) + + def __repr__(self): + return '%s(%s)' % (self.__class__.__name__, self._arguments_repr()) + + def with_options(self, **kwargs): + """Make a copy of this CodecOptions, overriding some options:: + + >>> from bson.codec_options import DEFAULT_CODEC_OPTIONS + >>> DEFAULT_CODEC_OPTIONS.tz_aware + False + >>> options = DEFAULT_CODEC_OPTIONS.with_options(tz_aware=True) + >>> options.tz_aware + True + + .. versionadded:: 3.5 + """ + return CodecOptions( + kwargs.get('document_class', self.document_class), + kwargs.get('tz_aware', self.tz_aware), + kwargs.get('uuid_representation', self.uuid_representation), + kwargs.get('unicode_decode_error_handler', + self.unicode_decode_error_handler), + kwargs.get('tzinfo', self.tzinfo), + kwargs.get('type_registry', self.type_registry) + ) + + +DEFAULT_CODEC_OPTIONS = CodecOptions() + + +def _parse_codec_options(options): + """Parse BSON codec options.""" + return CodecOptions( + document_class=options.get( + 'document_class', DEFAULT_CODEC_OPTIONS.document_class), + tz_aware=options.get( + 'tz_aware', DEFAULT_CODEC_OPTIONS.tz_aware), + uuid_representation=options.get( + 'uuidrepresentation', DEFAULT_CODEC_OPTIONS.uuid_representation), + unicode_decode_error_handler=options.get( + 'unicode_decode_error_handler', + DEFAULT_CODEC_OPTIONS.unicode_decode_error_handler), + tzinfo=options.get('tzinfo', DEFAULT_CODEC_OPTIONS.tzinfo), + type_registry=options.get( + 'type_registry', DEFAULT_CODEC_OPTIONS.type_registry)) diff --git a/mongo_mac/lib/python3.6/site-packages/bson/dbref.py b/mongo_mac/lib/python3.6/site-packages/bson/dbref.py new file mode 100644 index 0000000..3ec5463 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/bson/dbref.py @@ -0,0 +1,135 @@ +# Copyright 2009-2015 MongoDB, Inc. +# +# 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. + +"""Tools for manipulating DBRefs (references to MongoDB documents).""" + +from copy import deepcopy + +from bson.py3compat import iteritems, string_type +from bson.son import SON + + +class DBRef(object): + """A reference to a document stored in MongoDB. + """ + + # DBRef isn't actually a BSON "type" so this number was arbitrarily chosen. + _type_marker = 100 + + def __init__(self, collection, id, database=None, _extra={}, **kwargs): + """Initialize a new :class:`DBRef`. + + Raises :class:`TypeError` if `collection` or `database` is not + an instance of :class:`basestring` (:class:`str` in python 3). + `database` is optional and allows references to documents to work + across databases. Any additional keyword arguments will create + additional fields in the resultant embedded document. + + :Parameters: + - `collection`: name of the collection the document is stored in + - `id`: the value of the document's ``"_id"`` field + - `database` (optional): name of the database to reference + - `**kwargs` (optional): additional keyword arguments will + create additional, custom fields + + .. mongodoc:: dbrefs + """ + if not isinstance(collection, string_type): + raise TypeError("collection must be an " + "instance of %s" % string_type.__name__) + if database is not None and not isinstance(database, string_type): + raise TypeError("database must be an " + "instance of %s" % string_type.__name__) + + self.__collection = collection + self.__id = id + self.__database = database + kwargs.update(_extra) + self.__kwargs = kwargs + + @property + def collection(self): + """Get the name of this DBRef's collection as unicode. + """ + return self.__collection + + @property + def id(self): + """Get this DBRef's _id. + """ + return self.__id + + @property + def database(self): + """Get the name of this DBRef's database. + + Returns None if this DBRef doesn't specify a database. + """ + return self.__database + + def __getattr__(self, key): + try: + return self.__kwargs[key] + except KeyError: + raise AttributeError(key) + + # Have to provide __setstate__ to avoid + # infinite recursion since we override + # __getattr__. + def __setstate__(self, state): + self.__dict__.update(state) + + def as_doc(self): + """Get the SON document representation of this DBRef. + + Generally not needed by application developers + """ + doc = SON([("$ref", self.collection), + ("$id", self.id)]) + if self.database is not None: + doc["$db"] = self.database + doc.update(self.__kwargs) + return doc + + def __repr__(self): + extra = "".join([", %s=%r" % (k, v) + for k, v in iteritems(self.__kwargs)]) + if self.database is None: + return "DBRef(%r, %r%s)" % (self.collection, self.id, extra) + return "DBRef(%r, %r, %r%s)" % (self.collection, self.id, + self.database, extra) + + def __eq__(self, other): + if isinstance(other, DBRef): + us = (self.__database, self.__collection, + self.__id, self.__kwargs) + them = (other.__database, other.__collection, + other.__id, other.__kwargs) + return us == them + return NotImplemented + + def __ne__(self, other): + return not self == other + + def __hash__(self): + """Get a hash value for this :class:`DBRef`.""" + return hash((self.__collection, self.__id, self.__database, + tuple(sorted(self.__kwargs.items())))) + + def __deepcopy__(self, memo): + """Support function for `copy.deepcopy()`.""" + return DBRef(deepcopy(self.__collection, memo), + deepcopy(self.__id, memo), + deepcopy(self.__database, memo), + deepcopy(self.__kwargs, memo)) diff --git a/mongo_mac/lib/python3.6/site-packages/bson/decimal128.py b/mongo_mac/lib/python3.6/site-packages/bson/decimal128.py new file mode 100644 index 0000000..0c0fc10 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/bson/decimal128.py @@ -0,0 +1,335 @@ +# Copyright 2016-present MongoDB, Inc. +# +# 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. + +"""Tools for working with the BSON decimal128 type. + +.. versionadded:: 3.4 + +.. note:: The Decimal128 BSON type requires MongoDB 3.4+. +""" + +import decimal +import struct +import sys + +from bson.py3compat import (PY3 as _PY3, + string_type as _string_type) + + +if _PY3: + _from_bytes = int.from_bytes # pylint: disable=no-member, invalid-name +else: + import binascii + def _from_bytes(value, dummy, _int=int, _hexlify=binascii.hexlify): + "An implementation of int.from_bytes for python 2.x." + return _int(_hexlify(value), 16) + + +_PACK_64 = struct.Struct("= 3.3, cdecimal + decimal.Context(clamp=1) # pylint: disable=unexpected-keyword-arg + _CTX_OPTIONS['clamp'] = 1 +except TypeError: + # Python < 3.3 + _CTX_OPTIONS['_clamp'] = 1 + +_DEC128_CTX = decimal.Context(**_CTX_OPTIONS.copy()) + + +def create_decimal128_context(): + """Returns an instance of :class:`decimal.Context` appropriate + for working with IEEE-754 128-bit decimal floating point values. + """ + opts = _CTX_OPTIONS.copy() + opts['traps'] = [] + return decimal.Context(**opts) + + +def _decimal_to_128(value): + """Converts a decimal.Decimal to BID (high bits, low bits). + + :Parameters: + - `value`: An instance of decimal.Decimal + """ + with decimal.localcontext(_DEC128_CTX) as ctx: + value = ctx.create_decimal(value) + + if value.is_infinite(): + return _NINF if value.is_signed() else _PINF + + sign, digits, exponent = value.as_tuple() + + if value.is_nan(): + if digits: + raise ValueError("NaN with debug payload is not supported") + if value.is_snan(): + return _NSNAN if value.is_signed() else _PSNAN + return _NNAN if value.is_signed() else _PNAN + + significand = int("".join([str(digit) for digit in digits])) + bit_length = significand.bit_length() + + high = 0 + low = 0 + for i in range(min(64, bit_length)): + if significand & (1 << i): + low |= 1 << i + + for i in range(64, bit_length): + if significand & (1 << i): + high |= 1 << (i - 64) + + biased_exponent = exponent + _EXPONENT_BIAS + + if high >> 49 == 1: + high = high & 0x7fffffffffff + high |= _EXPONENT_MASK + high |= (biased_exponent & 0x3fff) << 47 + else: + high |= biased_exponent << 49 + + if sign: + high |= _SIGN + + return high, low + + +class Decimal128(object): + """BSON Decimal128 type:: + + >>> Decimal128(Decimal("0.0005")) + Decimal128('0.0005') + >>> Decimal128("0.0005") + Decimal128('0.0005') + >>> Decimal128((3474527112516337664, 5)) + Decimal128('0.0005') + + :Parameters: + - `value`: An instance of :class:`decimal.Decimal`, string, or tuple of + (high bits, low bits) from Binary Integer Decimal (BID) format. + + .. note:: :class:`~Decimal128` uses an instance of :class:`decimal.Context` + configured for IEEE-754 Decimal128 when validating parameters. + Signals like :class:`decimal.InvalidOperation`, :class:`decimal.Inexact`, + and :class:`decimal.Overflow` are trapped and raised as exceptions:: + + >>> Decimal128(".13.1") + Traceback (most recent call last): + File "", line 1, in + ... + decimal.InvalidOperation: [] + >>> + >>> Decimal128("1E-6177") + Traceback (most recent call last): + File "", line 1, in + ... + decimal.Inexact: [] + >>> + >>> Decimal128("1E6145") + Traceback (most recent call last): + File "", line 1, in + ... + decimal.Overflow: [, ] + + To ensure the result of a calculation can always be stored as BSON + Decimal128 use the context returned by + :func:`create_decimal128_context`:: + + >>> import decimal + >>> decimal128_ctx = create_decimal128_context() + >>> with decimal.localcontext(decimal128_ctx) as ctx: + ... Decimal128(ctx.create_decimal(".13.3")) + ... + Decimal128('NaN') + >>> + >>> with decimal.localcontext(decimal128_ctx) as ctx: + ... Decimal128(ctx.create_decimal("1E-6177")) + ... + Decimal128('0E-6176') + >>> + >>> with decimal.localcontext(DECIMAL128_CTX) as ctx: + ... Decimal128(ctx.create_decimal("1E6145")) + ... + Decimal128('Infinity') + + To match the behavior of MongoDB's Decimal128 implementation + str(Decimal(value)) may not match str(Decimal128(value)) for NaN values:: + + >>> Decimal128(Decimal('NaN')) + Decimal128('NaN') + >>> Decimal128(Decimal('-NaN')) + Decimal128('NaN') + >>> Decimal128(Decimal('sNaN')) + Decimal128('NaN') + >>> Decimal128(Decimal('-sNaN')) + Decimal128('NaN') + + However, :meth:`~Decimal128.to_decimal` will return the exact value:: + + >>> Decimal128(Decimal('NaN')).to_decimal() + Decimal('NaN') + >>> Decimal128(Decimal('-NaN')).to_decimal() + Decimal('-NaN') + >>> Decimal128(Decimal('sNaN')).to_decimal() + Decimal('sNaN') + >>> Decimal128(Decimal('-sNaN')).to_decimal() + Decimal('-sNaN') + + Two instances of :class:`Decimal128` compare equal if their Binary + Integer Decimal encodings are equal:: + + >>> Decimal128('NaN') == Decimal128('NaN') + True + >>> Decimal128('NaN').bid == Decimal128('NaN').bid + True + + This differs from :class:`decimal.Decimal` comparisons for NaN:: + + >>> Decimal('NaN') == Decimal('NaN') + False + """ + __slots__ = ('__high', '__low') + + _type_marker = 19 + + def __init__(self, value): + if isinstance(value, (_string_type, decimal.Decimal)): + self.__high, self.__low = _decimal_to_128(value) + elif isinstance(value, (list, tuple)): + if len(value) != 2: + raise ValueError('Invalid size for creation of Decimal128 ' + 'from list or tuple. Must have exactly 2 ' + 'elements.') + self.__high, self.__low = value + else: + raise TypeError("Cannot convert %r to Decimal128" % (value,)) + + def to_decimal(self): + """Returns an instance of :class:`decimal.Decimal` for this + :class:`Decimal128`. + """ + high = self.__high + low = self.__low + sign = 1 if (high & _SIGN) else 0 + + if (high & _SNAN) == _SNAN: + return decimal.Decimal((sign, (), 'N')) + elif (high & _NAN) == _NAN: + return decimal.Decimal((sign, (), 'n')) + elif (high & _INF) == _INF: + return decimal.Decimal((sign, (), 'F')) + + if (high & _EXPONENT_MASK) == _EXPONENT_MASK: + exponent = ((high & 0x1fffe00000000000) >> 47) - _EXPONENT_BIAS + return decimal.Decimal((sign, (0,), exponent)) + else: + exponent = ((high & 0x7fff800000000000) >> 49) - _EXPONENT_BIAS + + arr = bytearray(15) + mask = 0x00000000000000ff + for i in range(14, 6, -1): + arr[i] = (low & mask) >> ((14 - i) << 3) + mask = mask << 8 + + mask = 0x00000000000000ff + for i in range(6, 0, -1): + arr[i] = (high & mask) >> ((6 - i) << 3) + mask = mask << 8 + + mask = 0x0001000000000000 + arr[0] = (high & mask) >> 48 + + # cdecimal only accepts a tuple for digits. + digits = tuple( + int(digit) for digit in str(_from_bytes(arr, 'big'))) + + with decimal.localcontext(_DEC128_CTX) as ctx: + return ctx.create_decimal((sign, digits, exponent)) + + @classmethod + def from_bid(cls, value): + """Create an instance of :class:`Decimal128` from Binary Integer + Decimal string. + + :Parameters: + - `value`: 16 byte string (128-bit IEEE 754-2008 decimal floating + point in Binary Integer Decimal (BID) format). + """ + if not isinstance(value, bytes): + raise TypeError("value must be an instance of bytes") + if len(value) != 16: + raise ValueError("value must be exactly 16 bytes") + return cls((_UNPACK_64(value[8:])[0], _UNPACK_64(value[:8])[0])) + + @property + def bid(self): + """The Binary Integer Decimal (BID) encoding of this instance.""" + return _PACK_64(self.__low) + _PACK_64(self.__high) + + def __str__(self): + dec = self.to_decimal() + if dec.is_nan(): + # Required by the drivers spec to match MongoDB behavior. + return "NaN" + return str(dec) + + def __repr__(self): + return "Decimal128('%s')" % (str(self),) + + def __setstate__(self, value): + self.__high, self.__low = value + + def __getstate__(self): + return self.__high, self.__low + + def __eq__(self, other): + if isinstance(other, Decimal128): + return self.bid == other.bid + return NotImplemented + + def __ne__(self, other): + return not self == other diff --git a/mongo_mac/lib/python3.6/site-packages/bson/errors.py b/mongo_mac/lib/python3.6/site-packages/bson/errors.py new file mode 100644 index 0000000..9bdb741 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/bson/errors.py @@ -0,0 +1,40 @@ +# Copyright 2009-present MongoDB, Inc. +# +# 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. + +"""Exceptions raised by the BSON package.""" + + +class BSONError(Exception): + """Base class for all BSON exceptions. + """ + + +class InvalidBSON(BSONError): + """Raised when trying to create a BSON object from invalid data. + """ + + +class InvalidStringData(BSONError): + """Raised when trying to encode a string containing non-UTF8 data. + """ + + +class InvalidDocument(BSONError): + """Raised when trying to create a BSON object from an invalid document. + """ + + +class InvalidId(BSONError): + """Raised when trying to create an ObjectId from invalid data. + """ diff --git a/mongo_mac/lib/python3.6/site-packages/bson/int64.py b/mongo_mac/lib/python3.6/site-packages/bson/int64.py new file mode 100644 index 0000000..77e9812 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/bson/int64.py @@ -0,0 +1,34 @@ +# Copyright 2014-2015 MongoDB, Inc. +# +# 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. + +"""A BSON wrapper for long (int in python3)""" + +from bson.py3compat import PY3 + +if PY3: + long = int + + +class Int64(long): + """Representation of the BSON int64 type. + + This is necessary because every integral number is an :class:`int` in + Python 3. Small integral numbers are encoded to BSON int32 by default, + but Int64 numbers will always be encoded to BSON int64. + + :Parameters: + - `value`: the numeric value to represent + """ + + _type_marker = 18 diff --git a/mongo_mac/lib/python3.6/site-packages/bson/json_util.py b/mongo_mac/lib/python3.6/site-packages/bson/json_util.py new file mode 100644 index 0000000..871f711 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/bson/json_util.py @@ -0,0 +1,829 @@ +# Copyright 2009-present MongoDB, Inc. +# +# 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. + +"""Tools for using Python's :mod:`json` module with BSON documents. + +This module provides two helper methods `dumps` and `loads` that wrap the +native :mod:`json` methods and provide explicit BSON conversion to and from +JSON. :class:`~bson.json_util.JSONOptions` provides a way to control how JSON +is emitted and parsed, with the default being the legacy PyMongo format. +:mod:`~bson.json_util` can also generate Canonical or Relaxed `Extended JSON`_ +when :const:`CANONICAL_JSON_OPTIONS` or :const:`RELAXED_JSON_OPTIONS` is +provided, respectively. + +.. _Extended JSON: https://github.com/mongodb/specifications/blob/master/source/extended-json.rst + +Example usage (deserialization): + +.. doctest:: + + >>> from bson.json_util import loads + >>> loads('[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$scope": {}, "$code": "function x() { return 1; }"}}, {"bin": {"$type": "80", "$binary": "AQIDBA=="}}]') + [{u'foo': [1, 2]}, {u'bar': {u'hello': u'world'}}, {u'code': Code('function x() { return 1; }', {})}, {u'bin': Binary('...', 128)}] + +Example usage (serialization): + +.. doctest:: + + >>> from bson import Binary, Code + >>> from bson.json_util import dumps + >>> dumps([{'foo': [1, 2]}, + ... {'bar': {'hello': 'world'}}, + ... {'code': Code("function x() { return 1; }", {})}, + ... {'bin': Binary(b"\x01\x02\x03\x04")}]) + '[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$code": "function x() { return 1; }", "$scope": {}}}, {"bin": {"$binary": "AQIDBA==", "$type": "00"}}]' + +Example usage (with :const:`CANONICAL_JSON_OPTIONS`): + +.. doctest:: + + >>> from bson import Binary, Code + >>> from bson.json_util import dumps, CANONICAL_JSON_OPTIONS + >>> dumps([{'foo': [1, 2]}, + ... {'bar': {'hello': 'world'}}, + ... {'code': Code("function x() { return 1; }")}, + ... {'bin': Binary(b"\x01\x02\x03\x04")}], + ... json_options=CANONICAL_JSON_OPTIONS) + '[{"foo": [{"$numberInt": "1"}, {"$numberInt": "2"}]}, {"bar": {"hello": "world"}}, {"code": {"$code": "function x() { return 1; }"}}, {"bin": {"$binary": {"base64": "AQIDBA==", "subType": "00"}}}]' + +Example usage (with :const:`RELAXED_JSON_OPTIONS`): + +.. doctest:: + + >>> from bson import Binary, Code + >>> from bson.json_util import dumps, RELAXED_JSON_OPTIONS + >>> dumps([{'foo': [1, 2]}, + ... {'bar': {'hello': 'world'}}, + ... {'code': Code("function x() { return 1; }")}, + ... {'bin': Binary(b"\x01\x02\x03\x04")}], + ... json_options=RELAXED_JSON_OPTIONS) + '[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$code": "function x() { return 1; }"}}, {"bin": {"$binary": {"base64": "AQIDBA==", "subType": "00"}}}]' + +Alternatively, you can manually pass the `default` to :func:`json.dumps`. +It won't handle :class:`~bson.binary.Binary` and :class:`~bson.code.Code` +instances (as they are extended strings you can't provide custom defaults), +but it will be faster as there is less recursion. + +.. note:: + If your application does not need the flexibility offered by + :class:`JSONOptions` and spends a large amount of time in the `json_util` + module, look to + `python-bsonjs `_ for a nice + performance improvement. `python-bsonjs` is a fast BSON to MongoDB + Extended JSON converter for Python built on top of + `libbson `_. `python-bsonjs` works best + with PyMongo when using :class:`~bson.raw_bson.RawBSONDocument`. + +.. versionchanged:: 2.8 + The output format for :class:`~bson.timestamp.Timestamp` has changed from + '{"t": , "i": }' to '{"$timestamp": {"t": , "i": }}'. + This new format will be decoded to an instance of + :class:`~bson.timestamp.Timestamp`. The old format will continue to be + decoded to a python dict as before. Encoding to the old format is no longer + supported as it was never correct and loses type information. + Added support for $numberLong and $undefined - new in MongoDB 2.6 - and + parsing $date in ISO-8601 format. + +.. versionchanged:: 2.7 + Preserves order when rendering SON, Timestamp, Code, Binary, and DBRef + instances. + +.. versionchanged:: 2.3 + Added dumps and loads helpers to automatically handle conversion to and + from json and supports :class:`~bson.binary.Binary` and + :class:`~bson.code.Code` +""" + +import base64 +import datetime +import json +import math +import re +import sys +import uuid + +from pymongo.errors import ConfigurationError + +import bson +from bson import EPOCH_AWARE, EPOCH_NAIVE, RE_TYPE, SON +from bson.binary import (Binary, JAVA_LEGACY, CSHARP_LEGACY, OLD_UUID_SUBTYPE, + UUID_SUBTYPE) +from bson.code import Code +from bson.codec_options import CodecOptions +from bson.dbref import DBRef +from bson.decimal128 import Decimal128 +from bson.int64 import Int64 +from bson.max_key import MaxKey +from bson.min_key import MinKey +from bson.objectid import ObjectId +from bson.py3compat import (PY3, iteritems, integer_types, string_type, + text_type) +from bson.regex import Regex +from bson.timestamp import Timestamp +from bson.tz_util import utc + + +_RE_OPT_TABLE = { + "i": re.I, + "l": re.L, + "m": re.M, + "s": re.S, + "u": re.U, + "x": re.X, +} + +# Dollar-prefixed keys which may appear in DBRefs. +_DBREF_KEYS = frozenset(['$id', '$ref', '$db']) + + +class DatetimeRepresentation: + LEGACY = 0 + """Legacy MongoDB Extended JSON datetime representation. + + :class:`datetime.datetime` instances will be encoded to JSON in the + format `{"$date": }`, where `dateAsMilliseconds` is + a 64-bit signed integer giving the number of milliseconds since the Unix + epoch UTC. This was the default encoding before PyMongo version 3.4. + + .. versionadded:: 3.4 + """ + + NUMBERLONG = 1 + """NumberLong datetime representation. + + :class:`datetime.datetime` instances will be encoded to JSON in the + format `{"$date": {"$numberLong": ""}}`, + where `dateAsMilliseconds` is the string representation of a 64-bit signed + integer giving the number of milliseconds since the Unix epoch UTC. + + .. versionadded:: 3.4 + """ + + ISO8601 = 2 + """ISO-8601 datetime representation. + + :class:`datetime.datetime` instances greater than or equal to the Unix + epoch UTC will be encoded to JSON in the format `{"$date": ""}`. + :class:`datetime.datetime` instances before the Unix epoch UTC will be + encoded as if the datetime representation is + :const:`~DatetimeRepresentation.NUMBERLONG`. + + .. versionadded:: 3.4 + """ + + +class JSONMode: + LEGACY = 0 + """Legacy Extended JSON representation. + + In this mode, :func:`~bson.json_util.dumps` produces PyMongo's legacy + non-standard JSON output. Consider using + :const:`~bson.json_util.JSONMode.RELAXED` or + :const:`~bson.json_util.JSONMode.CANONICAL` instead. + + .. versionadded:: 3.5 + """ + + RELAXED = 1 + """Relaxed Extended JSON representation. + + In this mode, :func:`~bson.json_util.dumps` produces Relaxed Extended JSON, + a mostly JSON-like format. Consider using this for things like a web API, + where one is sending a document (or a projection of a document) that only + uses ordinary JSON type primitives. In particular, the ``int``, + :class:`~bson.int64.Int64`, and ``float`` numeric types are represented in + the native JSON number format. This output is also the most human readable + and is useful for debugging and documentation. + + .. seealso:: The specification for Relaxed `Extended JSON`_. + + .. versionadded:: 3.5 + """ + + CANONICAL = 2 + """Canonical Extended JSON representation. + + In this mode, :func:`~bson.json_util.dumps` produces Canonical Extended + JSON, a type preserving format. Consider using this for things like + testing, where one has to precisely specify expected types in JSON. In + particular, the ``int``, :class:`~bson.int64.Int64`, and ``float`` numeric + types are encoded with type wrappers. + + .. seealso:: The specification for Canonical `Extended JSON`_. + + .. versionadded:: 3.5 + """ + + +class JSONOptions(CodecOptions): + """Encapsulates JSON options for :func:`dumps` and :func:`loads`. + + :Parameters: + - `strict_number_long`: If ``True``, :class:`~bson.int64.Int64` objects + are encoded to MongoDB Extended JSON's *Strict mode* type + `NumberLong`, ie ``'{"$numberLong": "" }'``. Otherwise they + will be encoded as an `int`. Defaults to ``False``. + - `datetime_representation`: The representation to use when encoding + instances of :class:`datetime.datetime`. Defaults to + :const:`~DatetimeRepresentation.LEGACY`. + - `strict_uuid`: If ``True``, :class:`uuid.UUID` object are encoded to + MongoDB Extended JSON's *Strict mode* type `Binary`. Otherwise it + will be encoded as ``'{"$uuid": "" }'``. Defaults to ``False``. + - `json_mode`: The :class:`JSONMode` to use when encoding BSON types to + Extended JSON. Defaults to :const:`~JSONMode.LEGACY`. + - `document_class`: BSON documents returned by :func:`loads` will be + decoded to an instance of this class. Must be a subclass of + :class:`collections.MutableMapping`. Defaults to :class:`dict`. + - `uuid_representation`: The BSON representation to use when encoding + and decoding instances of :class:`uuid.UUID`. Defaults to + :const:`~bson.binary.PYTHON_LEGACY`. + - `tz_aware`: If ``True``, MongoDB Extended JSON's *Strict mode* type + `Date` will be decoded to timezone aware instances of + :class:`datetime.datetime`. Otherwise they will be naive. Defaults + to ``True``. + - `tzinfo`: A :class:`datetime.tzinfo` subclass that specifies the + timezone from which :class:`~datetime.datetime` objects should be + decoded. Defaults to :const:`~bson.tz_util.utc`. + - `args`: arguments to :class:`~bson.codec_options.CodecOptions` + - `kwargs`: arguments to :class:`~bson.codec_options.CodecOptions` + + .. seealso:: The specification for Relaxed and Canonical `Extended JSON`_. + + .. versionadded:: 3.4 + + .. versionchanged:: 3.5 + Accepts the optional parameter `json_mode`. + + """ + + def __new__(cls, strict_number_long=False, + datetime_representation=DatetimeRepresentation.LEGACY, + strict_uuid=False, json_mode=JSONMode.LEGACY, + *args, **kwargs): + kwargs["tz_aware"] = kwargs.get("tz_aware", True) + if kwargs["tz_aware"]: + kwargs["tzinfo"] = kwargs.get("tzinfo", utc) + if datetime_representation not in (DatetimeRepresentation.LEGACY, + DatetimeRepresentation.NUMBERLONG, + DatetimeRepresentation.ISO8601): + raise ConfigurationError( + "JSONOptions.datetime_representation must be one of LEGACY, " + "NUMBERLONG, or ISO8601 from DatetimeRepresentation.") + self = super(JSONOptions, cls).__new__(cls, *args, **kwargs) + if json_mode not in (JSONMode.LEGACY, + JSONMode.RELAXED, + JSONMode.CANONICAL): + raise ConfigurationError( + "JSONOptions.json_mode must be one of LEGACY, RELAXED, " + "or CANONICAL from JSONMode.") + self.json_mode = json_mode + if self.json_mode == JSONMode.RELAXED: + self.strict_number_long = False + self.datetime_representation = DatetimeRepresentation.ISO8601 + self.strict_uuid = True + elif self.json_mode == JSONMode.CANONICAL: + self.strict_number_long = True + self.datetime_representation = DatetimeRepresentation.NUMBERLONG + self.strict_uuid = True + else: + self.strict_number_long = strict_number_long + self.datetime_representation = datetime_representation + self.strict_uuid = strict_uuid + return self + + def _arguments_repr(self): + return ('strict_number_long=%r, ' + 'datetime_representation=%r, ' + 'strict_uuid=%r, json_mode=%r, %s' % ( + self.strict_number_long, + self.datetime_representation, + self.strict_uuid, + self.json_mode, + super(JSONOptions, self)._arguments_repr())) + + +LEGACY_JSON_OPTIONS = JSONOptions(json_mode=JSONMode.LEGACY) +""":class:`JSONOptions` for encoding to PyMongo's legacy JSON format. + +.. seealso:: The documentation for :const:`bson.json_util.JSONMode.LEGACY`. + +.. versionadded:: 3.5 +""" + +DEFAULT_JSON_OPTIONS = LEGACY_JSON_OPTIONS +"""The default :class:`JSONOptions` for JSON encoding/decoding. + +The same as :const:`LEGACY_JSON_OPTIONS`. This will change to +:const:`RELAXED_JSON_OPTIONS` in a future release. + +.. versionadded:: 3.4 +""" + +CANONICAL_JSON_OPTIONS = JSONOptions(json_mode=JSONMode.CANONICAL) +""":class:`JSONOptions` for Canonical Extended JSON. + +.. seealso:: The documentation for :const:`bson.json_util.JSONMode.CANONICAL`. + +.. versionadded:: 3.5 +""" + +RELAXED_JSON_OPTIONS = JSONOptions(json_mode=JSONMode.RELAXED) +""":class:`JSONOptions` for Relaxed Extended JSON. + +.. seealso:: The documentation for :const:`bson.json_util.JSONMode.RELAXED`. + +.. versionadded:: 3.5 +""" + +STRICT_JSON_OPTIONS = JSONOptions( + strict_number_long=True, + datetime_representation=DatetimeRepresentation.ISO8601, + strict_uuid=True) +"""**DEPRECATED** - :class:`JSONOptions` for MongoDB Extended JSON's *Strict +mode* encoding. + +.. versionadded:: 3.4 + +.. versionchanged:: 3.5 + Deprecated. Use :const:`RELAXED_JSON_OPTIONS` or + :const:`CANONICAL_JSON_OPTIONS` instead. +""" + + +def dumps(obj, *args, **kwargs): + """Helper function that wraps :func:`json.dumps`. + + Recursive function that handles all BSON types including + :class:`~bson.binary.Binary` and :class:`~bson.code.Code`. + + :Parameters: + - `json_options`: A :class:`JSONOptions` instance used to modify the + encoding of MongoDB Extended JSON types. Defaults to + :const:`DEFAULT_JSON_OPTIONS`. + + .. versionchanged:: 3.4 + Accepts optional parameter `json_options`. See :class:`JSONOptions`. + + .. versionchanged:: 2.7 + Preserves order when rendering SON, Timestamp, Code, Binary, and DBRef + instances. + """ + json_options = kwargs.pop("json_options", DEFAULT_JSON_OPTIONS) + return json.dumps(_json_convert(obj, json_options), *args, **kwargs) + + +def loads(s, *args, **kwargs): + """Helper function that wraps :func:`json.loads`. + + Automatically passes the object_hook for BSON type conversion. + + Raises ``TypeError``, ``ValueError``, ``KeyError``, or + :exc:`~bson.errors.InvalidId` on invalid MongoDB Extended JSON. + + :Parameters: + - `json_options`: A :class:`JSONOptions` instance used to modify the + decoding of MongoDB Extended JSON types. Defaults to + :const:`DEFAULT_JSON_OPTIONS`. + + .. versionchanged:: 3.5 + Parses Relaxed and Canonical Extended JSON as well as PyMongo's legacy + format. Now raises ``TypeError`` or ``ValueError`` when parsing JSON + type wrappers with values of the wrong type or any extra keys. + + .. versionchanged:: 3.4 + Accepts optional parameter `json_options`. See :class:`JSONOptions`. + """ + json_options = kwargs.pop("json_options", DEFAULT_JSON_OPTIONS) + kwargs["object_pairs_hook"] = lambda pairs: object_pairs_hook( + pairs, json_options) + return json.loads(s, *args, **kwargs) + + +def _json_convert(obj, json_options=DEFAULT_JSON_OPTIONS): + """Recursive helper method that converts BSON types so they can be + converted into json. + """ + if hasattr(obj, 'iteritems') or hasattr(obj, 'items'): # PY3 support + return SON(((k, _json_convert(v, json_options)) + for k, v in iteritems(obj))) + elif hasattr(obj, '__iter__') and not isinstance(obj, (text_type, bytes)): + return list((_json_convert(v, json_options) for v in obj)) + try: + return default(obj, json_options) + except TypeError: + return obj + + +def object_pairs_hook(pairs, json_options=DEFAULT_JSON_OPTIONS): + return object_hook(json_options.document_class(pairs), json_options) + + +def object_hook(dct, json_options=DEFAULT_JSON_OPTIONS): + if "$oid" in dct: + return _parse_canonical_oid(dct) + if "$ref" in dct: + return _parse_canonical_dbref(dct) + if "$date" in dct: + return _parse_canonical_datetime(dct, json_options) + if "$regex" in dct: + return _parse_legacy_regex(dct) + if "$minKey" in dct: + return _parse_canonical_minkey(dct) + if "$maxKey" in dct: + return _parse_canonical_maxkey(dct) + if "$binary" in dct: + if "$type" in dct: + return _parse_legacy_binary(dct, json_options) + else: + return _parse_canonical_binary(dct, json_options) + if "$code" in dct: + return _parse_canonical_code(dct) + if "$uuid" in dct: + return _parse_legacy_uuid(dct) + if "$undefined" in dct: + return None + if "$numberLong" in dct: + return _parse_canonical_int64(dct) + if "$timestamp" in dct: + tsp = dct["$timestamp"] + return Timestamp(tsp["t"], tsp["i"]) + if "$numberDecimal" in dct: + return _parse_canonical_decimal128(dct) + if "$dbPointer" in dct: + return _parse_canonical_dbpointer(dct) + if "$regularExpression" in dct: + return _parse_canonical_regex(dct) + if "$symbol" in dct: + return _parse_canonical_symbol(dct) + if "$numberInt" in dct: + return _parse_canonical_int32(dct) + if "$numberDouble" in dct: + return _parse_canonical_double(dct) + return dct + + +def _parse_legacy_regex(doc): + pattern = doc["$regex"] + # Check if this is the $regex query operator. + if isinstance(pattern, Regex): + return doc + flags = 0 + # PyMongo always adds $options but some other tools may not. + for opt in doc.get("$options", ""): + flags |= _RE_OPT_TABLE.get(opt, 0) + return Regex(pattern, flags) + + +def _parse_legacy_uuid(doc): + """Decode a JSON legacy $uuid to Python UUID.""" + if len(doc) != 1: + raise TypeError('Bad $uuid, extra field(s): %s' % (doc,)) + return uuid.UUID(doc["$uuid"]) + + +def _binary_or_uuid(data, subtype, json_options): + # special handling for UUID + if subtype == OLD_UUID_SUBTYPE: + if json_options.uuid_representation == CSHARP_LEGACY: + return uuid.UUID(bytes_le=data) + if json_options.uuid_representation == JAVA_LEGACY: + data = data[7::-1] + data[:7:-1] + return uuid.UUID(bytes=data) + if subtype == UUID_SUBTYPE: + return uuid.UUID(bytes=data) + if PY3 and subtype == 0: + return data + return Binary(data, subtype) + + +def _parse_legacy_binary(doc, json_options): + if isinstance(doc["$type"], int): + doc["$type"] = "%02x" % doc["$type"] + subtype = int(doc["$type"], 16) + if subtype >= 0xffffff80: # Handle mongoexport values + subtype = int(doc["$type"][6:], 16) + data = base64.b64decode(doc["$binary"].encode()) + return _binary_or_uuid(data, subtype, json_options) + + +def _parse_canonical_binary(doc, json_options): + binary = doc["$binary"] + b64 = binary["base64"] + subtype = binary["subType"] + if not isinstance(b64, string_type): + raise TypeError('$binary base64 must be a string: %s' % (doc,)) + if not isinstance(subtype, string_type) or len(subtype) > 2: + raise TypeError('$binary subType must be a string at most 2 ' + 'characters: %s' % (doc,)) + if len(binary) != 2: + raise TypeError('$binary must include only "base64" and "subType" ' + 'components: %s' % (doc,)) + + data = base64.b64decode(b64.encode()) + return _binary_or_uuid(data, int(subtype, 16), json_options) + + +def _parse_canonical_datetime(doc, json_options): + """Decode a JSON datetime to python datetime.datetime.""" + dtm = doc["$date"] + if len(doc) != 1: + raise TypeError('Bad $date, extra field(s): %s' % (doc,)) + # mongoexport 2.6 and newer + if isinstance(dtm, string_type): + # Parse offset + if dtm[-1] == 'Z': + dt = dtm[:-1] + offset = 'Z' + elif dtm[-3] == ':': + # (+|-)HH:MM + dt = dtm[:-6] + offset = dtm[-6:] + elif dtm[-5] in ('+', '-'): + # (+|-)HHMM + dt = dtm[:-5] + offset = dtm[-5:] + elif dtm[-3] in ('+', '-'): + # (+|-)HH + dt = dtm[:-3] + offset = dtm[-3:] + else: + dt = dtm + offset = '' + + # Parse the optional factional seconds portion. + dot_index = dt.rfind('.') + microsecond = 0 + if dot_index != -1: + microsecond = int(float(dt[dot_index:]) * 1000000) + dt = dt[:dot_index] + + aware = datetime.datetime.strptime( + dt, "%Y-%m-%dT%H:%M:%S").replace(microsecond=microsecond, + tzinfo=utc) + + if offset and offset != 'Z': + if len(offset) == 6: + hours, minutes = offset[1:].split(':') + secs = (int(hours) * 3600 + int(minutes) * 60) + elif len(offset) == 5: + secs = (int(offset[1:3]) * 3600 + int(offset[3:]) * 60) + elif len(offset) == 3: + secs = int(offset[1:3]) * 3600 + if offset[0] == "-": + secs *= -1 + aware = aware - datetime.timedelta(seconds=secs) + + if json_options.tz_aware: + if json_options.tzinfo: + aware = aware.astimezone(json_options.tzinfo) + return aware + else: + return aware.replace(tzinfo=None) + return bson._millis_to_datetime(int(dtm), json_options) + + +def _parse_canonical_oid(doc): + """Decode a JSON ObjectId to bson.objectid.ObjectId.""" + if len(doc) != 1: + raise TypeError('Bad $oid, extra field(s): %s' % (doc,)) + return ObjectId(doc['$oid']) + + +def _parse_canonical_symbol(doc): + """Decode a JSON symbol to Python string.""" + symbol = doc['$symbol'] + if len(doc) != 1: + raise TypeError('Bad $symbol, extra field(s): %s' % (doc,)) + return text_type(symbol) + + +def _parse_canonical_code(doc): + """Decode a JSON code to bson.code.Code.""" + for key in doc: + if key not in ('$code', '$scope'): + raise TypeError('Bad $code, extra field(s): %s' % (doc,)) + return Code(doc['$code'], scope=doc.get('$scope')) + + +def _parse_canonical_regex(doc): + """Decode a JSON regex to bson.regex.Regex.""" + regex = doc['$regularExpression'] + if len(doc) != 1: + raise TypeError('Bad $regularExpression, extra field(s): %s' % (doc,)) + if len(regex) != 2: + raise TypeError('Bad $regularExpression must include only "pattern"' + 'and "options" components: %s' % (doc,)) + return Regex(regex['pattern'], regex['options']) + + +def _parse_canonical_dbref(doc): + """Decode a JSON DBRef to bson.dbref.DBRef.""" + for key in doc: + if key.startswith('$') and key not in _DBREF_KEYS: + # Other keys start with $, so dct cannot be parsed as a DBRef. + return doc + return DBRef(doc.pop('$ref'), doc.pop('$id'), + database=doc.pop('$db', None), **doc) + + +def _parse_canonical_dbpointer(doc): + """Decode a JSON (deprecated) DBPointer to bson.dbref.DBRef.""" + dbref = doc['$dbPointer'] + if len(doc) != 1: + raise TypeError('Bad $dbPointer, extra field(s): %s' % (doc,)) + if isinstance(dbref, DBRef): + dbref_doc = dbref.as_doc() + # DBPointer must not contain $db in its value. + if dbref.database is not None: + raise TypeError( + 'Bad $dbPointer, extra field $db: %s' % (dbref_doc,)) + if not isinstance(dbref.id, ObjectId): + raise TypeError( + 'Bad $dbPointer, $id must be an ObjectId: %s' % (dbref_doc,)) + if len(dbref_doc) != 2: + raise TypeError( + 'Bad $dbPointer, extra field(s) in DBRef: %s' % (dbref_doc,)) + return dbref + else: + raise TypeError('Bad $dbPointer, expected a DBRef: %s' % (doc,)) + + +def _parse_canonical_int32(doc): + """Decode a JSON int32 to python int.""" + i_str = doc['$numberInt'] + if len(doc) != 1: + raise TypeError('Bad $numberInt, extra field(s): %s' % (doc,)) + if not isinstance(i_str, string_type): + raise TypeError('$numberInt must be string: %s' % (doc,)) + return int(i_str) + + +def _parse_canonical_int64(doc): + """Decode a JSON int64 to bson.int64.Int64.""" + l_str = doc['$numberLong'] + if len(doc) != 1: + raise TypeError('Bad $numberLong, extra field(s): %s' % (doc,)) + return Int64(l_str) + + +def _parse_canonical_double(doc): + """Decode a JSON double to python float.""" + d_str = doc['$numberDouble'] + if len(doc) != 1: + raise TypeError('Bad $numberDouble, extra field(s): %s' % (doc,)) + if not isinstance(d_str, string_type): + raise TypeError('$numberDouble must be string: %s' % (doc,)) + return float(d_str) + + +def _parse_canonical_decimal128(doc): + """Decode a JSON decimal128 to bson.decimal128.Decimal128.""" + d_str = doc['$numberDecimal'] + if len(doc) != 1: + raise TypeError('Bad $numberDecimal, extra field(s): %s' % (doc,)) + if not isinstance(d_str, string_type): + raise TypeError('$numberDecimal must be string: %s' % (doc,)) + return Decimal128(d_str) + + +def _parse_canonical_minkey(doc): + """Decode a JSON MinKey to bson.min_key.MinKey.""" + if doc['$minKey'] is not 1: + raise TypeError('$minKey value must be 1: %s' % (doc,)) + if len(doc) != 1: + raise TypeError('Bad $minKey, extra field(s): %s' % (doc,)) + return MinKey() + + +def _parse_canonical_maxkey(doc): + """Decode a JSON MaxKey to bson.max_key.MaxKey.""" + if doc['$maxKey'] is not 1: + raise TypeError('$maxKey value must be 1: %s', (doc,)) + if len(doc) != 1: + raise TypeError('Bad $minKey, extra field(s): %s' % (doc,)) + return MaxKey() + + +def _encode_binary(data, subtype, json_options): + if json_options.json_mode == JSONMode.LEGACY: + return SON([ + ('$binary', base64.b64encode(data).decode()), + ('$type', "%02x" % subtype)]) + return {'$binary': SON([ + ('base64', base64.b64encode(data).decode()), + ('subType', "%02x" % subtype)])} + + +def default(obj, json_options=DEFAULT_JSON_OPTIONS): + # We preserve key order when rendering SON, DBRef, etc. as JSON by + # returning a SON for those types instead of a dict. + if isinstance(obj, ObjectId): + return {"$oid": str(obj)} + if isinstance(obj, DBRef): + return _json_convert(obj.as_doc(), json_options=json_options) + if isinstance(obj, datetime.datetime): + if (json_options.datetime_representation == + DatetimeRepresentation.ISO8601): + if not obj.tzinfo: + obj = obj.replace(tzinfo=utc) + if obj >= EPOCH_AWARE: + off = obj.tzinfo.utcoffset(obj) + if (off.days, off.seconds, off.microseconds) == (0, 0, 0): + tz_string = 'Z' + else: + tz_string = obj.strftime('%z') + millis = int(obj.microsecond / 1000) + fracsecs = ".%03d" % (millis,) if millis else "" + return {"$date": "%s%s%s" % ( + obj.strftime("%Y-%m-%dT%H:%M:%S"), fracsecs, tz_string)} + + millis = bson._datetime_to_millis(obj) + if (json_options.datetime_representation == + DatetimeRepresentation.LEGACY): + return {"$date": millis} + return {"$date": {"$numberLong": str(millis)}} + if json_options.strict_number_long and isinstance(obj, Int64): + return {"$numberLong": str(obj)} + if isinstance(obj, (RE_TYPE, Regex)): + flags = "" + if obj.flags & re.IGNORECASE: + flags += "i" + if obj.flags & re.LOCALE: + flags += "l" + if obj.flags & re.MULTILINE: + flags += "m" + if obj.flags & re.DOTALL: + flags += "s" + if obj.flags & re.UNICODE: + flags += "u" + if obj.flags & re.VERBOSE: + flags += "x" + if isinstance(obj.pattern, text_type): + pattern = obj.pattern + else: + pattern = obj.pattern.decode('utf-8') + if json_options.json_mode == JSONMode.LEGACY: + return SON([("$regex", pattern), ("$options", flags)]) + return {'$regularExpression': SON([("pattern", pattern), + ("options", flags)])} + if isinstance(obj, MinKey): + return {"$minKey": 1} + if isinstance(obj, MaxKey): + return {"$maxKey": 1} + if isinstance(obj, Timestamp): + return {"$timestamp": SON([("t", obj.time), ("i", obj.inc)])} + if isinstance(obj, Code): + if obj.scope is None: + return {'$code': str(obj)} + return SON([ + ('$code', str(obj)), + ('$scope', _json_convert(obj.scope, json_options))]) + if isinstance(obj, Binary): + return _encode_binary(obj, obj.subtype, json_options) + if PY3 and isinstance(obj, bytes): + return _encode_binary(obj, 0, json_options) + if isinstance(obj, uuid.UUID): + if json_options.strict_uuid: + data = obj.bytes + subtype = OLD_UUID_SUBTYPE + if json_options.uuid_representation == CSHARP_LEGACY: + data = obj.bytes_le + elif json_options.uuid_representation == JAVA_LEGACY: + data = data[7::-1] + data[:7:-1] + elif json_options.uuid_representation == UUID_SUBTYPE: + subtype = UUID_SUBTYPE + return _encode_binary(data, subtype, json_options) + else: + return {"$uuid": obj.hex} + if isinstance(obj, Decimal128): + return {"$numberDecimal": str(obj)} + if isinstance(obj, bool): + return obj + if (json_options.json_mode == JSONMode.CANONICAL and + isinstance(obj, integer_types)): + if -2 ** 31 <= obj < 2 ** 31: + return {'$numberInt': text_type(obj)} + return {'$numberLong': text_type(obj)} + if json_options.json_mode != JSONMode.LEGACY and isinstance(obj, float): + if math.isnan(obj): + return {'$numberDouble': 'NaN'} + elif math.isinf(obj): + representation = 'Infinity' if obj > 0 else '-Infinity' + return {'$numberDouble': representation} + elif json_options.json_mode == JSONMode.CANONICAL: + # repr() will return the shortest string guaranteed to produce the + # original value, when float() is called on it. str produces a + # shorter string in Python 2. + return {'$numberDouble': text_type(repr(obj))} + raise TypeError("%r is not JSON serializable" % obj) diff --git a/mongo_mac/lib/python3.6/site-packages/bson/max_key.py b/mongo_mac/lib/python3.6/site-packages/bson/max_key.py new file mode 100644 index 0000000..7e89dd7 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/bson/max_key.py @@ -0,0 +1,50 @@ +# Copyright 2010-present MongoDB, Inc. +# +# 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. + +"""Representation for the MongoDB internal MaxKey type. +""" + + +class MaxKey(object): + """MongoDB internal MaxKey type. + + .. versionchanged:: 2.7 + ``MaxKey`` now implements comparison operators. + """ + + _type_marker = 127 + + def __eq__(self, other): + return isinstance(other, MaxKey) + + def __hash__(self): + return hash(self._type_marker) + + def __ne__(self, other): + return not self == other + + def __le__(self, other): + return isinstance(other, MaxKey) + + def __lt__(self, dummy): + return False + + def __ge__(self, dummy): + return True + + def __gt__(self, other): + return not isinstance(other, MaxKey) + + def __repr__(self): + return "MaxKey()" diff --git a/mongo_mac/lib/python3.6/site-packages/bson/min_key.py b/mongo_mac/lib/python3.6/site-packages/bson/min_key.py new file mode 100644 index 0000000..b03520e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/bson/min_key.py @@ -0,0 +1,50 @@ +# Copyright 2010-present MongoDB, Inc. +# +# 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. + +"""Representation for the MongoDB internal MinKey type. +""" + + +class MinKey(object): + """MongoDB internal MinKey type. + + .. versionchanged:: 2.7 + ``MinKey`` now implements comparison operators. + """ + + _type_marker = 255 + + def __eq__(self, other): + return isinstance(other, MinKey) + + def __hash__(self): + return hash(self._type_marker) + + def __ne__(self, other): + return not self == other + + def __le__(self, dummy): + return True + + def __lt__(self, other): + return not isinstance(other, MinKey) + + def __ge__(self, other): + return isinstance(other, MinKey) + + def __gt__(self, dummy): + return False + + def __repr__(self): + return "MinKey()" diff --git a/mongo_mac/lib/python3.6/site-packages/bson/objectid.py b/mongo_mac/lib/python3.6/site-packages/bson/objectid.py new file mode 100644 index 0000000..8b7ad8e --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/bson/objectid.py @@ -0,0 +1,299 @@ +# Copyright 2009-2015 MongoDB, Inc. +# +# 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. + +"""Tools for working with MongoDB `ObjectIds +`_. +""" + +import binascii +import calendar +import datetime +import os +import struct +import threading +import time + +from random import SystemRandom + +from bson.errors import InvalidId +from bson.py3compat import PY3, bytes_from_hex, string_type, text_type +from bson.tz_util import utc + + +_MAX_COUNTER_VALUE = 0xFFFFFF + + +def _raise_invalid_id(oid): + raise InvalidId( + "%r is not a valid ObjectId, it must be a 12-byte input" + " or a 24-character hex string" % oid) + + +def _random_bytes(): + """Get the 5-byte random field of an ObjectId.""" + return struct.pack(">Q", SystemRandom().randint(0, 0xFFFFFFFFFF))[3:] + + +class ObjectId(object): + """A MongoDB ObjectId. + """ + + _pid = os.getpid() + + _inc = SystemRandom().randint(0, _MAX_COUNTER_VALUE) + _inc_lock = threading.Lock() + + __random = _random_bytes() + + __slots__ = ('__id',) + + _type_marker = 7 + + def __init__(self, oid=None): + """Initialize a new ObjectId. + + An ObjectId is a 12-byte unique identifier consisting of: + + - a 4-byte value representing the seconds since the Unix epoch, + - a 5-byte random value, + - a 3-byte counter, starting with a random value. + + By default, ``ObjectId()`` creates a new unique identifier. The + optional parameter `oid` can be an :class:`ObjectId`, or any 12 + :class:`bytes` or, in Python 2, any 12-character :class:`str`. + + For example, the 12 bytes b'foo-bar-quux' do not follow the ObjectId + specification but they are acceptable input:: + + >>> ObjectId(b'foo-bar-quux') + ObjectId('666f6f2d6261722d71757578') + + `oid` can also be a :class:`unicode` or :class:`str` of 24 hex digits:: + + >>> ObjectId('0123456789ab0123456789ab') + ObjectId('0123456789ab0123456789ab') + >>> + >>> # A u-prefixed unicode literal: + >>> ObjectId(u'0123456789ab0123456789ab') + ObjectId('0123456789ab0123456789ab') + + Raises :class:`~bson.errors.InvalidId` if `oid` is not 12 bytes nor + 24 hex digits, or :class:`TypeError` if `oid` is not an accepted type. + + :Parameters: + - `oid` (optional): a valid ObjectId. + + .. mongodoc:: objectids + + .. versionchanged:: 3.8 + :class:`~bson.objectid.ObjectId` now implements the `ObjectID + specification version 0.2 + `_. + """ + if oid is None: + self.__generate() + elif isinstance(oid, bytes) and len(oid) == 12: + self.__id = oid + else: + self.__validate(oid) + + @classmethod + def from_datetime(cls, generation_time): + """Create a dummy ObjectId instance with a specific generation time. + + This method is useful for doing range queries on a field + containing :class:`ObjectId` instances. + + .. warning:: + It is not safe to insert a document containing an ObjectId + generated using this method. This method deliberately + eliminates the uniqueness guarantee that ObjectIds + generally provide. ObjectIds generated with this method + should be used exclusively in queries. + + `generation_time` will be converted to UTC. Naive datetime + instances will be treated as though they already contain UTC. + + An example using this helper to get documents where ``"_id"`` + was generated before January 1, 2010 would be: + + >>> gen_time = datetime.datetime(2010, 1, 1) + >>> dummy_id = ObjectId.from_datetime(gen_time) + >>> result = collection.find({"_id": {"$lt": dummy_id}}) + + :Parameters: + - `generation_time`: :class:`~datetime.datetime` to be used + as the generation time for the resulting ObjectId. + """ + if generation_time.utcoffset() is not None: + generation_time = generation_time - generation_time.utcoffset() + timestamp = calendar.timegm(generation_time.timetuple()) + oid = struct.pack( + ">I", int(timestamp)) + b"\x00\x00\x00\x00\x00\x00\x00\x00" + return cls(oid) + + @classmethod + def is_valid(cls, oid): + """Checks if a `oid` string is valid or not. + + :Parameters: + - `oid`: the object id to validate + + .. versionadded:: 2.3 + """ + if not oid: + return False + + try: + ObjectId(oid) + return True + except (InvalidId, TypeError): + return False + + @classmethod + def _random(cls): + """Generate a 5-byte random number once per process. + """ + pid = os.getpid() + if pid != cls._pid: + cls._pid = pid + cls.__random = _random_bytes() + return cls.__random + + def __generate(self): + """Generate a new value for this ObjectId. + """ + + # 4 bytes current time + oid = struct.pack(">I", int(time.time())) + + # 5 bytes random + oid += ObjectId._random() + + # 3 bytes inc + with ObjectId._inc_lock: + oid += struct.pack(">I", ObjectId._inc)[1:4] + ObjectId._inc = (ObjectId._inc + 1) % (_MAX_COUNTER_VALUE + 1) + + self.__id = oid + + def __validate(self, oid): + """Validate and use the given id for this ObjectId. + + Raises TypeError if id is not an instance of + (:class:`basestring` (:class:`str` or :class:`bytes` + in python 3), ObjectId) and InvalidId if it is not a + valid ObjectId. + + :Parameters: + - `oid`: a valid ObjectId + """ + if isinstance(oid, ObjectId): + self.__id = oid.binary + # bytes or unicode in python 2, str in python 3 + elif isinstance(oid, string_type): + if len(oid) == 24: + try: + self.__id = bytes_from_hex(oid) + except (TypeError, ValueError): + _raise_invalid_id(oid) + else: + _raise_invalid_id(oid) + else: + raise TypeError("id must be an instance of (bytes, %s, ObjectId), " + "not %s" % (text_type.__name__, type(oid))) + + @property + def binary(self): + """12-byte binary representation of this ObjectId. + """ + return self.__id + + @property + def generation_time(self): + """A :class:`datetime.datetime` instance representing the time of + generation for this :class:`ObjectId`. + + The :class:`datetime.datetime` is timezone aware, and + represents the generation time in UTC. It is precise to the + second. + """ + timestamp = struct.unpack(">I", self.__id[0:4])[0] + return datetime.datetime.fromtimestamp(timestamp, utc) + + def __getstate__(self): + """return value of object for pickling. + needed explicitly because __slots__() defined. + """ + return self.__id + + def __setstate__(self, value): + """explicit state set from pickling + """ + # Provide backwards compatability with OIDs + # pickled with pymongo-1.9 or older. + if isinstance(value, dict): + oid = value["_ObjectId__id"] + else: + oid = value + # ObjectIds pickled in python 2.x used `str` for __id. + # In python 3.x this has to be converted to `bytes` + # by encoding latin-1. + if PY3 and isinstance(oid, text_type): + self.__id = oid.encode('latin-1') + else: + self.__id = oid + + def __str__(self): + if PY3: + return binascii.hexlify(self.__id).decode() + return binascii.hexlify(self.__id) + + def __repr__(self): + return "ObjectId('%s')" % (str(self),) + + def __eq__(self, other): + if isinstance(other, ObjectId): + return self.__id == other.binary + return NotImplemented + + def __ne__(self, other): + if isinstance(other, ObjectId): + return self.__id != other.binary + return NotImplemented + + def __lt__(self, other): + if isinstance(other, ObjectId): + return self.__id < other.binary + return NotImplemented + + def __le__(self, other): + if isinstance(other, ObjectId): + return self.__id <= other.binary + return NotImplemented + + def __gt__(self, other): + if isinstance(other, ObjectId): + return self.__id > other.binary + return NotImplemented + + def __ge__(self, other): + if isinstance(other, ObjectId): + return self.__id >= other.binary + return NotImplemented + + def __hash__(self): + """Get a hash value for this :class:`ObjectId`.""" + return hash(self.__id) diff --git a/mongo_mac/lib/python3.6/site-packages/bson/py3compat.py b/mongo_mac/lib/python3.6/site-packages/bson/py3compat.py new file mode 100644 index 0000000..84d1ea0 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/bson/py3compat.py @@ -0,0 +1,107 @@ +# Copyright 2009-present MongoDB, Inc. +# +# 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. + +"""Utility functions and definitions for python3 compatibility.""" + +import sys + +PY3 = sys.version_info[0] == 3 + +if PY3: + import codecs + import collections.abc as abc + import _thread as thread + from abc import ABC, abstractmethod + from io import BytesIO as StringIO + + def abstractproperty(func): + return property(abstractmethod(func)) + + MAXSIZE = sys.maxsize + + imap = map + + def b(s): + # BSON and socket operations deal in binary data. In + # python 3 that means instances of `bytes`. In python + # 2.7 you can create an alias for `bytes` using + # the b prefix (e.g. b'foo'). + # See http://python3porting.com/problems.html#nicer-solutions + return codecs.latin_1_encode(s)[0] + + def bytes_from_hex(h): + return bytes.fromhex(h) + + def iteritems(d): + return iter(d.items()) + + def itervalues(d): + return iter(d.values()) + + def reraise(exctype, value, trace=None): + raise exctype(str(value)).with_traceback(trace) + + def reraise_instance(exc_instance, trace=None): + raise exc_instance.with_traceback(trace) + + def _unicode(s): + return s + + text_type = str + string_type = str + integer_types = int +else: + import collections as abc + import thread + from abc import ABCMeta, abstractproperty + + from itertools import imap + try: + from cStringIO import StringIO + except ImportError: + from StringIO import StringIO + + ABC = ABCMeta('ABC', (object,), {}) + + MAXSIZE = sys.maxint + + def b(s): + # See comments above. In python 2.x b('foo') is just 'foo'. + return s + + def bytes_from_hex(h): + return h.decode('hex') + + def iteritems(d): + return d.iteritems() + + def itervalues(d): + return d.itervalues() + + def reraise(exctype, value, trace=None): + _reraise(exctype, str(value), trace) + + def reraise_instance(exc_instance, trace=None): + _reraise(exc_instance, None, trace) + + # "raise x, y, z" raises SyntaxError in Python 3 + exec("""def _reraise(exc, value, trace): + raise exc, value, trace +""") + + _unicode = unicode + + string_type = basestring + text_type = unicode + integer_types = (int, long) diff --git a/mongo_mac/lib/python3.6/site-packages/bson/raw_bson.py b/mongo_mac/lib/python3.6/site-packages/bson/raw_bson.py new file mode 100644 index 0000000..429b2ac --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/bson/raw_bson.py @@ -0,0 +1,124 @@ +# Copyright 2015-present MongoDB, Inc. +# +# 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. + +"""Tools for representing raw BSON documents. +""" + +from bson import _elements_to_dict, _get_object_size +from bson.py3compat import abc, iteritems +from bson.codec_options import ( + DEFAULT_CODEC_OPTIONS as DEFAULT, _RAW_BSON_DOCUMENT_MARKER) +from bson.son import SON + + +class RawBSONDocument(abc.Mapping): + """Representation for a MongoDB document that provides access to the raw + BSON bytes that compose it. + + Only when a field is accessed or modified within the document does + RawBSONDocument decode its bytes. + """ + + __slots__ = ('__raw', '__inflated_doc', '__codec_options') + _type_marker = _RAW_BSON_DOCUMENT_MARKER + + def __init__(self, bson_bytes, codec_options=None): + """Create a new :class:`RawBSONDocument` + + :class:`RawBSONDocument` is a representation of a BSON document that + provides access to the underlying raw BSON bytes. Only when a field is + accessed or modified within the document does RawBSONDocument decode + its bytes. + + :class:`RawBSONDocument` implements the ``Mapping`` abstract base + class from the standard library so it can be used like a read-only + ``dict``:: + + >>> raw_doc = RawBSONDocument(BSON.encode({'_id': 'my_doc'})) + >>> raw_doc.raw + b'...' + >>> raw_doc['_id'] + 'my_doc' + + :Parameters: + - `bson_bytes`: the BSON bytes that compose this document + - `codec_options` (optional): An instance of + :class:`~bson.codec_options.CodecOptions` whose ``document_class`` + must be :class:`RawBSONDocument`. The default is + :attr:`DEFAULT_RAW_BSON_OPTIONS`. + + .. versionchanged:: 3.8 + :class:`RawBSONDocument` now validates that the ``bson_bytes`` + passed in represent a single bson document. + + .. versionchanged:: 3.5 + If a :class:`~bson.codec_options.CodecOptions` is passed in, its + `document_class` must be :class:`RawBSONDocument`. + """ + self.__raw = bson_bytes + self.__inflated_doc = None + # Can't default codec_options to DEFAULT_RAW_BSON_OPTIONS in signature, + # it refers to this class RawBSONDocument. + if codec_options is None: + codec_options = DEFAULT_RAW_BSON_OPTIONS + elif codec_options.document_class is not RawBSONDocument: + raise TypeError( + "RawBSONDocument cannot use CodecOptions with document " + "class %s" % (codec_options.document_class, )) + self.__codec_options = codec_options + # Validate the bson object size. + _get_object_size(bson_bytes, 0, len(bson_bytes)) + + @property + def raw(self): + """The raw BSON bytes composing this document.""" + return self.__raw + + def items(self): + """Lazily decode and iterate elements in this document.""" + return iteritems(self.__inflated) + + @property + def __inflated(self): + if self.__inflated_doc is None: + # We already validated the object's size when this document was + # created, so no need to do that again. + # Use SON to preserve ordering of elements. + self.__inflated_doc = _elements_to_dict( + self.__raw, 4, len(self.__raw)-1, self.__codec_options, SON()) + return self.__inflated_doc + + def __getitem__(self, item): + return self.__inflated[item] + + def __iter__(self): + return iter(self.__inflated) + + def __len__(self): + return len(self.__inflated) + + def __eq__(self, other): + if isinstance(other, RawBSONDocument): + return self.__raw == other.raw + return NotImplemented + + def __repr__(self): + return ("RawBSONDocument(%r, codec_options=%r)" + % (self.raw, self.__codec_options)) + + +DEFAULT_RAW_BSON_OPTIONS = DEFAULT.with_options(document_class=RawBSONDocument) +"""The default :class:`~bson.codec_options.CodecOptions` for +:class:`RawBSONDocument`. +""" diff --git a/mongo_mac/lib/python3.6/site-packages/bson/regex.py b/mongo_mac/lib/python3.6/site-packages/bson/regex.py new file mode 100644 index 0000000..f9d39ad --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/bson/regex.py @@ -0,0 +1,128 @@ +# Copyright 2013-present MongoDB, Inc. +# +# 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. + +"""Tools for representing MongoDB regular expressions. +""" + +import re + +from bson.son import RE_TYPE +from bson.py3compat import string_type, text_type + + +def str_flags_to_int(str_flags): + flags = 0 + if "i" in str_flags: + flags |= re.IGNORECASE + if "l" in str_flags: + flags |= re.LOCALE + if "m" in str_flags: + flags |= re.MULTILINE + if "s" in str_flags: + flags |= re.DOTALL + if "u" in str_flags: + flags |= re.UNICODE + if "x" in str_flags: + flags |= re.VERBOSE + + return flags + + +class Regex(object): + """BSON regular expression data.""" + _type_marker = 11 + + @classmethod + def from_native(cls, regex): + """Convert a Python regular expression into a ``Regex`` instance. + + Note that in Python 3, a regular expression compiled from a + :class:`str` has the ``re.UNICODE`` flag set. If it is undesirable + to store this flag in a BSON regular expression, unset it first:: + + >>> pattern = re.compile('.*') + >>> regex = Regex.from_native(pattern) + >>> regex.flags ^= re.UNICODE + >>> db.collection.insert({'pattern': regex}) + + :Parameters: + - `regex`: A regular expression object from ``re.compile()``. + + .. warning:: + Python regular expressions use a different syntax and different + set of flags than MongoDB, which uses `PCRE`_. A regular + expression retrieved from the server may not compile in + Python, or may match a different set of strings in Python than + when used in a MongoDB query. + + .. _PCRE: http://www.pcre.org/ + """ + if not isinstance(regex, RE_TYPE): + raise TypeError( + "regex must be a compiled regular expression, not %s" + % type(regex)) + + return Regex(regex.pattern, regex.flags) + + def __init__(self, pattern, flags=0): + """BSON regular expression data. + + This class is useful to store and retrieve regular expressions that are + incompatible with Python's regular expression dialect. + + :Parameters: + - `pattern`: string + - `flags`: (optional) an integer bitmask, or a string of flag + characters like "im" for IGNORECASE and MULTILINE + """ + if not isinstance(pattern, (text_type, bytes)): + raise TypeError("pattern must be a string, not %s" % type(pattern)) + self.pattern = pattern + + if isinstance(flags, string_type): + self.flags = str_flags_to_int(flags) + elif isinstance(flags, int): + self.flags = flags + else: + raise TypeError( + "flags must be a string or int, not %s" % type(flags)) + + def __eq__(self, other): + if isinstance(other, Regex): + return self.pattern == other.pattern and self.flags == other.flags + else: + return NotImplemented + + __hash__ = None + + def __ne__(self, other): + return not self == other + + def __repr__(self): + return "Regex(%r, %r)" % (self.pattern, self.flags) + + def try_compile(self): + """Compile this :class:`Regex` as a Python regular expression. + + .. warning:: + Python regular expressions use a different syntax and different + set of flags than MongoDB, which uses `PCRE`_. A regular + expression retrieved from the server may not compile in + Python, or may match a different set of strings in Python than + when used in a MongoDB query. :meth:`try_compile()` may raise + :exc:`re.error`. + + .. _PCRE: http://www.pcre.org/ + """ + return re.compile(self.pattern, self.flags) diff --git a/mongo_mac/lib/python3.6/site-packages/bson/son.py b/mongo_mac/lib/python3.6/site-packages/bson/son.py new file mode 100644 index 0000000..701cb23 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/bson/son.py @@ -0,0 +1,200 @@ +# Copyright 2009-present MongoDB, Inc. +# +# 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. + +"""Tools for creating and manipulating SON, the Serialized Ocument Notation. + +Regular dictionaries can be used instead of SON objects, but not when the order +of keys is important. A SON object can be used just like a normal Python +dictionary.""" + +import copy +import re + +from bson.py3compat import abc, iteritems + + +# This sort of sucks, but seems to be as good as it gets... +# This is essentially the same as re._pattern_type +RE_TYPE = type(re.compile("")) + + +class SON(dict): + """SON data. + + A subclass of dict that maintains ordering of keys and provides a + few extra niceties for dealing with SON. SON provides an API + similar to collections.OrderedDict from Python 2.7+. + """ + + def __init__(self, data=None, **kwargs): + self.__keys = [] + dict.__init__(self) + self.update(data) + self.update(kwargs) + + def __new__(cls, *args, **kwargs): + instance = super(SON, cls).__new__(cls, *args, **kwargs) + instance.__keys = [] + return instance + + def __repr__(self): + result = [] + for key in self.__keys: + result.append("(%r, %r)" % (key, self[key])) + return "SON([%s])" % ", ".join(result) + + def __setitem__(self, key, value): + if key not in self.__keys: + self.__keys.append(key) + dict.__setitem__(self, key, value) + + def __delitem__(self, key): + self.__keys.remove(key) + dict.__delitem__(self, key) + + def keys(self): + return list(self.__keys) + + def copy(self): + other = SON() + other.update(self) + return other + + # TODO this is all from UserDict.DictMixin. it could probably be made more + # efficient. + # second level definitions support higher levels + def __iter__(self): + for k in self.__keys: + yield k + + def has_key(self, key): + return key in self.__keys + + # third level takes advantage of second level definitions + def iteritems(self): + for k in self: + yield (k, self[k]) + + def iterkeys(self): + return self.__iter__() + + # fourth level uses definitions from lower levels + def itervalues(self): + for _, v in self.iteritems(): + yield v + + def values(self): + return [v for _, v in self.iteritems()] + + def items(self): + return [(key, self[key]) for key in self] + + def clear(self): + self.__keys = [] + super(SON, self).clear() + + def setdefault(self, key, default=None): + try: + return self[key] + except KeyError: + self[key] = default + return default + + def pop(self, key, *args): + if len(args) > 1: + raise TypeError("pop expected at most 2 arguments, got "\ + + repr(1 + len(args))) + try: + value = self[key] + except KeyError: + if args: + return args[0] + raise + del self[key] + return value + + def popitem(self): + try: + k, v = next(self.iteritems()) + except StopIteration: + raise KeyError('container is empty') + del self[k] + return (k, v) + + def update(self, other=None, **kwargs): + # Make progressively weaker assumptions about "other" + if other is None: + pass + elif hasattr(other, 'iteritems'): # iteritems saves memory and lookups + for k, v in other.iteritems(): + self[k] = v + elif hasattr(other, 'keys'): + for k in other.keys(): + self[k] = other[k] + else: + for k, v in other: + self[k] = v + if kwargs: + self.update(kwargs) + + def get(self, key, default=None): + try: + return self[key] + except KeyError: + return default + + def __eq__(self, other): + """Comparison to another SON is order-sensitive while comparison to a + regular dictionary is order-insensitive. + """ + if isinstance(other, SON): + return len(self) == len(other) and self.items() == other.items() + return self.to_dict() == other + + def __ne__(self, other): + return not self == other + + def __len__(self): + return len(self.__keys) + + def to_dict(self): + """Convert a SON document to a normal Python dictionary instance. + + This is trickier than just *dict(...)* because it needs to be + recursive. + """ + + def transform_value(value): + if isinstance(value, list): + return [transform_value(v) for v in value] + elif isinstance(value, abc.Mapping): + return dict([ + (k, transform_value(v)) + for k, v in iteritems(value)]) + else: + return value + + return transform_value(dict(self)) + + def __deepcopy__(self, memo): + out = SON() + val_id = id(self) + if val_id in memo: + return memo.get(val_id) + memo[val_id] = out + for k, v in self.iteritems(): + if not isinstance(v, RE_TYPE): + v = copy.deepcopy(v, memo) + out[k] = v + return out diff --git a/mongo_mac/lib/python3.6/site-packages/bson/timestamp.py b/mongo_mac/lib/python3.6/site-packages/bson/timestamp.py new file mode 100644 index 0000000..7ea7551 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/bson/timestamp.py @@ -0,0 +1,120 @@ +# Copyright 2010-2015 MongoDB, Inc. +# +# 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. + +"""Tools for representing MongoDB internal Timestamps. +""" + +import calendar +import datetime + +from bson.py3compat import integer_types +from bson.tz_util import utc + +UPPERBOUND = 4294967296 + + +class Timestamp(object): + """MongoDB internal timestamps used in the opLog. + """ + + _type_marker = 17 + + def __init__(self, time, inc): + """Create a new :class:`Timestamp`. + + This class is only for use with the MongoDB opLog. If you need + to store a regular timestamp, please use a + :class:`~datetime.datetime`. + + Raises :class:`TypeError` if `time` is not an instance of + :class: `int` or :class:`~datetime.datetime`, or `inc` is not + an instance of :class:`int`. Raises :class:`ValueError` if + `time` or `inc` is not in [0, 2**32). + + :Parameters: + - `time`: time in seconds since epoch UTC, or a naive UTC + :class:`~datetime.datetime`, or an aware + :class:`~datetime.datetime` + - `inc`: the incrementing counter + """ + if isinstance(time, datetime.datetime): + if time.utcoffset() is not None: + time = time - time.utcoffset() + time = int(calendar.timegm(time.timetuple())) + if not isinstance(time, integer_types): + raise TypeError("time must be an instance of int") + if not isinstance(inc, integer_types): + raise TypeError("inc must be an instance of int") + if not 0 <= time < UPPERBOUND: + raise ValueError("time must be contained in [0, 2**32)") + if not 0 <= inc < UPPERBOUND: + raise ValueError("inc must be contained in [0, 2**32)") + + self.__time = time + self.__inc = inc + + @property + def time(self): + """Get the time portion of this :class:`Timestamp`. + """ + return self.__time + + @property + def inc(self): + """Get the inc portion of this :class:`Timestamp`. + """ + return self.__inc + + def __eq__(self, other): + if isinstance(other, Timestamp): + return (self.__time == other.time and self.__inc == other.inc) + else: + return NotImplemented + + def __hash__(self): + return hash(self.time) ^ hash(self.inc) + + def __ne__(self, other): + return not self == other + + def __lt__(self, other): + if isinstance(other, Timestamp): + return (self.time, self.inc) < (other.time, other.inc) + return NotImplemented + + def __le__(self, other): + if isinstance(other, Timestamp): + return (self.time, self.inc) <= (other.time, other.inc) + return NotImplemented + + def __gt__(self, other): + if isinstance(other, Timestamp): + return (self.time, self.inc) > (other.time, other.inc) + return NotImplemented + + def __ge__(self, other): + if isinstance(other, Timestamp): + return (self.time, self.inc) >= (other.time, other.inc) + return NotImplemented + + def __repr__(self): + return "Timestamp(%s, %s)" % (self.__time, self.__inc) + + def as_datetime(self): + """Return a :class:`~datetime.datetime` instance corresponding + to the time portion of this :class:`Timestamp`. + + The returned datetime's timezone is UTC. + """ + return datetime.datetime.fromtimestamp(self.__time, utc) diff --git a/mongo_mac/lib/python3.6/site-packages/bson/tz_util.py b/mongo_mac/lib/python3.6/site-packages/bson/tz_util.py new file mode 100644 index 0000000..6ec918f --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/bson/tz_util.py @@ -0,0 +1,52 @@ +# Copyright 2010-2015 MongoDB, Inc. +# +# 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. + +"""Timezone related utilities for BSON.""" + +from datetime import (timedelta, + tzinfo) + +ZERO = timedelta(0) + + +class FixedOffset(tzinfo): + """Fixed offset timezone, in minutes east from UTC. + + Implementation based from the Python `standard library documentation + `_. + Defining __getinitargs__ enables pickling / copying. + """ + + def __init__(self, offset, name): + if isinstance(offset, timedelta): + self.__offset = offset + else: + self.__offset = timedelta(minutes=offset) + self.__name = name + + def __getinitargs__(self): + return self.__offset, self.__name + + def utcoffset(self, dt): + return self.__offset + + def tzname(self, dt): + return self.__name + + def dst(self, dt): + return ZERO + + +utc = FixedOffset(0, "UTC") +"""Fixed offset timezone representing UTC.""" diff --git a/mongo_mac/lib/python3.6/site-packages/easy_install.py b/mongo_mac/lib/python3.6/site-packages/easy_install.py new file mode 100644 index 0000000..d87e984 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/easy_install.py @@ -0,0 +1,5 @@ +"""Run the EasyInstall command""" + +if __name__ == '__main__': + from setuptools.command.easy_install import main + main() diff --git a/mongo_mac/lib/python3.6/site-packages/gridfs/__init__.py b/mongo_mac/lib/python3.6/site-packages/gridfs/__init__.py new file mode 100644 index 0000000..6c56a60 --- /dev/null +++ b/mongo_mac/lib/python3.6/site-packages/gridfs/__init__.py @@ -0,0 +1,930 @@ +# Copyright 2009-present MongoDB, Inc. +# +# 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. + +"""GridFS is a specification for storing large objects in Mongo. + +The :mod:`gridfs` package is an implementation of GridFS on top of +:mod:`pymongo`, exposing a file-like interface. + +.. mongodoc:: gridfs +""" + +from bson.py3compat import abc +from gridfs.errors import NoFile +from gridfs.grid_file import (GridIn, + GridOut, + GridOutCursor, + DEFAULT_CHUNK_SIZE, + _clear_entity_type_registry) +from pymongo import (ASCENDING, + DESCENDING) +from pymongo.common import UNAUTHORIZED_CODES, validate_string +from pymongo.database import Database +from pymongo.errors import ConfigurationError, OperationFailure + + +class GridFS(object): + """An instance of GridFS on top of a single Database. + """ + def __init__(self, database, collection="fs", disable_md5=False): + """Create a new instance of :class:`GridFS`. + + Raises :class:`TypeError` if `database` is not an instance of + :class:`~pymongo.database.Database`. + + :Parameters: + - `database`: database to use + - `collection` (optional): root collection to use + - `disable_md5` (optional): When True, MD5 checksums will not be + computed for uploaded files. Useful in environments where MD5 + cannot be used for regulatory or other reasons. Defaults to False. + + .. versionchanged:: 3.1 + Indexes are only ensured on the first write to the DB. + + .. versionchanged:: 3.0 + `database` must use an acknowledged + :attr:`~pymongo.database.Database.write_concern` + + .. mongodoc:: gridfs + """ + if not isinstance(database, Database): + raise TypeError("database must be an instance of Database") + + database = _clear_entity_type_registry(database) + + if not database.write_concern.acknowledged: + raise ConfigurationError('database must use ' + 'acknowledged write_concern') + + self.__database = database + self.__collection = database[collection] + self.__files = self.__collection.files + self.__chunks = self.__collection.chunks + self.__disable_md5 = disable_md5 + + def new_file(self, **kwargs): + """Create a new file in GridFS. + + Returns a new :class:`~gridfs.grid_file.GridIn` instance to + which data can be written. Any keyword arguments will be + passed through to :meth:`~gridfs.grid_file.GridIn`. + + If the ``"_id"`` of the file is manually specified, it must + not already exist in GridFS. Otherwise + :class:`~gridfs.errors.FileExists` is raised. + + :Parameters: + - `**kwargs` (optional): keyword arguments for file creation + """ + # No need for __ensure_index_files_id() here; GridIn ensures + # the (files_id, n) index when needed. + return GridIn( + self.__collection, disable_md5=self.__disable_md5, **kwargs) + + def put(self, data, **kwargs): + """Put data in GridFS as a new file. + + Equivalent to doing:: + + try: + f = new_file(**kwargs) + f.write(data) + finally: + f.close() + + `data` can be either an instance of :class:`str` (:class:`bytes` + in python 3) or a file-like object providing a :meth:`read` method. + If an `encoding` keyword argument is passed, `data` can also be a + :class:`unicode` (:class:`str` in python 3) instance, which will + be encoded as `encoding` before being written. Any keyword arguments + will be passed through to the created file - see + :meth:`~gridfs.grid_file.GridIn` for possible arguments. Returns the + ``"_id"`` of the created file. + + If the ``"_id"`` of the file is manually specified, it must + not already exist in GridFS. Otherwise + :class:`~gridfs.errors.FileExists` is raised. + + :Parameters: + - `data`: data to be written as a file. + - `**kwargs` (optional): keyword arguments for file creation + + .. versionchanged:: 3.0 + w=0 writes to GridFS are now prohibited. + """ + grid_file = GridIn( + self.__collection, disable_md5=self.__disable_md5, **kwargs) + try: + grid_file.write(data) + finally: + grid_file.close() + + return grid_file._id + + def get(self, file_id, session=None): + """Get a file from GridFS by ``"_id"``. + + Returns an instance of :class:`~gridfs.grid_file.GridOut`, + which provides a file-like interface for reading. + + :Parameters: + - `file_id`: ``"_id"`` of the file to get + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + gout = GridOut(self.__collection, file_id, session=session) + + # Raise NoFile now, instead of on first attribute access. + gout._ensure_file() + return gout + + def get_version(self, filename=None, version=-1, session=None, **kwargs): + """Get a file from GridFS by ``"filename"`` or metadata fields. + + Returns a version of the file in GridFS whose filename matches + `filename` and whose metadata fields match the supplied keyword + arguments, as an instance of :class:`~gridfs.grid_file.GridOut`. + + Version numbering is a convenience atop the GridFS API provided + by MongoDB. If more than one file matches the query (either by + `filename` alone, by metadata fields, or by a combination of + both), then version ``-1`` will be the most recently uploaded + matching file, ``-2`` the second most recently + uploaded, etc. Version ``0`` will be the first version + uploaded, ``1`` the second version, etc. So if three versions + have been uploaded, then version ``0`` is the same as version + ``-3``, version ``1`` is the same as version ``-2``, and + version ``2`` is the same as version ``-1``. + + Raises :class:`~gridfs.errors.NoFile` if no such version of + that file exists. + + :Parameters: + - `filename`: ``"filename"`` of the file to get, or `None` + - `version` (optional): version of the file to get (defaults + to -1, the most recent version uploaded) + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` + - `**kwargs` (optional): find files by custom metadata. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.1 + ``get_version`` no longer ensures indexes. + """ + query = kwargs + if filename is not None: + query["filename"] = filename + + cursor = self.__files.find(query, session=session) + if version < 0: + skip = abs(version) - 1 + cursor.limit(-1).skip(skip).sort("uploadDate", DESCENDING) + else: + cursor.limit(-1).skip(version).sort("uploadDate", ASCENDING) + try: + doc = next(cursor) + return GridOut( + self.__collection, file_document=doc, session=session) + except StopIteration: + raise NoFile("no version %d for filename %r" % (version, filename)) + + def get_last_version(self, filename=None, session=None, **kwargs): + """Get the most recent version of a file in GridFS by ``"filename"`` + or metadata fields. + + Equivalent to calling :meth:`get_version` with the default + `version` (``-1``). + + :Parameters: + - `filename`: ``"filename"`` of the file to get, or `None` + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` + - `**kwargs` (optional): find files by custom metadata. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + return self.get_version(filename=filename, session=session, **kwargs) + + # TODO add optional safe mode for chunk removal? + def delete(self, file_id, session=None): + """Delete a file from GridFS by ``"_id"``. + + Deletes all data belonging to the file with ``"_id"``: + `file_id`. + + .. warning:: Any processes/threads reading from the file while + this method is executing will likely see an invalid/corrupt + file. Care should be taken to avoid concurrent reads to a file + while it is being deleted. + + .. note:: Deletes of non-existent files are considered successful + since the end result is the same: no file with that _id remains. + + :Parameters: + - `file_id`: ``"_id"`` of the file to delete + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.1 + ``delete`` no longer ensures indexes. + """ + self.__files.delete_one({"_id": file_id}, session=session) + self.__chunks.delete_many({"files_id": file_id}, session=session) + + def list(self, session=None): + """List the names of all files stored in this instance of + :class:`GridFS`. + + :Parameters: + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` + + .. versionchanged:: 3.6 + Added ``session`` parameter. + + .. versionchanged:: 3.1 + ``list`` no longer ensures indexes. + """ + # With an index, distinct includes documents with no filename + # as None. + return [ + name for name in self.__files.distinct("filename", session=session) + if name is not None] + + def find_one(self, filter=None, session=None, *args, **kwargs): + """Get a single file from gridfs. + + All arguments to :meth:`find` are also valid arguments for + :meth:`find_one`, although any `limit` argument will be + ignored. Returns a single :class:`~gridfs.grid_file.GridOut`, + or ``None`` if no matching file is found. For example:: + + file = fs.find_one({"filename": "lisa.txt"}) + + :Parameters: + - `filter` (optional): a dictionary specifying + the query to be performing OR any other type to be used as + the value for a query for ``"_id"`` in the file collection. + - `*args` (optional): any additional positional arguments are + the same as the arguments to :meth:`find`. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` + - `**kwargs` (optional): any additional keyword arguments + are the same as the arguments to :meth:`find`. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + if filter is not None and not isinstance(filter, abc.Mapping): + filter = {"_id": filter} + + for f in self.find(filter, *args, session=session, **kwargs): + return f + + return None + + def find(self, *args, **kwargs): + """Query GridFS for files. + + Returns a cursor that iterates across files matching + arbitrary queries on the files collection. Can be combined + with other modifiers for additional control. For example:: + + for grid_out in fs.find({"filename": "lisa.txt"}, + no_cursor_timeout=True): + data = grid_out.read() + + would iterate through all versions of "lisa.txt" stored in GridFS. + Note that setting no_cursor_timeout to True may be important to + prevent the cursor from timing out during long multi-file processing + work. + + As another example, the call:: + + most_recent_three = fs.find().sort("uploadDate", -1).limit(3) + + would return a cursor to the three most recently uploaded files + in GridFS. + + Follows a similar interface to + :meth:`~pymongo.collection.Collection.find` + in :class:`~pymongo.collection.Collection`. + + If a :class:`~pymongo.client_session.ClientSession` is passed to + :meth:`find`, all returned :class:`~gridfs.grid_file.GridOut` instances + are associated with that session. + + :Parameters: + - `filter` (optional): a SON object specifying elements which + must be present for a document to be included in the + result set + - `skip` (optional): the number of files to omit (from + the start of the result set) when returning the results + - `limit` (optional): the maximum number of results to + return + - `no_cursor_timeout` (optional): if False (the default), any + returned cursor is closed by the server after 10 minutes of + inactivity. If set to True, the returned cursor will never + time out on the server. Care should be taken to ensure that + cursors with no_cursor_timeout turned on are properly closed. + - `sort` (optional): a list of (key, direction) pairs + specifying the sort order for this query. See + :meth:`~pymongo.cursor.Cursor.sort` for details. + + Raises :class:`TypeError` if any of the arguments are of + improper type. Returns an instance of + :class:`~gridfs.grid_file.GridOutCursor` + corresponding to this query. + + .. versionchanged:: 3.0 + Removed the read_preference, tag_sets, and + secondary_acceptable_latency_ms options. + .. versionadded:: 2.7 + .. mongodoc:: find + """ + return GridOutCursor(self.__collection, *args, **kwargs) + + def exists(self, document_or_id=None, session=None, **kwargs): + """Check if a file exists in this instance of :class:`GridFS`. + + The file to check for can be specified by the value of its + ``_id`` key, or by passing in a query document. A query + document can be passed in as dictionary, or by using keyword + arguments. Thus, the following three calls are equivalent: + + >>> fs.exists(file_id) + >>> fs.exists({"_id": file_id}) + >>> fs.exists(_id=file_id) + + As are the following two calls: + + >>> fs.exists({"filename": "mike.txt"}) + >>> fs.exists(filename="mike.txt") + + And the following two: + + >>> fs.exists({"foo": {"$gt": 12}}) + >>> fs.exists(foo={"$gt": 12}) + + Returns ``True`` if a matching file exists, ``False`` + otherwise. Calls to :meth:`exists` will not automatically + create appropriate indexes; application developers should be + sure to create indexes if needed and as appropriate. + + :Parameters: + - `document_or_id` (optional): query document, or _id of the + document to check for + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` + - `**kwargs` (optional): keyword arguments are used as a + query document, if they're present. + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + if kwargs: + f = self.__files.find_one(kwargs, ["_id"], session=session) + else: + f = self.__files.find_one(document_or_id, ["_id"], session=session) + + return f is not None + + +class GridFSBucket(object): + """An instance of GridFS on top of a single Database.""" + + def __init__(self, db, bucket_name="fs", + chunk_size_bytes=DEFAULT_CHUNK_SIZE, write_concern=None, + read_preference=None, disable_md5=False): + """Create a new instance of :class:`GridFSBucket`. + + Raises :exc:`TypeError` if `database` is not an instance of + :class:`~pymongo.database.Database`. + + Raises :exc:`~pymongo.errors.ConfigurationError` if `write_concern` + is not acknowledged. + + :Parameters: + - `database`: database to use. + - `bucket_name` (optional): The name of the bucket. Defaults to 'fs'. + - `chunk_size_bytes` (optional): The chunk size in bytes. Defaults + to 255KB. + - `write_concern` (optional): The + :class:`~pymongo.write_concern.WriteConcern` to use. If ``None`` + (the default) db.write_concern is used. + - `read_preference` (optional): The read preference to use. If + ``None`` (the default) db.read_preference is used. + - `disable_md5` (optional): When True, MD5 checksums will not be + computed for uploaded files. Useful in environments where MD5 + cannot be used for regulatory or other reasons. Defaults to False. + + .. versionadded:: 3.1 + + .. mongodoc:: gridfs + """ + if not isinstance(db, Database): + raise TypeError("database must be an instance of Database") + + db = _clear_entity_type_registry(db) + + wtc = write_concern if write_concern is not None else db.write_concern + if not wtc.acknowledged: + raise ConfigurationError('write concern must be acknowledged') + + self._db = db + self._bucket_name = bucket_name + self._collection = db[bucket_name] + self._disable_md5 = disable_md5 + + self._chunks = self._collection.chunks.with_options( + write_concern=write_concern, + read_preference=read_preference) + + self._files = self._collection.files.with_options( + write_concern=write_concern, + read_preference=read_preference) + + self._chunk_size_bytes = chunk_size_bytes + + def open_upload_stream(self, filename, chunk_size_bytes=None, + metadata=None, session=None): + """Opens a Stream that the application can write the contents of the + file to. + + The user must specify the filename, and can choose to add any + additional information in the metadata field of the file document or + modify the chunk size. + For example:: + + my_db = MongoClient().test + fs = GridFSBucket(my_db) + grid_in = fs.open_upload_stream( + "test_file", chunk_size_bytes=4, + metadata={"contentType": "text/plain"}) + grid_in.write("data I want to store!") + grid_in.close() # uploaded on close + + Returns an instance of :class:`~gridfs.grid_file.GridIn`. + + Raises :exc:`~gridfs.errors.NoFile` if no such version of + that file exists. + Raises :exc:`~ValueError` if `filename` is not a string. + + :Parameters: + - `filename`: The name of the file to upload. + - `chunk_size_bytes` (options): The number of bytes per chunk of this + file. Defaults to the chunk_size_bytes in :class:`GridFSBucket`. + - `metadata` (optional): User data for the 'metadata' field of the + files collection document. If not provided the metadata field will + be omitted from the files collection document. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + validate_string("filename", filename) + + opts = {"filename": filename, + "chunk_size": (chunk_size_bytes if chunk_size_bytes + is not None else self._chunk_size_bytes)} + if metadata is not None: + opts["metadata"] = metadata + + return GridIn( + self._collection, + session=session, + disable_md5=self._disable_md5, + **opts) + + def open_upload_stream_with_id( + self, file_id, filename, chunk_size_bytes=None, metadata=None, + session=None): + """Opens a Stream that the application can write the contents of the + file to. + + The user must specify the file id and filename, and can choose to add + any additional information in the metadata field of the file document + or modify the chunk size. + For example:: + + my_db = MongoClient().test + fs = GridFSBucket(my_db) + grid_in = fs.open_upload_stream_with_id( + ObjectId(), + "test_file", + chunk_size_bytes=4, + metadata={"contentType": "text/plain"}) + grid_in.write("data I want to store!") + grid_in.close() # uploaded on close + + Returns an instance of :class:`~gridfs.grid_file.GridIn`. + + Raises :exc:`~gridfs.errors.NoFile` if no such version of + that file exists. + Raises :exc:`~ValueError` if `filename` is not a string. + + :Parameters: + - `file_id`: The id to use for this file. The id must not have + already been used for another file. + - `filename`: The name of the file to upload. + - `chunk_size_bytes` (options): The number of bytes per chunk of this + file. Defaults to the chunk_size_bytes in :class:`GridFSBucket`. + - `metadata` (optional): User data for the 'metadata' field of the + files collection document. If not provided the metadata field will + be omitted from the files collection document. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + validate_string("filename", filename) + + opts = {"_id": file_id, + "filename": filename, + "chunk_size": (chunk_size_bytes if chunk_size_bytes + is not None else self._chunk_size_bytes)} + if metadata is not None: + opts["metadata"] = metadata + + return GridIn( + self._collection, + session=session, + disable_md5=self._disable_md5, + **opts) + + def upload_from_stream(self, filename, source, chunk_size_bytes=None, + metadata=None, session=None): + """Uploads a user file to a GridFS bucket. + + Reads the contents of the user file from `source` and uploads + it to the file `filename`. Source can be a string or file-like object. + For example:: + + my_db = MongoClient().test + fs = GridFSBucket(my_db) + file_id = fs.upload_from_stream( + "test_file", + "data I want to store!", + chunk_size_bytes=4, + metadata={"contentType": "text/plain"}) + + Returns the _id of the uploaded file. + + Raises :exc:`~gridfs.errors.NoFile` if no such version of + that file exists. + Raises :exc:`~ValueError` if `filename` is not a string. + + :Parameters: + - `filename`: The name of the file to upload. + - `source`: The source stream of the content to be uploaded. Must be + a file-like object that implements :meth:`read` or a string. + - `chunk_size_bytes` (options): The number of bytes per chunk of this + file. Defaults to the chunk_size_bytes of :class:`GridFSBucket`. + - `metadata` (optional): User data for the 'metadata' field of the + files collection document. If not provided the metadata field will + be omitted from the files collection document. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + with self.open_upload_stream( + filename, chunk_size_bytes, metadata, session=session) as gin: + gin.write(source) + + return gin._id + + def upload_from_stream_with_id(self, file_id, filename, source, + chunk_size_bytes=None, metadata=None, + session=None): + """Uploads a user file to a GridFS bucket with a custom file id. + + Reads the contents of the user file from `source` and uploads + it to the file `filename`. Source can be a string or file-like object. + For example:: + + my_db = MongoClient().test + fs = GridFSBucket(my_db) + file_id = fs.upload_from_stream( + ObjectId(), + "test_file", + "data I want to store!", + chunk_size_bytes=4, + metadata={"contentType": "text/plain"}) + + Raises :exc:`~gridfs.errors.NoFile` if no such version of + that file exists. + Raises :exc:`~ValueError` if `filename` is not a string. + + :Parameters: + - `file_id`: The id to use for this file. The id must not have + already been used for another file. + - `filename`: The name of the file to upload. + - `source`: The source stream of the content to be uploaded. Must be + a file-like object that implements :meth:`read` or a string. + - `chunk_size_bytes` (options): The number of bytes per chunk of this + file. Defaults to the chunk_size_bytes of :class:`GridFSBucket`. + - `metadata` (optional): User data for the 'metadata' field of the + files collection document. If not provided the metadata field will + be omitted from the files collection document. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + with self.open_upload_stream_with_id( + file_id, filename, chunk_size_bytes, metadata, + session=session) as gin: + gin.write(source) + + def open_download_stream(self, file_id, session=None): + """Opens a Stream from which the application can read the contents of + the stored file specified by file_id. + + For example:: + + my_db = MongoClient().test + fs = GridFSBucket(my_db) + # get _id of file to read. + file_id = fs.upload_from_stream("test_file", "data I want to store!") + grid_out = fs.open_download_stream(file_id) + contents = grid_out.read() + + Returns an instance of :class:`~gridfs.grid_file.GridOut`. + + Raises :exc:`~gridfs.errors.NoFile` if no file with file_id exists. + + :Parameters: + - `file_id`: The _id of the file to be downloaded. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + gout = GridOut(self._collection, file_id, session=session) + + # Raise NoFile now, instead of on first attribute access. + gout._ensure_file() + return gout + + def download_to_stream(self, file_id, destination, session=None): + """Downloads the contents of the stored file specified by file_id and + writes the contents to `destination`. + + For example:: + + my_db = MongoClient().test + fs = GridFSBucket(my_db) + # Get _id of file to read + file_id = fs.upload_from_stream("test_file", "data I want to store!") + # Get file to write to + file = open('myfile','wb+') + fs.download_to_stream(file_id, file) + file.seek(0) + contents = file.read() + + Raises :exc:`~gridfs.errors.NoFile` if no file with file_id exists. + + :Parameters: + - `file_id`: The _id of the file to be downloaded. + - `destination`: a file-like object implementing :meth:`write`. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + with self.open_download_stream(file_id, session=session) as gout: + for chunk in gout: + destination.write(chunk) + + def delete(self, file_id, session=None): + """Given an file_id, delete this stored file's files collection document + and associated chunks from a GridFS bucket. + + For example:: + + my_db = MongoClient().test + fs = GridFSBucket(my_db) + # Get _id of file to delete + file_id = fs.upload_from_stream("test_file", "data I want to store!") + fs.delete(file_id) + + Raises :exc:`~gridfs.errors.NoFile` if no file with file_id exists. + + :Parameters: + - `file_id`: The _id of the file to be deleted. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + res = self._files.delete_one({"_id": file_id}, session=session) + self._chunks.delete_many({"files_id": file_id}, session=session) + if not res.deleted_count: + raise NoFile( + "no file could be deleted because none matched %s" % file_id) + + def find(self, *args, **kwargs): + """Find and return the files collection documents that match ``filter`` + + Returns a cursor that iterates across files matching + arbitrary queries on the files collection. Can be combined + with other modifiers for additional control. + + For example:: + + for grid_data in fs.find({"filename": "lisa.txt"}, + no_cursor_timeout=True): + data = grid_data.read() + + would iterate through all versions of "lisa.txt" stored in GridFS. + Note that setting no_cursor_timeout to True may be important to + prevent the cursor from timing out during long multi-file processing + work. + + As another example, the call:: + + most_recent_three = fs.find().sort("uploadDate", -1).limit(3) + + would return a cursor to the three most recently uploaded files + in GridFS. + + Follows a similar interface to + :meth:`~pymongo.collection.Collection.find` + in :class:`~pymongo.collection.Collection`. + + If a :class:`~pymongo.client_session.ClientSession` is passed to + :meth:`find`, all returned :class:`~gridfs.grid_file.GridOut` instances + are associated with that session. + + :Parameters: + - `filter`: Search query. + - `batch_size` (optional): The number of documents to return per + batch. + - `limit` (optional): The maximum number of documents to return. + - `no_cursor_timeout` (optional): The server normally times out idle + cursors after an inactivity period (10 minutes) to prevent excess + memory use. Set this option to True prevent that. + - `skip` (optional): The number of documents to skip before + returning. + - `sort` (optional): The order by which to sort results. Defaults to + None. + """ + return GridOutCursor(self._collection, *args, **kwargs) + + def open_download_stream_by_name(self, filename, revision=-1, session=None): + """Opens a Stream from which the application can read the contents of + `filename` and optional `revision`. + + For example:: + + my_db = MongoClient().test + fs = GridFSBucket(my_db) + grid_out = fs.open_download_stream_by_name("test_file") + contents = grid_out.read() + + Returns an instance of :class:`~gridfs.grid_file.GridOut`. + + Raises :exc:`~gridfs.errors.NoFile` if no such version of + that file exists. + + Raises :exc:`~ValueError` filename is not a string. + + :Parameters: + - `filename`: The name of the file to read from. + - `revision` (optional): Which revision (documents with the same + filename and different uploadDate) of the file to retrieve. + Defaults to -1 (the most recent revision). + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` + + :Note: Revision numbers are defined as follows: + + - 0 = the original stored file + - 1 = the first revision + - 2 = the second revision + - etc... + - -2 = the second most recent revision + - -1 = the most recent revision + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + validate_string("filename", filename) + + query = {"filename": filename} + + cursor = self._files.find(query, session=session) + if revision < 0: + skip = abs(revision) - 1 + cursor.limit(-1).skip(skip).sort("uploadDate", DESCENDING) + else: + cursor.limit(-1).skip(revision).sort("uploadDate", ASCENDING) + try: + grid_file = next(cursor) + return GridOut( + self._collection, file_document=grid_file, session=session) + except StopIteration: + raise NoFile( + "no version %d for filename %r" % (revision, filename)) + + def download_to_stream_by_name(self, filename, destination, revision=-1, + session=None): + """Write the contents of `filename` (with optional `revision`) to + `destination`. + + For example:: + + my_db = MongoClient().test + fs = GridFSBucket(my_db) + # Get file to write to + file = open('myfile','wb') + fs.download_to_stream_by_name("test_file", file) + + Raises :exc:`~gridfs.errors.NoFile` if no such version of + that file exists. + + Raises :exc:`~ValueError` if `filename` is not a string. + + :Parameters: + - `filename`: The name of the file to read from. + - `destination`: A file-like object that implements :meth:`write`. + - `revision` (optional): Which revision (documents with the same + filename and different uploadDate) of the file to retrieve. + Defaults to -1 (the most recent revision). + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` + + :Note: Revision numbers are defined as follows: + + - 0 = the original stored file + - 1 = the first revision + - 2 = the second revision + - etc... + - -2 = the second most recent revision + - -1 = the most recent revision + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + with self.open_download_stream_by_name( + filename, revision, session=session) as gout: + for chunk in gout: + destination.write(chunk) + + def rename(self, file_id, new_filename, session=None): + """Renames the stored file with the specified file_id. + + For example:: + + my_db = MongoClient().test + fs = GridFSBucket(my_db) + # Get _id of file to rename + file_id = fs.upload_from_stream("test_file", "data I want to store!") + fs.rename(file_id, "new_test_name") + + Raises :exc:`~gridfs.errors.NoFile` if no file with file_id exists. + + :Parameters: + - `file_id`: The _id of the file to be renamed. + - `new_filename`: The new name of the file. + - `session` (optional): a + :class:`~pymongo.client_session.ClientSession` + + .. versionchanged:: 3.6 + Added ``session`` parameter. + """ + result = self._files.update_one({"_id": file_id}, + {"$set": {"filename": new_filename}}, + session=session) + if not result.matched_count: + raise NoFile("no files could be renamed %r because none " + "matched file_id %i" % (new_filename, file_id)) diff --git a/mongo_mac/lib/python3.6/site-packages/gridfs/__pycache__/__init__.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/gridfs/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8aca3c3f4b2e53ae91d29c12e1d2ce536858a90 GIT binary patch literal 34125 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 V^3(!kg8BSHapBK$f0p~@{{!?FhwlIY literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/gridfs/__pycache__/errors.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/gridfs/__pycache__/errors.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fac74f21339d9fedac787db495e78a08adbacfaf GIT binary patch literal 1106 zcmb7@J#*7A7{}$8B(9Uv4h#$oS{O1Urq^;n;J6-K+KC)TJNdX%6iZHgu`O3p(l`SP zd=OSX3Ev?r6CVL49@$MVLzl>>=k%8>KfmY2r-z6B-ygreU>Bj^XlH;%=P=bZ7=}W` zEM})xW{0+gE)jE>`yDZt+uxkf0o`Ct&`s`uc0sq82imK21M~s&LHm_%vi23~cGmsj zD&mDsM6R%;iQ)`TN~~ub4>G|9^)T+M=4bb$3kM7rno-G{GO{n>be_` zkep_mkd03WkS$WP?htabpy}O7ix4IvLVhCYf%D4zi-STYOR9OWq%w#_%D7ZPG!Jxo z5>Hl3cBWpE7ty4gpPa_)+bntxW10uoL6H=_Bv%@sdh&I?5XsFlD9X&l9n^UVxQSo& zi&8q^@v({92IEPLRax8DPO<&T-W1v#&b+@40|}q@t{iAVEna4=-2rg z<3!<%rjW&qGm|oD+DA5wX&Tcq<~}d=>cH&zV4lF-k{i7jd2=K#4Di`5u$E<#Pq7wQ za>{TlMFv6SBJc54qBPHS713U#Z6JHPLu&M1q`u)C8vknj>S5Xla5dlNThFM5t~4Q( z(30ljUc?wcy|PEC{r`n K?l{M;dHw^{wf_A8 literal 0 HcmV?d00001 diff --git a/mongo_mac/lib/python3.6/site-packages/gridfs/__pycache__/grid_file.cpython-36.pyc b/mongo_mac/lib/python3.6/site-packages/gridfs/__pycache__/grid_file.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5c8ce65c271b926dcd121a5a6933d033cefc31a GIT binary patch literal 26498 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